amends "@pkl.impl.ghactions/PklCI.pkl" import "@gha/Workflow.pkl" import "jobs/BuildJavaExecutableJob.pkl" import "jobs/BuildNativeJob.pkl" import "jobs/DeployJob.pkl" import "jobs/GithubRelease.pkl" import "jobs/GradleJob.pkl" import "jobs/PklJob.pkl" import "jobs/SimpleGradleJob.pkl" triggerDocsBuild = "both" testReports { junit { "**/build/test-results/**/*.xml" } html { "**/build/reports/tests/**/*" } excludeJobs { "bench" "github-release" Regex("deploy-.*") } } local baseGradleCheck: SimpleGradleJob = new { isRelease = false command = "check" fetchDepth = 0 } local gradleCheck = (baseGradleCheck) { os = "linux" } local gradleCheckWindows = (baseGradleCheck) { os = "windows" } local typealias PklJobs = Mapping local toWorkflowJobs: (PklJobs) -> Workflow.Jobs = (it) -> new Workflow.Jobs { for (k, v in it) { [k] = v.job } } local gradleCheckJobs: PklJobs = new { ["gradle-check"] = gradleCheck ["gradle-check-windows"] = gradleCheckWindows } local buildNativeJobs: Mapping = new { for (_dist in List("release", "snapshot")) { for (_project in List("pkl-cli", "pkl-doc")) { for (_arch in List("amd64", "aarch64")) { for (_os in List("macOS", "linux")) { ["\(_project)-\(_os)-\(_arch)-\(_dist)"] { arch = _arch os = _os isRelease = _dist == "release" project = _project } } } ["\(_project)-alpine-linux-amd64-\(_dist)"] { arch = "amd64" os = "linux" musl = true isRelease = _dist == "release" project = _project } ["\(_project)-windows-amd64-\(_dist)"] { arch = "amd64" os = "windows" isRelease = _dist == "release" project = _project } } } } local buildNativeSnapshots = buildNativeJobs.toMap().filter((key, _) -> key.endsWith("snapshot")) local buildNativeReleases = buildNativeJobs.toMap().filter((key, _) -> key.endsWith("release")) local benchmarkJob: SimpleGradleJob = new { command = "bench:jmh" } local gradleCompatibilityJob: SimpleGradleJob = new { command = ":pkl-gradle:build :pkl-gradle:compatibilityTestReleases" fetchDepth = 0 } local buildJavaExecutableJob: BuildJavaExecutableJob = new { fetchDepth = 0 } local buildAndTestJobs: PklJobs = new { ...gradleCheckJobs ["bench"] = benchmarkJob ["gradle-compatibility"] = gradleCompatibilityJob ["java-executables-snapshot"] = (buildJavaExecutableJob) { isRelease = false } ...buildNativeSnapshots } local releaseJobs: PklJobs = new { ...gradleCheckJobs ["bench"] = benchmarkJob ["gradle-compatibility"] = gradleCompatibilityJob ["java-executables-release"] = (buildJavaExecutableJob) { isRelease = true } ...buildNativeReleases } // By default, just run ./gradlew check on linux. // Trigger other checks based on GitHub PR description. Examples: // // * [windows] -- Test on Windows // * [native] -- Test all native builds // * [native-pkl-cli] -- Test all pkl-cli os/arch pairs // * [native-pkl-cli-macos] -- Test pkl-cli on macOS prb { local prbJobs: Mapping = new { ["gradle-check"] = gradleCheck ["gradle-check-windows"] = (gradleCheckWindows) { `if` = "contains(github.event.pull_request.body, '[windows]')" } for (jobName, job in buildNativeSnapshots) { [jobName] = (job) { local tags = new Listing { "[native]" "[native-\(job.project)]" "[native-\(job.project)-\(job.os)]" "[native-\(job.project)-\(job.os)-\(job.arch)]" "[native-\(job.project)-\(job.os)-\(job.arch)]" when (job.musl) { "[native-\(job.project)-alpine-\(job.os)-\(job.arch)]" } } `if` = tags .toList() .map((it) -> "contains(github.event.pull_request.body, '\(it)')") .join(" || ") } } } local prbJobs2 = (prbJobs) { [[true]] { // better SLA when not running on nightly nightlyMacOS = false } } jobs = prbJobs2 |> toWorkflowJobs } build { jobs = buildAndTestJobs |> toWorkflowJobs } main { jobs = (buildAndTestJobs) { ["deploy-snapshot"] = ( new DeployJob { extraGradleArgs { "--no-parallel" } command = "publishToSonatype" } ) { needs = buildAndTestJobs.keys.toListing() } } |> toWorkflowJobs } releaseBranch { jobs = releaseJobs |> toWorkflowJobs } release { jobs = (releaseJobs) { ["deploy-release"] = ( new DeployJob { isRelease = true command = "publishToSonatype closeAndReleaseSonatypeStagingRepository" } ) { needs = releaseJobs.keys.toListing() } ["github-release"] = new GithubRelease { needs = "deploy-release" } } |> toWorkflowJobs }