From c1a17a0e34b086130f903cd9bc19ca9eb605bd68 Mon Sep 17 00:00:00 2001 From: Piotr Krzeminski Date: Mon, 8 Jun 2026 22:44:01 +0200 Subject: [PATCH] test(library): add util for listing hosted runner labels --- .../domain/GithubHostedRunnerLabelsListing.kt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 github-workflows-kt/src/test/kotlin/io/github/typesafegithub/workflows/domain/GithubHostedRunnerLabelsListing.kt diff --git a/github-workflows-kt/src/test/kotlin/io/github/typesafegithub/workflows/domain/GithubHostedRunnerLabelsListing.kt b/github-workflows-kt/src/test/kotlin/io/github/typesafegithub/workflows/domain/GithubHostedRunnerLabelsListing.kt new file mode 100644 index 0000000000..785102a195 --- /dev/null +++ b/github-workflows-kt/src/test/kotlin/io/github/typesafegithub/workflows/domain/GithubHostedRunnerLabelsListing.kt @@ -0,0 +1,27 @@ +package io.github.typesafegithub.workflows.domain + +import io.ktor.client.HttpClient +import io.ktor.client.request.get +import io.ktor.client.statement.bodyAsText + +/** + * Lists values allowed to be set in "runs-on" for a job, for GitHub-hosted runners. + */ +suspend fun listRunnerLabels(): List { + val html = HttpClient().get(GITHUB_RUNNER_LABELS_DOCS_URL).bodyAsText() + return parse(html) +} + +private const val GITHUB_RUNNER_LABELS_DOCS_URL: String = + "https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions" + +private fun parse(html: String): List = + RUNNER_LABEL_REGEX + .findAll(html) + .map { it.groupValues[1] } + .toList() + +private val RUNNER_LABEL_REGEX = + Regex( + """([^<]+)""", + )