diff --git a/.github-gen/velnor-workflow.toml b/.github-gen/velnor-workflow.toml new file mode 100644 index 0000000..11fab07 --- /dev/null +++ b/.github-gen/velnor-workflow.toml @@ -0,0 +1,20 @@ +schema = 1 + +[generator] +repository = "tailrocks/graphql-java-datetime" + +[workflow] +runners = "both" +automatic = "both" +default_dispatch_runner = "github" +automatic_lanes = "github" +github_runner = "ubuntu-24.04" +velnor_labels = ["self-hosted", "velnor-target-mvp"] +default_branch = "main" + +[policy] +exclude_workflows = ["publish-sonatype.yml"] + +[[static_files]] +file = ".github/workflows/publish-sonatype.yml" +source = ".github/workflows/publish-sonatype.yml" diff --git a/.github/actionlint.yaml b/.github/actionlint.yaml new file mode 100644 index 0000000..62587bd --- /dev/null +++ b/.github/actionlint.yaml @@ -0,0 +1,9 @@ +# Generated by velnor-workflow. Regenerate; do not hand-edit. +# Runner labels are derived from the generated workflow contract. +# The actionlint catalog can lag GitHub-hosted labels; keep this allowlist generated. + +self-hosted-runner: + labels: + - self-hosted + - ubuntu-24.04 + - velnor-target-mvp diff --git a/.github/ci/.github-actions-generator-state b/.github/ci/.github-actions-generator-state new file mode 100644 index 0000000..01b6379 --- /dev/null +++ b/.github/ci/.github-actions-generator-state @@ -0,0 +1,17 @@ +# Generated ownership state; do not edit. +schema = 2 +[inputs] +config 417292d6f190ea7b +scan 9b6ded87d05c3853 +generator 43 +[outputs] +.github/actionlint.yaml ec35f48ae7e90e0e +.github/ci/project.toml 76cf91bcf683691e +.github/workflows/ci-main.yml 8cc4741ea977b4c0 +.github/workflows/ci-policy.yml 69433f8da7a62fc7 +.github/workflows/ci-pr.yml a85a08ed202ab35f +.github/workflows/ci-unit-gradle.yml 445cbd7a934c6df2 +.github/workflows/maintenance.yml 89c1acfcaee89682 +.github/workflows/nightly.yml 76e5e2bc12a599c6 +.github/workflows/publish-sonatype.yml 775e17aa5dc8cb4d +config/fleet/velnor-host.env d14b419216449423 diff --git a/.github/ci/project.toml b/.github/ci/project.toml new file mode 100644 index 0000000..40503e1 --- /dev/null +++ b/.github/ci/project.toml @@ -0,0 +1,226 @@ +# Generated by velnor-workflow. Regenerate; do not hand-edit. +schema = 2 +repository = "tailrocks/graphql-java-datetime" +profile = "generic" +verified = true +default_branch = "main" +runners = "both" + +[analysis] +method = "static-filesystem-and-manifest-inspection" +detected = ["renovate-configuration"] +limitations = ["Project code, build scripts, task runners, and commands are never executed during analysis.", "Release, signing, registry, deployment, branch-protection, and runner-capability contracts remain explicit manual inputs.", "Renovate credentials, runner placement, and write permissions cannot be inferred from repository files."] + +[workflow] +github_runner = "ubuntu-24.04" +velnor_labels = ["self-hosted", "velnor-target-mvp"] +files = ["ci-main.yml", "ci-policy.yml", "ci-pr.yml", "ci-unit-gradle.yml", "maintenance.yml", "nightly.yml"] + +[release] +enabled = false +reason = "Release is fail-closed. Enable only after declaring immutable artifact, registry, provenance, and tag-protection policy." + +[[unit]] +id = "gradle" +label = "Gradle" +kind = "gradle" +root = "." +watch = ["build.gradle", "build.gradle.kts", "gradle/**", "gradlew", "gradlew.bat", "settings.gradle", "settings.gradle.kts"] +github_pr_commands = ["./gradlew check --no-daemon"] +github_full_commands = ["./gradlew check --no-daemon"] +velnor_pr_commands = ["./gradlew check --no-daemon"] +velnor_full_commands = ["./gradlew check --no-daemon"] +workflow_file = "ci-unit-gradle.yml" +[unit.cache] +key_files = ["gradle/wrapper/gradle-wrapper.properties", "gradle/libs.versions.toml"] +paths = ["~/.gradle/caches", "~/.gradle/wrapper"] + +[[unit]] +id = "gradle-buildsrc" +label = "Gradle (buildSrc)" +kind = "gradle" +root = "buildSrc" +watch = ["buildSrc/build.gradle", "buildSrc/build.gradle.kts", "buildSrc/gradle/**", "buildSrc/gradlew", "buildSrc/gradlew.bat", "buildSrc/settings.gradle", "buildSrc/settings.gradle.kts"] +github_pr_commands = ["cd -- 'buildSrc' && gradle check --no-daemon"] +github_full_commands = ["cd -- 'buildSrc' && gradle check --no-daemon"] +velnor_pr_commands = ["cd -- 'buildSrc' && gradle check --no-daemon"] +velnor_full_commands = ["cd -- 'buildSrc' && gradle check --no-daemon"] +workflow_file = "ci-unit-gradle.yml" +[unit.cache] +key_files = ["buildSrc/gradle/wrapper/gradle-wrapper.properties", "buildSrc/gradle/libs.versions.toml"] +paths = ["~/.gradle/caches", "~/.gradle/wrapper"] + +[[unit]] +id = "gradle-graphql-datetime-dgs-autoconfigure" +label = "Gradle (graphql-datetime-dgs-autoconfigure)" +kind = "gradle" +root = "graphql-datetime-dgs-autoconfigure" +watch = ["graphql-datetime-dgs-autoconfigure/**/*.gradle", "graphql-datetime-dgs-autoconfigure/**/*.gradle.kts", "graphql-datetime-dgs-autoconfigure/src/**"] +github_pr_commands = ["./gradlew :graphql-datetime-dgs-autoconfigure:check --no-daemon"] +github_full_commands = ["./gradlew :graphql-datetime-dgs-autoconfigure:check --no-daemon"] +velnor_pr_commands = ["./gradlew :graphql-datetime-dgs-autoconfigure:check --no-daemon"] +velnor_full_commands = ["./gradlew :graphql-datetime-dgs-autoconfigure:check --no-daemon"] +depends_on = ["gradle-graphql-datetime-spring-boot-common"] +workflow_file = "ci-unit-gradle.yml" +[unit.cache] +key_files = ["gradle/wrapper/gradle-wrapper.properties", "gradle/libs.versions.toml"] +paths = ["~/.gradle/caches", "~/.gradle/wrapper"] + +[[unit]] +id = "gradle-graphql-datetime-dgs-starter" +label = "Gradle (graphql-datetime-dgs-starter)" +kind = "gradle" +root = "graphql-datetime-dgs-starter" +watch = ["graphql-datetime-dgs-starter/**/*.gradle", "graphql-datetime-dgs-starter/**/*.gradle.kts", "graphql-datetime-dgs-starter/src/**"] +github_pr_commands = ["./gradlew :graphql-datetime-dgs-starter:check --no-daemon"] +github_full_commands = ["./gradlew :graphql-datetime-dgs-starter:check --no-daemon"] +velnor_pr_commands = ["./gradlew :graphql-datetime-dgs-starter:check --no-daemon"] +velnor_full_commands = ["./gradlew :graphql-datetime-dgs-starter:check --no-daemon"] +depends_on = ["gradle-graphql-datetime-dgs-autoconfigure"] +workflow_file = "ci-unit-gradle.yml" +[unit.cache] +key_files = ["gradle/wrapper/gradle-wrapper.properties", "gradle/libs.versions.toml"] +paths = ["~/.gradle/caches", "~/.gradle/wrapper"] + +[[unit]] +id = "gradle-graphql-datetime-kickstart-spring-boot-starter" +label = "Gradle (graphql-datetime-kickstart-spring-boot-starter)" +kind = "gradle" +root = "graphql-datetime-kickstart-spring-boot-starter" +watch = ["graphql-datetime-kickstart-spring-boot-starter/**/*.gradle", "graphql-datetime-kickstart-spring-boot-starter/**/*.gradle.kts", "graphql-datetime-kickstart-spring-boot-starter/src/**"] +github_pr_commands = ["./gradlew :graphql-datetime-kickstart-spring-boot-starter:check --no-daemon"] +github_full_commands = ["./gradlew :graphql-datetime-kickstart-spring-boot-starter:check --no-daemon"] +velnor_pr_commands = ["./gradlew :graphql-datetime-kickstart-spring-boot-starter:check --no-daemon"] +velnor_full_commands = ["./gradlew :graphql-datetime-kickstart-spring-boot-starter:check --no-daemon"] +depends_on = ["gradle-graphql-datetime-spring-boot-common"] +workflow_file = "ci-unit-gradle.yml" +[unit.cache] +key_files = ["gradle/wrapper/gradle-wrapper.properties", "gradle/libs.versions.toml"] +paths = ["~/.gradle/caches", "~/.gradle/wrapper"] + +[[unit]] +id = "gradle-graphql-datetime-spring-boot-autoconfigure" +label = "Gradle (graphql-datetime-spring-boot-autoconfigure)" +kind = "gradle" +root = "graphql-datetime-spring-boot-autoconfigure" +watch = ["graphql-datetime-spring-boot-autoconfigure/**/*.gradle", "graphql-datetime-spring-boot-autoconfigure/**/*.gradle.kts", "graphql-datetime-spring-boot-autoconfigure/src/**"] +github_pr_commands = ["./gradlew :graphql-datetime-spring-boot-autoconfigure:check --no-daemon"] +github_full_commands = ["./gradlew :graphql-datetime-spring-boot-autoconfigure:check --no-daemon"] +velnor_pr_commands = ["./gradlew :graphql-datetime-spring-boot-autoconfigure:check --no-daemon"] +velnor_full_commands = ["./gradlew :graphql-datetime-spring-boot-autoconfigure:check --no-daemon"] +depends_on = ["gradle-graphql-datetime-spring-boot-common"] +workflow_file = "ci-unit-gradle.yml" +[unit.cache] +key_files = ["gradle/wrapper/gradle-wrapper.properties", "gradle/libs.versions.toml"] +paths = ["~/.gradle/caches", "~/.gradle/wrapper"] + +[[unit]] +id = "gradle-graphql-datetime-spring-boot-common" +label = "Gradle (graphql-datetime-spring-boot-common)" +kind = "gradle" +root = "graphql-datetime-spring-boot-common" +watch = ["graphql-datetime-spring-boot-common/**/*.gradle", "graphql-datetime-spring-boot-common/**/*.gradle.kts", "graphql-datetime-spring-boot-common/src/**"] +github_pr_commands = ["./gradlew :graphql-datetime-spring-boot-common:check --no-daemon"] +github_full_commands = ["./gradlew :graphql-datetime-spring-boot-common:check --no-daemon"] +velnor_pr_commands = ["./gradlew :graphql-datetime-spring-boot-common:check --no-daemon"] +velnor_full_commands = ["./gradlew :graphql-datetime-spring-boot-common:check --no-daemon"] +depends_on = ["gradle-graphql-java-datetime"] +workflow_file = "ci-unit-gradle.yml" +[unit.cache] +key_files = ["gradle/wrapper/gradle-wrapper.properties", "gradle/libs.versions.toml"] +paths = ["~/.gradle/caches", "~/.gradle/wrapper"] + +[[unit]] +id = "gradle-graphql-datetime-spring-boot-starter" +label = "Gradle (graphql-datetime-spring-boot-starter)" +kind = "gradle" +root = "graphql-datetime-spring-boot-starter" +watch = ["graphql-datetime-spring-boot-starter/**/*.gradle", "graphql-datetime-spring-boot-starter/**/*.gradle.kts", "graphql-datetime-spring-boot-starter/src/**"] +github_pr_commands = ["./gradlew :graphql-datetime-spring-boot-starter:check --no-daemon"] +github_full_commands = ["./gradlew :graphql-datetime-spring-boot-starter:check --no-daemon"] +velnor_pr_commands = ["./gradlew :graphql-datetime-spring-boot-starter:check --no-daemon"] +velnor_full_commands = ["./gradlew :graphql-datetime-spring-boot-starter:check --no-daemon"] +depends_on = ["gradle-graphql-datetime-spring-boot-autoconfigure"] +workflow_file = "ci-unit-gradle.yml" +[unit.cache] +key_files = ["gradle/wrapper/gradle-wrapper.properties", "gradle/libs.versions.toml"] +paths = ["~/.gradle/caches", "~/.gradle/wrapper"] + +[[unit]] +id = "gradle-graphql-java-datetime" +label = "Gradle (graphql-java-datetime)" +kind = "gradle" +root = "graphql-java-datetime" +watch = ["graphql-java-datetime/**/*.gradle", "graphql-java-datetime/**/*.gradle.kts", "graphql-java-datetime/src/**"] +github_pr_commands = ["./gradlew :graphql-java-datetime:check --no-daemon"] +github_full_commands = ["./gradlew :graphql-java-datetime:check --no-daemon"] +velnor_pr_commands = ["./gradlew :graphql-java-datetime:check --no-daemon"] +velnor_full_commands = ["./gradlew :graphql-java-datetime:check --no-daemon"] +workflow_file = "ci-unit-gradle.yml" +[unit.cache] +key_files = ["gradle/wrapper/gradle-wrapper.properties", "gradle/libs.versions.toml"] +paths = ["~/.gradle/caches", "~/.gradle/wrapper"] + +[[unit]] +id = "gradle-samples-dgs-webmvc" +label = "Gradle (samples/dgs-webmvc)" +kind = "gradle" +root = "samples/dgs-webmvc" +watch = ["samples/dgs-webmvc/**/*.gradle", "samples/dgs-webmvc/**/*.gradle.kts", "samples/dgs-webmvc/src/**"] +github_pr_commands = ["./gradlew :samples:dgs-webmvc:check --no-daemon"] +github_full_commands = ["./gradlew :samples:dgs-webmvc:check --no-daemon"] +velnor_pr_commands = ["./gradlew :samples:dgs-webmvc:check --no-daemon"] +velnor_full_commands = ["./gradlew :samples:dgs-webmvc:check --no-daemon"] +depends_on = ["gradle-graphql-datetime-dgs-starter"] +workflow_file = "ci-unit-gradle.yml" +[unit.cache] +key_files = ["gradle/wrapper/gradle-wrapper.properties", "gradle/libs.versions.toml"] +paths = ["~/.gradle/caches", "~/.gradle/wrapper"] + +[[unit]] +id = "gradle-samples-kickstart-webflux" +label = "Gradle (samples/kickstart-webflux)" +kind = "gradle" +root = "samples/kickstart-webflux" +watch = ["samples/kickstart-webflux/**/*.gradle", "samples/kickstart-webflux/**/*.gradle.kts", "samples/kickstart-webflux/src/**"] +github_pr_commands = ["./gradlew :samples:kickstart-webflux:check --no-daemon"] +github_full_commands = ["./gradlew :samples:kickstart-webflux:check --no-daemon"] +velnor_pr_commands = ["./gradlew :samples:kickstart-webflux:check --no-daemon"] +velnor_full_commands = ["./gradlew :samples:kickstart-webflux:check --no-daemon"] +depends_on = ["gradle-graphql-datetime-kickstart-spring-boot-starter"] +workflow_file = "ci-unit-gradle.yml" +[unit.cache] +key_files = ["gradle/wrapper/gradle-wrapper.properties", "gradle/libs.versions.toml"] +paths = ["~/.gradle/caches", "~/.gradle/wrapper"] + +[[unit]] +id = "gradle-samples-kickstart-webmvc" +label = "Gradle (samples/kickstart-webmvc)" +kind = "gradle" +root = "samples/kickstart-webmvc" +watch = ["samples/kickstart-webmvc/**/*.gradle", "samples/kickstart-webmvc/**/*.gradle.kts", "samples/kickstart-webmvc/src/**"] +github_pr_commands = ["./gradlew :samples:kickstart-webmvc:check --no-daemon"] +github_full_commands = ["./gradlew :samples:kickstart-webmvc:check --no-daemon"] +velnor_pr_commands = ["./gradlew :samples:kickstart-webmvc:check --no-daemon"] +velnor_full_commands = ["./gradlew :samples:kickstart-webmvc:check --no-daemon"] +depends_on = ["gradle-graphql-datetime-kickstart-spring-boot-starter"] +workflow_file = "ci-unit-gradle.yml" +[unit.cache] +key_files = ["gradle/wrapper/gradle-wrapper.properties", "gradle/libs.versions.toml"] +paths = ["~/.gradle/caches", "~/.gradle/wrapper"] + +[[unit]] +id = "gradle-samples-spring-boot-webmvc" +label = "Gradle (samples/spring-boot-webmvc)" +kind = "gradle" +root = "samples/spring-boot-webmvc" +watch = ["samples/spring-boot-webmvc/**/*.gradle", "samples/spring-boot-webmvc/**/*.gradle.kts", "samples/spring-boot-webmvc/src/**"] +github_pr_commands = ["./gradlew :samples:spring-boot-webmvc:check --no-daemon"] +github_full_commands = ["./gradlew :samples:spring-boot-webmvc:check --no-daemon"] +velnor_pr_commands = ["./gradlew :samples:spring-boot-webmvc:check --no-daemon"] +velnor_full_commands = ["./gradlew :samples:spring-boot-webmvc:check --no-daemon"] +depends_on = ["gradle-graphql-datetime-spring-boot-autoconfigure"] +workflow_file = "ci-unit-gradle.yml" +[unit.cache] +key_files = ["gradle/wrapper/gradle-wrapper.properties", "gradle/libs.versions.toml"] +paths = ["~/.gradle/caches", "~/.gradle/wrapper"] diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index dc65e44..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Build - -on: - push: - branches: - - main - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - - uses: actions/setup-java@v5 - with: - distribution: temurin - java-version: 17 - - name: Cache Gradle packages - uses: actions/cache@v6 - with: - path: ~/.gradle/caches - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle.kts') }} - restore-keys: ${{ runner.os }}-gradle - - name: Spotless Check - run: ./gradlew spotlessCheck - - name: Test - run: ./gradlew test --rerun-tasks - - name: Build - run: ./gradlew generatePomFileForMavenJavaPublication build - publish: - runs-on: ubuntu-latest - environment: Sonatype - needs: build - steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - - name: Set up OpenJDK - uses: actions/setup-java@v5 - with: - distribution: temurin - java-version: 17 - - name: Cache Gradle packages - uses: actions/cache@v6 - with: - path: ~/.gradle/caches - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle.kts') }} - restore-keys: ${{ runner.os }}-gradle - - name: Publish to Sonatype - run: ./publish-sonatype.sh diff --git a/.github/workflows/ci-main.yml b/.github/workflows/ci-main.yml new file mode 100644 index 0000000..6acaad1 --- /dev/null +++ b/.github/workflows/ci-main.yml @@ -0,0 +1,1065 @@ +# Generated by velnor-workflow. Regenerate; do not hand-edit. +name: CI / Main +run-name: CI / main · ${{ github.event_name }} · ${{ github.ref_name }} + +on: + push: + branches: [main] + workflow_dispatch: + inputs: + runner: + description: Execution backend + required: false + default: both + type: choice + options: + - velnor + - github + - both + scope: + description: Verification scope + required: true + default: full + type: choice + options: + - affected + - full + base_sha: + description: Git ref or SHA used as the affected-selection base + required: false + default: refs/heads/main + type: string + + +concurrency: + group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: false + +permissions: + actions: read + contents: read + +jobs: + plan: + name: "Control / Planning" + runs-on: ubuntu-24.04 + outputs: + scope: ${{ steps.plan.outputs.scope }} + base_sha: ${{ steps.plan.outputs.base_sha }} + head_sha: ${{ steps.plan.outputs.head_sha }} + units: ${{ steps.plan.outputs.units }} + full_units: ${{ steps.plan.outputs.full_units }} + gradle_matrix: ${{ steps.plan.outputs.gradle_matrix }} + steps: + - name: Checkout + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + fetch-depth: 0 + persist-credentials: false + - name: Set up Velnor workflow runtime + if: ${{ runner.environment == 'github-hosted' }} + uses: tailrocks/velnor/.github/actions/setup-velnor-workflow@e6fabca85499be62f939243d4452438449b69c53 + with: + rev: e6fabca85499be62f939243d4452438449b69c53 + - name: Set trusted workflow policy revision + run: echo "VELNOR_WORKFLOW_POLICY_REVISION=e6fabca85499be62f939243d4452438449b69c53" >> "$GITHUB_ENV" + - name: Select affected units + id: plan + env: + EVENT_NAME: ${{ github.event_name }} + CI_SCOPE_OVERRIDE: ${{ github.event.inputs.scope || '' }} + BASE_SHA: ${{ github.event.pull_request.base.sha || github.event.inputs.base_sha || github.event.before || 'refs/heads/main' }} + HEAD_SHA: ${{ github.sha }} + VELNOR_LANES: ${{ github.event.inputs.runner || 'both' }} + run: | + set -euo pipefail + if [[ -z "${CI_SCOPE_OVERRIDE:-}" ]]; then unset CI_SCOPE_OVERRIDE; fi + velnor-workflow plan --config .github/ci/project.toml + + - name: Prepare Velnor workflow runtime + shell: bash + env: + EXPECTED_REVISION: e6fabca85499be62f939243d4452438449b69c53 + run: | + set -euo pipefail + stage="$RUNNER_TEMP/velnor-workflow-runtime" + rm -rf "$stage" + mkdir -p "$stage" + src="$(command -v velnor-workflow)" + install -m 0755 "$src" "$stage/velnor-workflow" + digest="$(sha256sum "$stage/velnor-workflow" | awk '{print $1}')" + jq -n --arg repository "$GITHUB_REPOSITORY" --arg revision "$EXPECTED_REVISION" --arg head_branch "${{ github.ref_name }}" --arg platform "${{ runner.os }}-${{ runner.arch }}" --arg run_id "$GITHUB_RUN_ID" --arg job_id "${{ github.job }}" --arg binary_sha256 "$digest" '{repository: $repository, revision: $revision, head_branch: $head_branch, platform: $platform, run_id: $run_id, job_id: $job_id, binary_sha256: $binary_sha256}' > "$stage/manifest.json" + - name: Publish Velnor workflow runtime + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: velnor-workflow-runtime-e6fabca85499be62f939243d4452438449b69c53-${{ runner.os }}-${{ runner.arch }} + path: ${{ runner.temp }}/velnor-workflow-runtime + if-no-files-found: error + retention-days: 7 + velnor-lane-admission: + name: "Control / Velnor admission" + if: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository }} + runs-on: ubuntu-24.04 + timeout-minutes: 5 + steps: + - name: Velnor lane omitted for fork + run: | + echo '::notice::Velnor lane omitted for fork pull request; validating GitHub lane only.' + policy: + name: Policy + runs-on: ubuntu-24.04 + timeout-minutes: 10 + permissions: + contents: read + steps: + - name: Checkout caller workflow data + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + repository: ${{ github.event.pull_request.head.repo.full_name || github.repository }} + ref: ${{ github.event.pull_request.head.sha || github.sha }} + path: policy-checkout + sparse-checkout: | + .github/workflows + .github-gen + sparse-checkout-cone-mode: true + fetch-depth: 1 + persist-credentials: false + # Static policy validation only; fork head checkout is intentional. + allow-unsafe-pr-checkout: true + - name: Set up Mr. Boxington + uses: jdx/mr-boxington-action@7234d3dd1a6ca8f6c381eea8e4dfb03f18fcf777 # v1.3.0 + with: + backend: github + version: 1.8.3 + cache-key: velnor-policy-mbx-1.8.3-${{ runner.os }}-${{ runner.arch }}-e6fabca85499be62f939243d4452438449b69c53 + restore-keys: | + velnor-policy-mbx-1.8.3-${{ runner.os }}-${{ runner.arch }}- + - name: Install pinned Velnor workflow runtime + env: + CARGO_HOME: ${{ runner.temp }}/velnor-workflow-cargo-home + CARGO_TARGET_DIR: ${{ runner.temp }}/velnor-workflow-cargo-target + VELNOR_WORKFLOW_INSTALL_DIR: ${{ runner.temp }}/velnor-workflow-install + VELNOR_WORKFLOW_ROOT: ${{ runner.temp }}/velnor-workflow + run: | + set -euo pipefail + install -d -m 700 \ + "$CARGO_HOME" \ + "$CARGO_TARGET_DIR" \ + "$VELNOR_WORKFLOW_INSTALL_DIR" + cd "$VELNOR_WORKFLOW_INSTALL_DIR" + env -u RUSTC_WRAPPER -u SCCACHE_GHA_ENABLED -u CARGO_INCREMENTAL -u RUSTFLAGS -u CARGO_ENCODED_RUSTFLAGS \ + cargo install \ + --locked \ + --git https://github.com/tailrocks/velnor \ + --rev e6fabca85499be62f939243d4452438449b69c53 \ + --root "$VELNOR_WORKFLOW_ROOT" \ + velnor-workflow \ + --bin velnor-workflow + echo "$VELNOR_WORKFLOW_ROOT/bin" >> "$GITHUB_PATH" + - name: Enforce workflow policy + env: + WORKFLOW_ROOT: ${{ github.workspace }}/policy-checkout + VELNOR_WORKFLOW_POLICY_REVISION: e6fabca85499be62f939243d4452438449b69c53 + run: velnor-workflow policy --workflow-root "$WORKFLOW_ROOT" + github-gradle: + name: "Gradle · Gradle" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle,') }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle: + name: "Gradle · Gradle" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-buildsrc: + name: "Gradle · Gradle (buildSrc)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-buildsrc,') }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-buildsrc + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-buildsrc: + name: "Gradle · Gradle (buildSrc)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-buildsrc,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-buildsrc + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-graphql-datetime-dgs-autoconfigure: + name: "Gradle · Gradle (graphql-datetime-dgs-autoconfigure)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-dgs-autoconfigure,') }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-dgs-autoconfigure + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-graphql-datetime-dgs-autoconfigure: + name: "Gradle · Gradle (graphql-datetime-dgs-autoconfigure)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-dgs-autoconfigure,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-dgs-autoconfigure + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-graphql-datetime-dgs-starter: + name: "Gradle · Gradle (graphql-datetime-dgs-starter)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-dgs-starter,') }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-dgs-starter + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-graphql-datetime-dgs-starter: + name: "Gradle · Gradle (graphql-datetime-dgs-starter)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-dgs-starter,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-dgs-starter + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-graphql-datetime-kickstart-spring-boot-starter: + name: "Gradle · Gradle (graphql-datetime-kickstart-spring-boot-starter)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-kickstart-spring-boot-starter,') }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-kickstart-spring-boot-starter + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-graphql-datetime-kickstart-spring-boot-starter: + name: "Gradle · Gradle (graphql-datetime-kickstart-spring-boot-starter)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-kickstart-spring-boot-starter,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-kickstart-spring-boot-starter + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-graphql-datetime-spring-boot-autoconfigure: + name: "Gradle · Gradle (graphql-datetime-spring-boot-autoconfigure)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-spring-boot-autoconfigure,') }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-spring-boot-autoconfigure + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-graphql-datetime-spring-boot-autoconfigure: + name: "Gradle · Gradle (graphql-datetime-spring-boot-autoconfigure)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-spring-boot-autoconfigure,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-spring-boot-autoconfigure + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-graphql-datetime-spring-boot-common: + name: "Gradle · Gradle (graphql-datetime-spring-boot-common)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-spring-boot-common,') }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-spring-boot-common + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-graphql-datetime-spring-boot-common: + name: "Gradle · Gradle (graphql-datetime-spring-boot-common)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-spring-boot-common,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-spring-boot-common + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-graphql-datetime-spring-boot-starter: + name: "Gradle · Gradle (graphql-datetime-spring-boot-starter)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-spring-boot-starter,') }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-spring-boot-starter + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-graphql-datetime-spring-boot-starter: + name: "Gradle · Gradle (graphql-datetime-spring-boot-starter)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-spring-boot-starter,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-spring-boot-starter + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-graphql-java-datetime: + name: "Gradle · Gradle (graphql-java-datetime)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-java-datetime,') }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-java-datetime + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-graphql-java-datetime: + name: "Gradle · Gradle (graphql-java-datetime)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-java-datetime,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-java-datetime + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-samples-dgs-webmvc: + name: "Gradle · Gradle (samples/dgs-webmvc)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-samples-dgs-webmvc,') }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-samples-dgs-webmvc + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-samples-dgs-webmvc: + name: "Gradle · Gradle (samples/dgs-webmvc)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-samples-dgs-webmvc,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-samples-dgs-webmvc + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-samples-kickstart-webflux: + name: "Gradle · Gradle (samples/kickstart-webflux)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-samples-kickstart-webflux,') }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-samples-kickstart-webflux + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-samples-kickstart-webflux: + name: "Gradle · Gradle (samples/kickstart-webflux)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-samples-kickstart-webflux,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-samples-kickstart-webflux + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-samples-kickstart-webmvc: + name: "Gradle · Gradle (samples/kickstart-webmvc)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-samples-kickstart-webmvc,') }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-samples-kickstart-webmvc + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-samples-kickstart-webmvc: + name: "Gradle · Gradle (samples/kickstart-webmvc)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-samples-kickstart-webmvc,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-samples-kickstart-webmvc + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-samples-spring-boot-webmvc: + name: "Gradle · Gradle (samples/spring-boot-webmvc)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-samples-spring-boot-webmvc,') }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-samples-spring-boot-webmvc + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-samples-spring-boot-webmvc: + name: "Gradle · Gradle (samples/spring-boot-webmvc)" + if: ${{ always() && needs.plan.result == 'success' && needs.policy.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-samples-spring-boot-webmvc,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan, policy] + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-samples-spring-boot-webmvc + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + ci-required: + name: ci-required + if: ${{ always() }} + needs: [plan, velnor-lane-admission, policy, github-gradle, velnor-gradle, github-gradle-buildsrc, velnor-gradle-buildsrc, github-gradle-graphql-datetime-dgs-autoconfigure, velnor-gradle-graphql-datetime-dgs-autoconfigure, github-gradle-graphql-datetime-dgs-starter, velnor-gradle-graphql-datetime-dgs-starter, github-gradle-graphql-datetime-kickstart-spring-boot-starter, velnor-gradle-graphql-datetime-kickstart-spring-boot-starter, github-gradle-graphql-datetime-spring-boot-autoconfigure, velnor-gradle-graphql-datetime-spring-boot-autoconfigure, github-gradle-graphql-datetime-spring-boot-common, velnor-gradle-graphql-datetime-spring-boot-common, github-gradle-graphql-datetime-spring-boot-starter, velnor-gradle-graphql-datetime-spring-boot-starter, github-gradle-graphql-java-datetime, velnor-gradle-graphql-java-datetime, github-gradle-samples-dgs-webmvc, velnor-gradle-samples-dgs-webmvc, github-gradle-samples-kickstart-webflux, velnor-gradle-samples-kickstart-webflux, github-gradle-samples-kickstart-webmvc, velnor-gradle-samples-kickstart-webmvc, github-gradle-samples-spring-boot-webmvc, velnor-gradle-samples-spring-boot-webmvc] + runs-on: ubuntu-24.04 + timeout-minutes: 5 + steps: + - name: Validate generated stack results + env: + NEEDS_JSON: ${{ toJSON(needs) }} + SELECTED_UNITS: ${{ needs.plan.outputs.units }} + FORK_PR: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository }} + shell: bash + run: | + set -euo pipefail + result_for_job() { + jq -r --arg job "$1" '.[$job].result // empty' <<<"$NEEDS_JSON" + } + result="$(result_for_job plan)" + if [[ "$result" != success ]]; then + echo "required CI prerequisite plan did not pass: $result" >&2 + exit 1 + fi + result="$(result_for_job policy)" + if [[ "$result" != success ]]; then + echo "required CI prerequisite policy did not pass: $result" >&2 + exit 1 + fi + result="$(result_for_job velnor-lane-admission)" + case "$result" in + success|skipped) ;; + *) echo "required CI prerequisite velnor-lane-admission did not pass: $result" >&2; exit 1 ;; + esac + selected=",$SELECTED_UNITS," + if [[ "$selected" == *",gradle,"* ]]; then + result="$(result_for_job github-gradle)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle,"* ]]; then + result="$(result_for_job velnor-gradle)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-buildsrc,"* ]]; then + result="$(result_for_job github-gradle-buildsrc)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-buildsrc did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-buildsrc did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-buildsrc)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-buildsrc failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-buildsrc,"* ]]; then + result="$(result_for_job velnor-gradle-buildsrc)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-buildsrc did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-buildsrc did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-buildsrc)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-buildsrc failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-dgs-autoconfigure,"* ]]; then + result="$(result_for_job github-gradle-graphql-datetime-dgs-autoconfigure)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-graphql-datetime-dgs-autoconfigure did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-graphql-datetime-dgs-autoconfigure did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-graphql-datetime-dgs-autoconfigure)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-graphql-datetime-dgs-autoconfigure failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-dgs-autoconfigure,"* ]]; then + result="$(result_for_job velnor-gradle-graphql-datetime-dgs-autoconfigure)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-dgs-autoconfigure did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-dgs-autoconfigure did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-graphql-datetime-dgs-autoconfigure)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-graphql-datetime-dgs-autoconfigure failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-dgs-starter,"* ]]; then + result="$(result_for_job github-gradle-graphql-datetime-dgs-starter)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-graphql-datetime-dgs-starter did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-graphql-datetime-dgs-starter did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-graphql-datetime-dgs-starter)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-graphql-datetime-dgs-starter failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-dgs-starter,"* ]]; then + result="$(result_for_job velnor-gradle-graphql-datetime-dgs-starter)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-dgs-starter did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-dgs-starter did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-graphql-datetime-dgs-starter)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-graphql-datetime-dgs-starter failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-kickstart-spring-boot-starter,"* ]]; then + result="$(result_for_job github-gradle-graphql-datetime-kickstart-spring-boot-starter)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-graphql-datetime-kickstart-spring-boot-starter did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-graphql-datetime-kickstart-spring-boot-starter did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-graphql-datetime-kickstart-spring-boot-starter)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-graphql-datetime-kickstart-spring-boot-starter failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-kickstart-spring-boot-starter,"* ]]; then + result="$(result_for_job velnor-gradle-graphql-datetime-kickstart-spring-boot-starter)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-kickstart-spring-boot-starter did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-kickstart-spring-boot-starter did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-graphql-datetime-kickstart-spring-boot-starter)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-graphql-datetime-kickstart-spring-boot-starter failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-spring-boot-autoconfigure,"* ]]; then + result="$(result_for_job github-gradle-graphql-datetime-spring-boot-autoconfigure)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-graphql-datetime-spring-boot-autoconfigure did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-graphql-datetime-spring-boot-autoconfigure did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-graphql-datetime-spring-boot-autoconfigure)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-graphql-datetime-spring-boot-autoconfigure failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-spring-boot-autoconfigure,"* ]]; then + result="$(result_for_job velnor-gradle-graphql-datetime-spring-boot-autoconfigure)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-spring-boot-autoconfigure did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-spring-boot-autoconfigure did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-graphql-datetime-spring-boot-autoconfigure)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-graphql-datetime-spring-boot-autoconfigure failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-spring-boot-common,"* ]]; then + result="$(result_for_job github-gradle-graphql-datetime-spring-boot-common)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-graphql-datetime-spring-boot-common did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-graphql-datetime-spring-boot-common did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-graphql-datetime-spring-boot-common)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-graphql-datetime-spring-boot-common failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-spring-boot-common,"* ]]; then + result="$(result_for_job velnor-gradle-graphql-datetime-spring-boot-common)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-spring-boot-common did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-spring-boot-common did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-graphql-datetime-spring-boot-common)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-graphql-datetime-spring-boot-common failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-spring-boot-starter,"* ]]; then + result="$(result_for_job github-gradle-graphql-datetime-spring-boot-starter)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-graphql-datetime-spring-boot-starter did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-graphql-datetime-spring-boot-starter did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-graphql-datetime-spring-boot-starter)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-graphql-datetime-spring-boot-starter failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-spring-boot-starter,"* ]]; then + result="$(result_for_job velnor-gradle-graphql-datetime-spring-boot-starter)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-spring-boot-starter did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-spring-boot-starter did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-graphql-datetime-spring-boot-starter)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-graphql-datetime-spring-boot-starter failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-java-datetime,"* ]]; then + result="$(result_for_job github-gradle-graphql-java-datetime)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-graphql-java-datetime did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-graphql-java-datetime did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-graphql-java-datetime)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-graphql-java-datetime failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-java-datetime,"* ]]; then + result="$(result_for_job velnor-gradle-graphql-java-datetime)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-graphql-java-datetime did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-graphql-java-datetime did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-graphql-java-datetime)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-graphql-java-datetime failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-samples-dgs-webmvc,"* ]]; then + result="$(result_for_job github-gradle-samples-dgs-webmvc)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-samples-dgs-webmvc did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-samples-dgs-webmvc did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-samples-dgs-webmvc)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-samples-dgs-webmvc failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-samples-dgs-webmvc,"* ]]; then + result="$(result_for_job velnor-gradle-samples-dgs-webmvc)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-samples-dgs-webmvc did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-samples-dgs-webmvc did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-samples-dgs-webmvc)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-samples-dgs-webmvc failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-samples-kickstart-webflux,"* ]]; then + result="$(result_for_job github-gradle-samples-kickstart-webflux)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-samples-kickstart-webflux did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-samples-kickstart-webflux did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-samples-kickstart-webflux)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-samples-kickstart-webflux failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-samples-kickstart-webflux,"* ]]; then + result="$(result_for_job velnor-gradle-samples-kickstart-webflux)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-samples-kickstart-webflux did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-samples-kickstart-webflux did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-samples-kickstart-webflux)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-samples-kickstart-webflux failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-samples-kickstart-webmvc,"* ]]; then + result="$(result_for_job github-gradle-samples-kickstart-webmvc)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-samples-kickstart-webmvc did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-samples-kickstart-webmvc did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-samples-kickstart-webmvc)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-samples-kickstart-webmvc failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-samples-kickstart-webmvc,"* ]]; then + result="$(result_for_job velnor-gradle-samples-kickstart-webmvc)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-samples-kickstart-webmvc did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-samples-kickstart-webmvc did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-samples-kickstart-webmvc)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-samples-kickstart-webmvc failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-samples-spring-boot-webmvc,"* ]]; then + result="$(result_for_job github-gradle-samples-spring-boot-webmvc)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-samples-spring-boot-webmvc did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-samples-spring-boot-webmvc did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-samples-spring-boot-webmvc)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-samples-spring-boot-webmvc failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-samples-spring-boot-webmvc,"* ]]; then + result="$(result_for_job velnor-gradle-samples-spring-boot-webmvc)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-samples-spring-boot-webmvc did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-samples-spring-boot-webmvc did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-samples-spring-boot-webmvc)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-samples-spring-boot-webmvc failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + required: + name: "Control / Required" + if: ${{ always() }} + needs: [ci-required] + runs-on: ubuntu-24.04 + timeout-minutes: 5 + steps: + - name: Mirror CI / Required + if: ${{ needs.ci-required.result != 'success' }} + run: exit 1 diff --git a/.github/workflows/ci-policy.yml b/.github/workflows/ci-policy.yml new file mode 100644 index 0000000..444bb3e --- /dev/null +++ b/.github/workflows/ci-policy.yml @@ -0,0 +1,71 @@ +# Generated by velnor-workflow. Regenerate; do not hand-edit. +name: Velnor workflow policy + +on: + pull_request_target: + types: [opened, synchronize, reopened] + +concurrency: + group: policy-${{ github.repository }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + policy: + name: Policy + runs-on: ubuntu-24.04 + timeout-minutes: 10 + permissions: + contents: read + steps: + - name: Checkout caller workflow data + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + repository: ${{ github.event.pull_request.head.repo.full_name || github.repository }} + ref: ${{ github.event.pull_request.head.sha || github.sha }} + path: policy-checkout + sparse-checkout: | + .github/workflows + .github-gen + sparse-checkout-cone-mode: true + fetch-depth: 1 + persist-credentials: false + # Static policy validation only; fork head checkout is intentional. + allow-unsafe-pr-checkout: true + - name: Set up Mr. Boxington + uses: jdx/mr-boxington-action@7234d3dd1a6ca8f6c381eea8e4dfb03f18fcf777 # v1.3.0 + with: + backend: github + version: 1.8.3 + cache-key: velnor-policy-mbx-1.8.3-${{ runner.os }}-${{ runner.arch }}-e6fabca85499be62f939243d4452438449b69c53 + restore-keys: | + velnor-policy-mbx-1.8.3-${{ runner.os }}-${{ runner.arch }}- + - name: Install pinned Velnor workflow runtime + env: + CARGO_HOME: ${{ runner.temp }}/velnor-workflow-cargo-home + CARGO_TARGET_DIR: ${{ runner.temp }}/velnor-workflow-cargo-target + VELNOR_WORKFLOW_INSTALL_DIR: ${{ runner.temp }}/velnor-workflow-install + VELNOR_WORKFLOW_ROOT: ${{ runner.temp }}/velnor-workflow + run: | + set -euo pipefail + install -d -m 700 \ + "$CARGO_HOME" \ + "$CARGO_TARGET_DIR" \ + "$VELNOR_WORKFLOW_INSTALL_DIR" + cd "$VELNOR_WORKFLOW_INSTALL_DIR" + env -u RUSTC_WRAPPER -u SCCACHE_GHA_ENABLED -u CARGO_INCREMENTAL -u RUSTFLAGS -u CARGO_ENCODED_RUSTFLAGS \ + cargo install \ + --locked \ + --git https://github.com/tailrocks/velnor \ + --rev e6fabca85499be62f939243d4452438449b69c53 \ + --root "$VELNOR_WORKFLOW_ROOT" \ + velnor-workflow \ + --bin velnor-workflow + echo "$VELNOR_WORKFLOW_ROOT/bin" >> "$GITHUB_PATH" + - name: Enforce workflow policy + env: + WORKFLOW_ROOT: ${{ github.workspace }}/policy-checkout + VELNOR_WORKFLOW_POLICY_REVISION: e6fabca85499be62f939243d4452438449b69c53 + run: velnor-workflow policy --workflow-root "$WORKFLOW_ROOT" diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml new file mode 100644 index 0000000..90ecb79 --- /dev/null +++ b/.github/workflows/ci-pr.yml @@ -0,0 +1,1029 @@ +# Generated by velnor-workflow. Regenerate; do not hand-edit. +name: CI / PR +run-name: CI / PR · ${{ github.event_name }} · ${{ github.ref_name }} + +on: + pull_request: + workflow_dispatch: + inputs: + runner: + description: Execution backend + required: false + default: both + type: choice + options: + - velnor + - github + - both + scope: + description: Verification scope + required: true + default: affected + type: choice + options: + - affected + - full + base_sha: + description: Git ref or SHA used as the affected-selection base + required: false + default: refs/heads/main + type: string + + +concurrency: + group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +permissions: + actions: read + contents: read + +jobs: + plan: + name: "Control / Planning" + runs-on: ubuntu-24.04 + outputs: + scope: ${{ steps.plan.outputs.scope }} + base_sha: ${{ steps.plan.outputs.base_sha }} + head_sha: ${{ steps.plan.outputs.head_sha }} + units: ${{ steps.plan.outputs.units }} + full_units: ${{ steps.plan.outputs.full_units }} + gradle_matrix: ${{ steps.plan.outputs.gradle_matrix }} + steps: + - name: Checkout + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + fetch-depth: 0 + persist-credentials: false + - name: Set up Velnor workflow runtime + if: ${{ runner.environment == 'github-hosted' }} + uses: tailrocks/velnor/.github/actions/setup-velnor-workflow@e6fabca85499be62f939243d4452438449b69c53 + with: + rev: e6fabca85499be62f939243d4452438449b69c53 + - name: Set trusted workflow policy revision + run: echo "VELNOR_WORKFLOW_POLICY_REVISION=e6fabca85499be62f939243d4452438449b69c53" >> "$GITHUB_ENV" + - name: Select affected units + id: plan + env: + EVENT_NAME: ${{ github.event_name }} + CI_SCOPE_OVERRIDE: ${{ github.event.inputs.scope || '' }} + BASE_SHA: ${{ github.event.pull_request.base.sha || github.event.inputs.base_sha || github.event.before || 'refs/heads/main' }} + HEAD_SHA: ${{ github.sha }} + VELNOR_LANES: ${{ github.event.inputs.runner || 'both' }} + run: | + set -euo pipefail + if [[ -z "${CI_SCOPE_OVERRIDE:-}" ]]; then unset CI_SCOPE_OVERRIDE; fi + velnor-workflow plan --config .github/ci/project.toml + + - name: Prepare Velnor workflow runtime + shell: bash + env: + EXPECTED_REVISION: e6fabca85499be62f939243d4452438449b69c53 + run: | + set -euo pipefail + stage="$RUNNER_TEMP/velnor-workflow-runtime" + rm -rf "$stage" + mkdir -p "$stage" + src="$(command -v velnor-workflow)" + install -m 0755 "$src" "$stage/velnor-workflow" + digest="$(sha256sum "$stage/velnor-workflow" | awk '{print $1}')" + jq -n --arg repository "$GITHUB_REPOSITORY" --arg revision "$EXPECTED_REVISION" --arg head_branch "${{ github.ref_name }}" --arg platform "${{ runner.os }}-${{ runner.arch }}" --arg run_id "$GITHUB_RUN_ID" --arg job_id "${{ github.job }}" --arg binary_sha256 "$digest" '{repository: $repository, revision: $revision, head_branch: $head_branch, platform: $platform, run_id: $run_id, job_id: $job_id, binary_sha256: $binary_sha256}' > "$stage/manifest.json" + - name: Publish Velnor workflow runtime + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: velnor-workflow-runtime-e6fabca85499be62f939243d4452438449b69c53-${{ runner.os }}-${{ runner.arch }} + path: ${{ runner.temp }}/velnor-workflow-runtime + if-no-files-found: error + retention-days: 7 + velnor-lane-admission: + name: "Control / Velnor admission" + if: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository }} + runs-on: ubuntu-24.04 + timeout-minutes: 5 + steps: + - name: Velnor lane omitted for fork + run: | + echo '::notice::Velnor lane omitted for fork pull request; validating GitHub lane only.' + github-gradle: + name: "Gradle · Gradle" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle,') }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle: + name: "Gradle · Gradle" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-buildsrc: + name: "Gradle · Gradle (buildSrc)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-buildsrc,') }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-buildsrc + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-buildsrc: + name: "Gradle · Gradle (buildSrc)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-buildsrc,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-buildsrc + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-graphql-datetime-dgs-autoconfigure: + name: "Gradle · Gradle (graphql-datetime-dgs-autoconfigure)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-dgs-autoconfigure,') }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-dgs-autoconfigure + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-graphql-datetime-dgs-autoconfigure: + name: "Gradle · Gradle (graphql-datetime-dgs-autoconfigure)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-dgs-autoconfigure,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-dgs-autoconfigure + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-graphql-datetime-dgs-starter: + name: "Gradle · Gradle (graphql-datetime-dgs-starter)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-dgs-starter,') }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-dgs-starter + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-graphql-datetime-dgs-starter: + name: "Gradle · Gradle (graphql-datetime-dgs-starter)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-dgs-starter,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-dgs-starter + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-graphql-datetime-kickstart-spring-boot-starter: + name: "Gradle · Gradle (graphql-datetime-kickstart-spring-boot-starter)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-kickstart-spring-boot-starter,') }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-kickstart-spring-boot-starter + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-graphql-datetime-kickstart-spring-boot-starter: + name: "Gradle · Gradle (graphql-datetime-kickstart-spring-boot-starter)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-kickstart-spring-boot-starter,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-kickstart-spring-boot-starter + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-graphql-datetime-spring-boot-autoconfigure: + name: "Gradle · Gradle (graphql-datetime-spring-boot-autoconfigure)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-spring-boot-autoconfigure,') }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-spring-boot-autoconfigure + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-graphql-datetime-spring-boot-autoconfigure: + name: "Gradle · Gradle (graphql-datetime-spring-boot-autoconfigure)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-spring-boot-autoconfigure,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-spring-boot-autoconfigure + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-graphql-datetime-spring-boot-common: + name: "Gradle · Gradle (graphql-datetime-spring-boot-common)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-spring-boot-common,') }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-spring-boot-common + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-graphql-datetime-spring-boot-common: + name: "Gradle · Gradle (graphql-datetime-spring-boot-common)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-spring-boot-common,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-spring-boot-common + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-graphql-datetime-spring-boot-starter: + name: "Gradle · Gradle (graphql-datetime-spring-boot-starter)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-spring-boot-starter,') }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-spring-boot-starter + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-graphql-datetime-spring-boot-starter: + name: "Gradle · Gradle (graphql-datetime-spring-boot-starter)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-datetime-spring-boot-starter,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-datetime-spring-boot-starter + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-graphql-java-datetime: + name: "Gradle · Gradle (graphql-java-datetime)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-java-datetime,') }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-java-datetime + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-graphql-java-datetime: + name: "Gradle · Gradle (graphql-java-datetime)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-graphql-java-datetime,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-graphql-java-datetime + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-samples-dgs-webmvc: + name: "Gradle · Gradle (samples/dgs-webmvc)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-samples-dgs-webmvc,') }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-samples-dgs-webmvc + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-samples-dgs-webmvc: + name: "Gradle · Gradle (samples/dgs-webmvc)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-samples-dgs-webmvc,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-samples-dgs-webmvc + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-samples-kickstart-webflux: + name: "Gradle · Gradle (samples/kickstart-webflux)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-samples-kickstart-webflux,') }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-samples-kickstart-webflux + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-samples-kickstart-webflux: + name: "Gradle · Gradle (samples/kickstart-webflux)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-samples-kickstart-webflux,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-samples-kickstart-webflux + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-samples-kickstart-webmvc: + name: "Gradle · Gradle (samples/kickstart-webmvc)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-samples-kickstart-webmvc,') }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-samples-kickstart-webmvc + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-samples-kickstart-webmvc: + name: "Gradle · Gradle (samples/kickstart-webmvc)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-samples-kickstart-webmvc,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-samples-kickstart-webmvc + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + github-gradle-samples-spring-boot-webmvc: + name: "Gradle · Gradle (samples/spring-boot-webmvc)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-samples-spring-boot-webmvc,') }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-samples-spring-boot-webmvc + lane: github + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + velnor-gradle-samples-spring-boot-webmvc: + name: "Gradle · Gradle (samples/spring-boot-webmvc)" + if: ${{ always() && needs.plan.result == 'success' && contains(format(',{0},', needs.plan.outputs.units), ',gradle-samples-spring-boot-webmvc,') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + needs: [plan] + cache-mode: read + uses: ./.github/workflows/ci-unit-gradle.yml + with: + unit: gradle-samples-spring-boot-webmvc + lane: velnor + selected_units: ${{ needs.plan.outputs.units }} + scope: ${{ needs.plan.outputs.scope }} + full_units: ${{ needs.plan.outputs.full_units }} + base_sha: ${{ needs.plan.outputs.base_sha }} + head_sha: ${{ needs.plan.outputs.head_sha }} + ci-required: + name: ci-required + if: ${{ always() }} + needs: [plan, velnor-lane-admission, github-gradle, velnor-gradle, github-gradle-buildsrc, velnor-gradle-buildsrc, github-gradle-graphql-datetime-dgs-autoconfigure, velnor-gradle-graphql-datetime-dgs-autoconfigure, github-gradle-graphql-datetime-dgs-starter, velnor-gradle-graphql-datetime-dgs-starter, github-gradle-graphql-datetime-kickstart-spring-boot-starter, velnor-gradle-graphql-datetime-kickstart-spring-boot-starter, github-gradle-graphql-datetime-spring-boot-autoconfigure, velnor-gradle-graphql-datetime-spring-boot-autoconfigure, github-gradle-graphql-datetime-spring-boot-common, velnor-gradle-graphql-datetime-spring-boot-common, github-gradle-graphql-datetime-spring-boot-starter, velnor-gradle-graphql-datetime-spring-boot-starter, github-gradle-graphql-java-datetime, velnor-gradle-graphql-java-datetime, github-gradle-samples-dgs-webmvc, velnor-gradle-samples-dgs-webmvc, github-gradle-samples-kickstart-webflux, velnor-gradle-samples-kickstart-webflux, github-gradle-samples-kickstart-webmvc, velnor-gradle-samples-kickstart-webmvc, github-gradle-samples-spring-boot-webmvc, velnor-gradle-samples-spring-boot-webmvc] + runs-on: ubuntu-24.04 + timeout-minutes: 5 + steps: + - name: Validate generated stack results + env: + NEEDS_JSON: ${{ toJSON(needs) }} + SELECTED_UNITS: ${{ needs.plan.outputs.units }} + FORK_PR: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository }} + shell: bash + run: | + set -euo pipefail + result_for_job() { + jq -r --arg job "$1" '.[$job].result // empty' <<<"$NEEDS_JSON" + } + result="$(result_for_job plan)" + if [[ "$result" != success ]]; then + echo "required CI prerequisite plan did not pass: $result" >&2 + exit 1 + fi + result="$(result_for_job velnor-lane-admission)" + case "$result" in + success|skipped) ;; + *) echo "required CI prerequisite velnor-lane-admission did not pass: $result" >&2; exit 1 ;; + esac + selected=",$SELECTED_UNITS," + if [[ "$selected" == *",gradle,"* ]]; then + result="$(result_for_job github-gradle)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle,"* ]]; then + result="$(result_for_job velnor-gradle)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-buildsrc,"* ]]; then + result="$(result_for_job github-gradle-buildsrc)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-buildsrc did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-buildsrc did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-buildsrc)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-buildsrc failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-buildsrc,"* ]]; then + result="$(result_for_job velnor-gradle-buildsrc)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-buildsrc did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-buildsrc did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-buildsrc)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-buildsrc failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-dgs-autoconfigure,"* ]]; then + result="$(result_for_job github-gradle-graphql-datetime-dgs-autoconfigure)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-graphql-datetime-dgs-autoconfigure did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-graphql-datetime-dgs-autoconfigure did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-graphql-datetime-dgs-autoconfigure)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-graphql-datetime-dgs-autoconfigure failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-dgs-autoconfigure,"* ]]; then + result="$(result_for_job velnor-gradle-graphql-datetime-dgs-autoconfigure)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-dgs-autoconfigure did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-dgs-autoconfigure did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-graphql-datetime-dgs-autoconfigure)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-graphql-datetime-dgs-autoconfigure failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-dgs-starter,"* ]]; then + result="$(result_for_job github-gradle-graphql-datetime-dgs-starter)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-graphql-datetime-dgs-starter did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-graphql-datetime-dgs-starter did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-graphql-datetime-dgs-starter)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-graphql-datetime-dgs-starter failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-dgs-starter,"* ]]; then + result="$(result_for_job velnor-gradle-graphql-datetime-dgs-starter)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-dgs-starter did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-dgs-starter did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-graphql-datetime-dgs-starter)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-graphql-datetime-dgs-starter failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-kickstart-spring-boot-starter,"* ]]; then + result="$(result_for_job github-gradle-graphql-datetime-kickstart-spring-boot-starter)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-graphql-datetime-kickstart-spring-boot-starter did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-graphql-datetime-kickstart-spring-boot-starter did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-graphql-datetime-kickstart-spring-boot-starter)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-graphql-datetime-kickstart-spring-boot-starter failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-kickstart-spring-boot-starter,"* ]]; then + result="$(result_for_job velnor-gradle-graphql-datetime-kickstart-spring-boot-starter)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-kickstart-spring-boot-starter did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-kickstart-spring-boot-starter did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-graphql-datetime-kickstart-spring-boot-starter)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-graphql-datetime-kickstart-spring-boot-starter failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-spring-boot-autoconfigure,"* ]]; then + result="$(result_for_job github-gradle-graphql-datetime-spring-boot-autoconfigure)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-graphql-datetime-spring-boot-autoconfigure did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-graphql-datetime-spring-boot-autoconfigure did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-graphql-datetime-spring-boot-autoconfigure)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-graphql-datetime-spring-boot-autoconfigure failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-spring-boot-autoconfigure,"* ]]; then + result="$(result_for_job velnor-gradle-graphql-datetime-spring-boot-autoconfigure)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-spring-boot-autoconfigure did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-spring-boot-autoconfigure did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-graphql-datetime-spring-boot-autoconfigure)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-graphql-datetime-spring-boot-autoconfigure failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-spring-boot-common,"* ]]; then + result="$(result_for_job github-gradle-graphql-datetime-spring-boot-common)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-graphql-datetime-spring-boot-common did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-graphql-datetime-spring-boot-common did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-graphql-datetime-spring-boot-common)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-graphql-datetime-spring-boot-common failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-spring-boot-common,"* ]]; then + result="$(result_for_job velnor-gradle-graphql-datetime-spring-boot-common)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-spring-boot-common did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-spring-boot-common did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-graphql-datetime-spring-boot-common)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-graphql-datetime-spring-boot-common failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-spring-boot-starter,"* ]]; then + result="$(result_for_job github-gradle-graphql-datetime-spring-boot-starter)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-graphql-datetime-spring-boot-starter did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-graphql-datetime-spring-boot-starter did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-graphql-datetime-spring-boot-starter)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-graphql-datetime-spring-boot-starter failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-datetime-spring-boot-starter,"* ]]; then + result="$(result_for_job velnor-gradle-graphql-datetime-spring-boot-starter)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-spring-boot-starter did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-graphql-datetime-spring-boot-starter did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-graphql-datetime-spring-boot-starter)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-graphql-datetime-spring-boot-starter failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-java-datetime,"* ]]; then + result="$(result_for_job github-gradle-graphql-java-datetime)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-graphql-java-datetime did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-graphql-java-datetime did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-graphql-java-datetime)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-graphql-java-datetime failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-graphql-java-datetime,"* ]]; then + result="$(result_for_job velnor-gradle-graphql-java-datetime)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-graphql-java-datetime did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-graphql-java-datetime did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-graphql-java-datetime)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-graphql-java-datetime failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-samples-dgs-webmvc,"* ]]; then + result="$(result_for_job github-gradle-samples-dgs-webmvc)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-samples-dgs-webmvc did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-samples-dgs-webmvc did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-samples-dgs-webmvc)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-samples-dgs-webmvc failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-samples-dgs-webmvc,"* ]]; then + result="$(result_for_job velnor-gradle-samples-dgs-webmvc)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-samples-dgs-webmvc did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-samples-dgs-webmvc did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-samples-dgs-webmvc)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-samples-dgs-webmvc failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-samples-kickstart-webflux,"* ]]; then + result="$(result_for_job github-gradle-samples-kickstart-webflux)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-samples-kickstart-webflux did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-samples-kickstart-webflux did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-samples-kickstart-webflux)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-samples-kickstart-webflux failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-samples-kickstart-webflux,"* ]]; then + result="$(result_for_job velnor-gradle-samples-kickstart-webflux)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-samples-kickstart-webflux did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-samples-kickstart-webflux did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-samples-kickstart-webflux)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-samples-kickstart-webflux failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-samples-kickstart-webmvc,"* ]]; then + result="$(result_for_job github-gradle-samples-kickstart-webmvc)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-samples-kickstart-webmvc did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-samples-kickstart-webmvc did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-samples-kickstart-webmvc)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-samples-kickstart-webmvc failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-samples-kickstart-webmvc,"* ]]; then + result="$(result_for_job velnor-gradle-samples-kickstart-webmvc)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-samples-kickstart-webmvc did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-samples-kickstart-webmvc did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-samples-kickstart-webmvc)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-samples-kickstart-webmvc failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-samples-spring-boot-webmvc,"* ]]; then + result="$(result_for_job github-gradle-samples-spring-boot-webmvc)" + if [[ "$FORK_PR" == true && false ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job github-gradle-samples-spring-boot-webmvc did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job github-gradle-samples-spring-boot-webmvc did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job github-gradle-samples-spring-boot-webmvc)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job github-gradle-samples-spring-boot-webmvc failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + if [[ "$selected" == *",gradle-samples-spring-boot-webmvc,"* ]]; then + result="$(result_for_job velnor-gradle-samples-spring-boot-webmvc)" + if [[ "$FORK_PR" == true && true ]]; then + case "$result" in + success|skipped) ;; + *) echo "selected CI job velnor-gradle-samples-spring-boot-webmvc did not pass: $result" >&2; exit 1 ;; + esac + else + case "$result" in + success) ;; + *) echo "selected CI job velnor-gradle-samples-spring-boot-webmvc did not pass: $result" >&2; exit 1 ;; + esac + fi + else + result="$(result_for_job velnor-gradle-samples-spring-boot-webmvc)" + case "$result" in + success|skipped) ;; + *) echo "unselected CI job velnor-gradle-samples-spring-boot-webmvc failed unexpectedly: $result" >&2; exit 1 ;; + esac + fi + required: + name: "Control / Required" + if: ${{ always() }} + needs: [ci-required] + runs-on: ubuntu-24.04 + timeout-minutes: 5 + steps: + - name: Mirror CI / Required + if: ${{ needs.ci-required.result != 'success' }} + run: exit 1 diff --git a/.github/workflows/ci-unit-gradle.yml b/.github/workflows/ci-unit-gradle.yml new file mode 100644 index 0000000..594481e --- /dev/null +++ b/.github/workflows/ci-unit-gradle.yml @@ -0,0 +1,2994 @@ +# Generated by velnor-workflow. Regenerate; do not hand-edit. +name: "Gradle / Projects" +on: + workflow_call: + inputs: + unit: + required: true + type: string + selected_units: + required: true + type: string + scope: + required: true + type: string + full_units: + required: true + type: string + base_sha: + required: true + type: string + head_sha: + required: true + type: string + lane: + required: true + type: string + +jobs: + verify-github: + name: GitHub + if: ${{ inputs.lane == 'github' && (contains(format(',{0},', inputs.selected_units), ',gradle,') || contains(format(',{0},', inputs.selected_units), ',gradle-buildsrc,') || contains(format(',{0},', inputs.selected_units), ',gradle-graphql-datetime-dgs-autoconfigure,') || contains(format(',{0},', inputs.selected_units), ',gradle-graphql-datetime-dgs-starter,') || contains(format(',{0},', inputs.selected_units), ',gradle-graphql-datetime-kickstart-spring-boot-starter,') || contains(format(',{0},', inputs.selected_units), ',gradle-graphql-datetime-spring-boot-autoconfigure,') || contains(format(',{0},', inputs.selected_units), ',gradle-graphql-datetime-spring-boot-common,') || contains(format(',{0},', inputs.selected_units), ',gradle-graphql-datetime-spring-boot-starter,') || contains(format(',{0},', inputs.selected_units), ',gradle-graphql-java-datetime,') || contains(format(',{0},', inputs.selected_units), ',gradle-samples-dgs-webmvc,') || contains(format(',{0},', inputs.selected_units), ',gradle-samples-kickstart-webflux,') || contains(format(',{0},', inputs.selected_units), ',gradle-samples-kickstart-webmvc,') || contains(format(',{0},', inputs.selected_units), ',gradle-samples-spring-boot-webmvc,')) && (github.event_name == 'pull_request' || (github.ref == 'refs/heads/main' && (github.event_name == 'push' || github.event_name == 'schedule')) || (github.event_name == 'workflow_dispatch' && (github.event.inputs.runner == 'github' || github.event.inputs.runner == 'both' || github.event.inputs.runner == ''))) }} + runs-on: ubuntu-24.04 + timeout-minutes: 45 + steps: + - name: Mark CI job start + if: always() + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/JOB_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Checkout + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + ref: ${{ inputs.head_sha }} + - name: Set up Velnor workflow runtime + if: ${{ runner.environment == 'github-hosted' }} + - name: Download Velnor workflow runtime + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: velnor-workflow-runtime-e6fabca85499be62f939243d4452438449b69c53-${{ runner.os }}-${{ runner.arch }} + path: .velnor-workflow-runtime + - name: Verify Velnor workflow runtime + shell: bash + env: + EXPECTED_REVISION: e6fabca85499be62f939243d4452438449b69c53 + run: | + set -euo pipefail + manifest=.velnor-workflow-runtime/manifest.json + jq -e --arg revision "$EXPECTED_REVISION" --arg repository "$GITHUB_REPOSITORY" --arg platform "${RUNNER_OS}-${RUNNER_ARCH}" --arg run_id "$GITHUB_RUN_ID" '.revision == $revision and .repository == $repository and .platform == $platform and .run_id == $run_id and (.run_id | test("^[0-9]+$")) and .job_id != "" and (.binary_sha256 | test("^[0-9a-f]{64}$"))' "$manifest" >/dev/null + expected="$(jq -er '.binary_sha256' "$manifest")" + actual="$(sha256sum .velnor-workflow-runtime/velnor-workflow | awk '{print $1}')" + [[ "$actual" == "$expected" ]] || { echo "::error::runtime digest mismatch" >&2; exit 1; } + - name: Add Velnor workflow runtime to PATH + shell: bash + run: | + set -euo pipefail + install -Dm0755 .velnor-workflow-runtime/velnor-workflow "$HOME/.cargo/bin/velnor-workflow" + echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" + - name: Mark runner setup end + if: always() + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/RUNNER_SETUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Materialize Velnor CI selection + shell: bash + env: + SELECTION_BASE_SHA: ${{ inputs.base_sha }} + SELECTION_HEAD_SHA: ${{ inputs.head_sha }} + SELECTION_SCOPE: ${{ inputs.scope }} + SELECTION_UNITS: ${{ inputs.selected_units }} + SELECTION_FULL_UNITS: ${{ inputs.full_units }} + run: | + set -euo pipefail + mkdir -p .velnor-ci-selection + { + printf 'version=1\n' + printf 'base_sha=%s\n' "$SELECTION_BASE_SHA" + printf 'head_sha=%s\n' "$SELECTION_HEAD_SHA" + printf 'scope=%s\n' "$SELECTION_SCOPE" + printf 'units=%s\n' "$SELECTION_UNITS" + printf 'full_units=%s\n' "$SELECTION_FULL_UNITS" + } > .velnor-ci-selection/velnor-ci-selection + - name: Mark selection transport end + if: always() + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/SELECTION_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Set up Gradle + if: ${{ inputs.unit == 'gradle' }} + uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore Gradle cache + if: ${{ inputs.unit == 'gradle' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run Gradle checks + if: ${{ inputs.unit == 'gradle' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Save Gradle cache + if: ${{ inputs.unit == 'gradle' && (always() && ((github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main')) && steps.cache.outputs.cache-hit != 'true') }} + uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle' && (always()) }} + env: + VELNOR_CI_LANE: github + VELNOR_CACHE_CARGO_PRIMARY: ${{ steps.cache.outputs.cache-primary-key }} + VELNOR_CACHE_CARGO_MATCHED: ${{ steps.cache.outputs.cache-matched-key }} + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle + - name: Set up Gradle + if: ${{ inputs.unit == 'gradle-buildsrc' }} + uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-buildsrc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (buildSrc)" cache + if: ${{ inputs.unit == 'gradle-buildsrc' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('buildSrc/gradle/wrapper/gradle-wrapper.properties', 'buildSrc/gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-buildsrc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-buildsrc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (buildSrc)" checks + if: ${{ inputs.unit == 'gradle-buildsrc' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Save "Gradle (buildSrc)" cache + if: ${{ inputs.unit == 'gradle-buildsrc' && (always() && ((github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main')) && steps.cache.outputs.cache-hit != 'true') }} + uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('buildSrc/gradle/wrapper/gradle-wrapper.properties', 'buildSrc/gradle/libs.versions.toml') }} + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-buildsrc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-buildsrc' && (always()) }} + env: + VELNOR_CI_LANE: github + VELNOR_CACHE_CARGO_PRIMARY: ${{ steps.cache.outputs.cache-primary-key }} + VELNOR_CACHE_CARGO_MATCHED: ${{ steps.cache.outputs.cache-matched-key }} + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-buildsrc + - name: Set up Gradle + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-autoconfigure' }} + uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-autoconfigure' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (graphql-datetime-dgs-autoconfigure)" cache + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-autoconfigure' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-autoconfigure' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-autoconfigure' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (graphql-datetime-dgs-autoconfigure)" checks + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-autoconfigure' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Save "Gradle (graphql-datetime-dgs-autoconfigure)" cache + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-autoconfigure' && (always() && ((github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main')) && steps.cache.outputs.cache-hit != 'true') }} + uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-autoconfigure' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-autoconfigure' && (always()) }} + env: + VELNOR_CI_LANE: github + VELNOR_CACHE_CARGO_PRIMARY: ${{ steps.cache.outputs.cache-primary-key }} + VELNOR_CACHE_CARGO_MATCHED: ${{ steps.cache.outputs.cache-matched-key }} + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-graphql-datetime-dgs-autoconfigure + - name: Set up Gradle + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-starter' }} + uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (graphql-datetime-dgs-starter)" cache + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-starter' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (graphql-datetime-dgs-starter)" checks + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-starter' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Save "Gradle (graphql-datetime-dgs-starter)" cache + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-starter' && (always() && ((github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main')) && steps.cache.outputs.cache-hit != 'true') }} + uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-starter' && (always()) }} + env: + VELNOR_CI_LANE: github + VELNOR_CACHE_CARGO_PRIMARY: ${{ steps.cache.outputs.cache-primary-key }} + VELNOR_CACHE_CARGO_MATCHED: ${{ steps.cache.outputs.cache-matched-key }} + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-graphql-datetime-dgs-starter + - name: Set up Gradle + if: ${{ inputs.unit == 'gradle-graphql-datetime-kickstart-spring-boot-starter' }} + uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-graphql-datetime-kickstart-spring-boot-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (graphql-datetime-kickstart-spring-boot-starter)" cache + if: ${{ inputs.unit == 'gradle-graphql-datetime-kickstart-spring-boot-starter' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-graphql-datetime-kickstart-spring-boot-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-graphql-datetime-kickstart-spring-boot-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (graphql-datetime-kickstart-spring-boot-starter)" checks + if: ${{ inputs.unit == 'gradle-graphql-datetime-kickstart-spring-boot-starter' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Save "Gradle (graphql-datetime-kickstart-spring-boot-starter)" cache + if: ${{ inputs.unit == 'gradle-graphql-datetime-kickstart-spring-boot-starter' && (always() && ((github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main')) && steps.cache.outputs.cache-hit != 'true') }} + uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-graphql-datetime-kickstart-spring-boot-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-graphql-datetime-kickstart-spring-boot-starter' && (always()) }} + env: + VELNOR_CI_LANE: github + VELNOR_CACHE_CARGO_PRIMARY: ${{ steps.cache.outputs.cache-primary-key }} + VELNOR_CACHE_CARGO_MATCHED: ${{ steps.cache.outputs.cache-matched-key }} + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-graphql-datetime-kickstart-spring-boot-starter + - name: Set up Gradle + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-autoconfigure' }} + uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-autoconfigure' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (graphql-datetime-spring-boot-autoconfigure)" cache + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-autoconfigure' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-autoconfigure' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-autoconfigure' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (graphql-datetime-spring-boot-autoconfigure)" checks + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-autoconfigure' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Save "Gradle (graphql-datetime-spring-boot-autoconfigure)" cache + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-autoconfigure' && (always() && ((github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main')) && steps.cache.outputs.cache-hit != 'true') }} + uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-autoconfigure' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-autoconfigure' && (always()) }} + env: + VELNOR_CI_LANE: github + VELNOR_CACHE_CARGO_PRIMARY: ${{ steps.cache.outputs.cache-primary-key }} + VELNOR_CACHE_CARGO_MATCHED: ${{ steps.cache.outputs.cache-matched-key }} + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-graphql-datetime-spring-boot-autoconfigure + - name: Set up Gradle + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-common' }} + uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-common' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (graphql-datetime-spring-boot-common)" cache + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-common' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-common' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-common' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (graphql-datetime-spring-boot-common)" checks + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-common' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Save "Gradle (graphql-datetime-spring-boot-common)" cache + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-common' && (always() && ((github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main')) && steps.cache.outputs.cache-hit != 'true') }} + uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-common' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-common' && (always()) }} + env: + VELNOR_CI_LANE: github + VELNOR_CACHE_CARGO_PRIMARY: ${{ steps.cache.outputs.cache-primary-key }} + VELNOR_CACHE_CARGO_MATCHED: ${{ steps.cache.outputs.cache-matched-key }} + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-graphql-datetime-spring-boot-common + - name: Set up Gradle + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-starter' }} + uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (graphql-datetime-spring-boot-starter)" cache + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-starter' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (graphql-datetime-spring-boot-starter)" checks + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-starter' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Save "Gradle (graphql-datetime-spring-boot-starter)" cache + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-starter' && (always() && ((github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main')) && steps.cache.outputs.cache-hit != 'true') }} + uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-starter' && (always()) }} + env: + VELNOR_CI_LANE: github + VELNOR_CACHE_CARGO_PRIMARY: ${{ steps.cache.outputs.cache-primary-key }} + VELNOR_CACHE_CARGO_MATCHED: ${{ steps.cache.outputs.cache-matched-key }} + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-graphql-datetime-spring-boot-starter + - name: Set up Gradle + if: ${{ inputs.unit == 'gradle-graphql-java-datetime' }} + uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-graphql-java-datetime' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (graphql-java-datetime)" cache + if: ${{ inputs.unit == 'gradle-graphql-java-datetime' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-graphql-java-datetime' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-graphql-java-datetime' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (graphql-java-datetime)" checks + if: ${{ inputs.unit == 'gradle-graphql-java-datetime' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Save "Gradle (graphql-java-datetime)" cache + if: ${{ inputs.unit == 'gradle-graphql-java-datetime' && (always() && ((github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main')) && steps.cache.outputs.cache-hit != 'true') }} + uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-graphql-java-datetime' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-graphql-java-datetime' && (always()) }} + env: + VELNOR_CI_LANE: github + VELNOR_CACHE_CARGO_PRIMARY: ${{ steps.cache.outputs.cache-primary-key }} + VELNOR_CACHE_CARGO_MATCHED: ${{ steps.cache.outputs.cache-matched-key }} + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-graphql-java-datetime + - name: Set up Gradle + if: ${{ inputs.unit == 'gradle-samples-dgs-webmvc' }} + uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-samples-dgs-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (samples/dgs-webmvc)" cache + if: ${{ inputs.unit == 'gradle-samples-dgs-webmvc' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-samples-dgs-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-samples-dgs-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (samples/dgs-webmvc)" checks + if: ${{ inputs.unit == 'gradle-samples-dgs-webmvc' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Save "Gradle (samples/dgs-webmvc)" cache + if: ${{ inputs.unit == 'gradle-samples-dgs-webmvc' && (always() && ((github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main')) && steps.cache.outputs.cache-hit != 'true') }} + uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-samples-dgs-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-samples-dgs-webmvc' && (always()) }} + env: + VELNOR_CI_LANE: github + VELNOR_CACHE_CARGO_PRIMARY: ${{ steps.cache.outputs.cache-primary-key }} + VELNOR_CACHE_CARGO_MATCHED: ${{ steps.cache.outputs.cache-matched-key }} + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-samples-dgs-webmvc + - name: Set up Gradle + if: ${{ inputs.unit == 'gradle-samples-kickstart-webflux' }} + uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-samples-kickstart-webflux' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (samples/kickstart-webflux)" cache + if: ${{ inputs.unit == 'gradle-samples-kickstart-webflux' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-samples-kickstart-webflux' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-samples-kickstart-webflux' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (samples/kickstart-webflux)" checks + if: ${{ inputs.unit == 'gradle-samples-kickstart-webflux' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Save "Gradle (samples/kickstart-webflux)" cache + if: ${{ inputs.unit == 'gradle-samples-kickstart-webflux' && (always() && ((github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main')) && steps.cache.outputs.cache-hit != 'true') }} + uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-samples-kickstart-webflux' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-samples-kickstart-webflux' && (always()) }} + env: + VELNOR_CI_LANE: github + VELNOR_CACHE_CARGO_PRIMARY: ${{ steps.cache.outputs.cache-primary-key }} + VELNOR_CACHE_CARGO_MATCHED: ${{ steps.cache.outputs.cache-matched-key }} + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-samples-kickstart-webflux + - name: Set up Gradle + if: ${{ inputs.unit == 'gradle-samples-kickstart-webmvc' }} + uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-samples-kickstart-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (samples/kickstart-webmvc)" cache + if: ${{ inputs.unit == 'gradle-samples-kickstart-webmvc' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-samples-kickstart-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-samples-kickstart-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (samples/kickstart-webmvc)" checks + if: ${{ inputs.unit == 'gradle-samples-kickstart-webmvc' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Save "Gradle (samples/kickstart-webmvc)" cache + if: ${{ inputs.unit == 'gradle-samples-kickstart-webmvc' && (always() && ((github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main')) && steps.cache.outputs.cache-hit != 'true') }} + uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-samples-kickstart-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-samples-kickstart-webmvc' && (always()) }} + env: + VELNOR_CI_LANE: github + VELNOR_CACHE_CARGO_PRIMARY: ${{ steps.cache.outputs.cache-primary-key }} + VELNOR_CACHE_CARGO_MATCHED: ${{ steps.cache.outputs.cache-matched-key }} + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-samples-kickstart-webmvc + - name: Set up Gradle + if: ${{ inputs.unit == 'gradle-samples-spring-boot-webmvc' }} + uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-samples-spring-boot-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (samples/spring-boot-webmvc)" cache + if: ${{ inputs.unit == 'gradle-samples-spring-boot-webmvc' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-samples-spring-boot-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-samples-spring-boot-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (samples/spring-boot-webmvc)" checks + if: ${{ inputs.unit == 'gradle-samples-spring-boot-webmvc' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Save "Gradle (samples/spring-boot-webmvc)" cache + if: ${{ inputs.unit == 'gradle-samples-spring-boot-webmvc' && (always() && ((github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main')) && steps.cache.outputs.cache-hit != 'true') }} + uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-samples-spring-boot-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-samples-spring-boot-webmvc' && (always()) }} + env: + VELNOR_CI_LANE: github + VELNOR_CACHE_CARGO_PRIMARY: ${{ steps.cache.outputs.cache-primary-key }} + VELNOR_CACHE_CARGO_MATCHED: ${{ steps.cache.outputs.cache-matched-key }} + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-samples-spring-boot-webmvc + verify-velnor: + name: Velnor + if: ${{ inputs.lane == 'velnor' && (contains(format(',{0},', inputs.selected_units), ',gradle,') || contains(format(',{0},', inputs.selected_units), ',gradle-buildsrc,') || contains(format(',{0},', inputs.selected_units), ',gradle-graphql-datetime-dgs-autoconfigure,') || contains(format(',{0},', inputs.selected_units), ',gradle-graphql-datetime-dgs-starter,') || contains(format(',{0},', inputs.selected_units), ',gradle-graphql-datetime-kickstart-spring-boot-starter,') || contains(format(',{0},', inputs.selected_units), ',gradle-graphql-datetime-spring-boot-autoconfigure,') || contains(format(',{0},', inputs.selected_units), ',gradle-graphql-datetime-spring-boot-common,') || contains(format(',{0},', inputs.selected_units), ',gradle-graphql-datetime-spring-boot-starter,') || contains(format(',{0},', inputs.selected_units), ',gradle-graphql-java-datetime,') || contains(format(',{0},', inputs.selected_units), ',gradle-samples-dgs-webmvc,') || contains(format(',{0},', inputs.selected_units), ',gradle-samples-kickstart-webflux,') || contains(format(',{0},', inputs.selected_units), ',gradle-samples-kickstart-webmvc,') || contains(format(',{0},', inputs.selected_units), ',gradle-samples-spring-boot-webmvc,')) && (github.ref == 'refs/heads/main' && (github.event_name == 'push' || github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && (github.event.inputs.runner == 'velnor' || github.event.inputs.runner == 'both' || github.event.inputs.runner == '')))) }} + runs-on: [self-hosted, velnor-target-mvp] + timeout-minutes: 45 + steps: + - name: Mark CI job start + if: always() + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/JOB_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Checkout + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + ref: ${{ inputs.head_sha }} + - name: Velnor runner identity + shell: bash + run: | + set -euo pipefail + { + echo '## Velnor runner identity' + echo + echo "- Host: ${VELNOR_HOST:-unset}" + echo "- Instance: ${VELNOR_INSTANCE:-unset}" + echo "- Slot: ${VELNOR_SLOT:-unset}" + echo "- GitHub runner: ${RUNNER_NAME:-unset}" + echo "- OS/arch: ${RUNNER_OS:-unset}/${RUNNER_ARCH:-unset}" + echo "- Execution backend: ${VELNOR_EXECUTION_BACKEND:-unset}" + echo "- Velnor version: ${VELNOR_MANIFEST_VERSION:-${VELNOR_SOURCE_SHA:-unset}}" + } | tee -a "${GITHUB_STEP_SUMMARY:-/dev/null}" + - name: Mark runner setup end + if: always() + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/RUNNER_SETUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Materialize Velnor CI selection + shell: bash + env: + SELECTION_BASE_SHA: ${{ inputs.base_sha }} + SELECTION_HEAD_SHA: ${{ inputs.head_sha }} + SELECTION_SCOPE: ${{ inputs.scope }} + SELECTION_UNITS: ${{ inputs.selected_units }} + SELECTION_FULL_UNITS: ${{ inputs.full_units }} + run: | + set -euo pipefail + mkdir -p .velnor-ci-selection + { + printf 'version=1\n' + printf 'base_sha=%s\n' "$SELECTION_BASE_SHA" + printf 'head_sha=%s\n' "$SELECTION_HEAD_SHA" + printf 'scope=%s\n' "$SELECTION_SCOPE" + printf 'units=%s\n' "$SELECTION_UNITS" + printf 'full_units=%s\n' "$SELECTION_FULL_UNITS" + } > .velnor-ci-selection/velnor-ci-selection + - name: Mark selection transport end + if: always() + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/SELECTION_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore Gradle cache + if: ${{ inputs.unit == 'gradle' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run Gradle checks + if: ${{ inputs.unit == 'gradle' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle' && (always()) }} + env: + VELNOR_CI_LANE: velnor + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-buildsrc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (buildSrc)" cache + if: ${{ inputs.unit == 'gradle-buildsrc' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('buildSrc/gradle/wrapper/gradle-wrapper.properties', 'buildSrc/gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-buildsrc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-buildsrc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (buildSrc)" checks + if: ${{ inputs.unit == 'gradle-buildsrc' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-buildsrc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-buildsrc' && (always()) }} + env: + VELNOR_CI_LANE: velnor + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-buildsrc + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-autoconfigure' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (graphql-datetime-dgs-autoconfigure)" cache + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-autoconfigure' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-autoconfigure' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-autoconfigure' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (graphql-datetime-dgs-autoconfigure)" checks + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-autoconfigure' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-autoconfigure' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-autoconfigure' && (always()) }} + env: + VELNOR_CI_LANE: velnor + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-graphql-datetime-dgs-autoconfigure + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (graphql-datetime-dgs-starter)" cache + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-starter' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (graphql-datetime-dgs-starter)" checks + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-starter' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-graphql-datetime-dgs-starter' && (always()) }} + env: + VELNOR_CI_LANE: velnor + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-graphql-datetime-dgs-starter + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-graphql-datetime-kickstart-spring-boot-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (graphql-datetime-kickstart-spring-boot-starter)" cache + if: ${{ inputs.unit == 'gradle-graphql-datetime-kickstart-spring-boot-starter' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-graphql-datetime-kickstart-spring-boot-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-graphql-datetime-kickstart-spring-boot-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (graphql-datetime-kickstart-spring-boot-starter)" checks + if: ${{ inputs.unit == 'gradle-graphql-datetime-kickstart-spring-boot-starter' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-graphql-datetime-kickstart-spring-boot-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-graphql-datetime-kickstart-spring-boot-starter' && (always()) }} + env: + VELNOR_CI_LANE: velnor + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-graphql-datetime-kickstart-spring-boot-starter + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-autoconfigure' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (graphql-datetime-spring-boot-autoconfigure)" cache + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-autoconfigure' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-autoconfigure' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-autoconfigure' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (graphql-datetime-spring-boot-autoconfigure)" checks + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-autoconfigure' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-autoconfigure' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-autoconfigure' && (always()) }} + env: + VELNOR_CI_LANE: velnor + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-graphql-datetime-spring-boot-autoconfigure + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-common' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (graphql-datetime-spring-boot-common)" cache + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-common' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-common' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-common' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (graphql-datetime-spring-boot-common)" checks + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-common' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-common' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-common' && (always()) }} + env: + VELNOR_CI_LANE: velnor + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-graphql-datetime-spring-boot-common + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (graphql-datetime-spring-boot-starter)" cache + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-starter' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (graphql-datetime-spring-boot-starter)" checks + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-starter' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-starter' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-graphql-datetime-spring-boot-starter' && (always()) }} + env: + VELNOR_CI_LANE: velnor + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-graphql-datetime-spring-boot-starter + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-graphql-java-datetime' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (graphql-java-datetime)" cache + if: ${{ inputs.unit == 'gradle-graphql-java-datetime' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-graphql-java-datetime' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-graphql-java-datetime' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (graphql-java-datetime)" checks + if: ${{ inputs.unit == 'gradle-graphql-java-datetime' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-graphql-java-datetime' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-graphql-java-datetime' && (always()) }} + env: + VELNOR_CI_LANE: velnor + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-graphql-java-datetime + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-samples-dgs-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (samples/dgs-webmvc)" cache + if: ${{ inputs.unit == 'gradle-samples-dgs-webmvc' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-samples-dgs-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-samples-dgs-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (samples/dgs-webmvc)" checks + if: ${{ inputs.unit == 'gradle-samples-dgs-webmvc' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-samples-dgs-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-samples-dgs-webmvc' && (always()) }} + env: + VELNOR_CI_LANE: velnor + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-samples-dgs-webmvc + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-samples-kickstart-webflux' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (samples/kickstart-webflux)" cache + if: ${{ inputs.unit == 'gradle-samples-kickstart-webflux' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-samples-kickstart-webflux' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-samples-kickstart-webflux' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (samples/kickstart-webflux)" checks + if: ${{ inputs.unit == 'gradle-samples-kickstart-webflux' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-samples-kickstart-webflux' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-samples-kickstart-webflux' && (always()) }} + env: + VELNOR_CI_LANE: velnor + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-samples-kickstart-webflux + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-samples-kickstart-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (samples/kickstart-webmvc)" cache + if: ${{ inputs.unit == 'gradle-samples-kickstart-webmvc' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-samples-kickstart-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-samples-kickstart-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (samples/kickstart-webmvc)" checks + if: ${{ inputs.unit == 'gradle-samples-kickstart-webmvc' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-samples-kickstart-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-samples-kickstart-webmvc' && (always()) }} + env: + VELNOR_CI_LANE: velnor + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-samples-kickstart-webmvc + - name: Mark tool bootstrap end + if: ${{ inputs.unit == 'gradle-samples-spring-boot-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/TOOL_BOOTSTRAP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Restore "Gradle (samples/spring-boot-webmvc)" cache + if: ${{ inputs.unit == 'gradle-samples-spring-boot-webmvc' }} + id: cache + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ci-${{ runner.os }}-${{ runner.arch }}-gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} + restore-keys: | + ci-${{ runner.os }}-${{ runner.arch }}-gradle- + - name: Mark cache prep end + if: ${{ inputs.unit == 'gradle-samples-spring-boot-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CACHE_PREP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Mark cargo fetch end + if: ${{ inputs.unit == 'gradle-samples-spring-boot-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CARGO_FETCH_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Run "Gradle (samples/spring-boot-webmvc)" checks + if: ${{ inputs.unit == 'gradle-samples-spring-boot-webmvc' }} + env: + CI_SCOPE: ${{ inputs.scope }} + CI_UNIT_ID: ${{ inputs.unit }} + EVENT_NAME: ${{ github.event_name }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + VELNOR_SELECTION_FILE: .velnor-ci-selection/velnor-ci-selection + MISE_AUTO_INSTALL: "false" + MISE_EXEC_AUTO_INSTALL: "false" + MISE_NOT_FOUND_AUTO_INSTALL: "false" + run: | + set -o pipefail + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_STARTED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + rc=0 + velnor-workflow run --config .github/ci/project.toml --scope "$CI_SCOPE" --unit "$CI_UNIT_ID" 2>&1 | tee "$RUNNER_TEMP/velnor-unit-log.txt" || rc=$? + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CHECKS_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + exit $rc + - name: Mark cleanup end + if: ${{ inputs.unit == 'gradle-samples-spring-boot-webmvc' && (always()) }} + run: | + timing_dir="$RUNNER_TEMP/velnor-ci-timing-${GITHUB_RUN_ID:-unknown}-${GITHUB_RUN_ATTEMPT:-0}-${GITHUB_JOB:-unknown}" + umask 077 + mkdir -p "$timing_dir" + marker="$timing_dir/CLEANUP_ENDED" + if [[ ! -e "$marker" ]]; then + if (set -C; printf '%s\n' "$(date +%s)" > "$marker") 2>/dev/null; then + chmod 0444 "$marker" 2>/dev/null || true + fi + fi + - name: Report phase timings and cache outcomes + if: ${{ inputs.unit == 'gradle-samples-spring-boot-webmvc' && (always()) }} + env: + VELNOR_CI_LANE: velnor + uses: ./.github/actions/report-velnor-ci-outcomes + with: + job_label: gradle-samples-spring-boot-webmvc diff --git a/.github/workflows/maintenance.yml b/.github/workflows/maintenance.yml new file mode 100644 index 0000000..9d1c281 --- /dev/null +++ b/.github/workflows/maintenance.yml @@ -0,0 +1,269 @@ +# Generated by velnor-workflow. Regenerate; do not hand-edit. +name: Maintenance +run-name: Maintenance · ${{ github.event_name }} + +on: + pull_request: + types: [closed] + schedule: + - cron: '31 3 * * *' + workflow_dispatch: + inputs: + pull_request_number: + description: Optional closed PR number whose merge cache should be removed + required: false + type: string + +permissions: + actions: write + contents: read + +concurrency: + group: maintenance-${{ github.repository }}-${{ github.event.pull_request.number || inputs.pull_request_number || github.run_id }} + cancel-in-progress: false + +jobs: + prune-pr-cache: + name: Prune closed-PR cache + if: ${{ github.event_name == 'pull_request' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main' && inputs.pull_request_number != '') }} + runs-on: ubuntu-24.04 + timeout-minutes: 15 + steps: + - name: Delete merge-ref cache namespace + env: + GH_TOKEN: ${{ github.token }} + PR_NUMBER: ${{ github.event.pull_request.number || inputs.pull_request_number }} + run: | + set -euo pipefail + ref="refs/pull/$PR_NUMBER/merge" + encoded="$(printf '%s' "$ref" | jq -sRr @uri)" + cache_ids="$(gh api --paginate "repos/$GITHUB_REPOSITORY/actions/caches?ref=$encoded" --jq '.actions_caches[].id')" + if [[ -z "$cache_ids" ]]; then + echo "No merge-ref cache entries found for $ref" + exit 0 + fi + failed=0 + while IFS= read -r id; do + [[ -z "$id" ]] && continue + deleted=false + for delay in 1 2 4 8; do + if gh api --method DELETE "repos/$GITHUB_REPOSITORY/actions/caches/$id" >/dev/null 2>&1; then + deleted=true + break + fi + sleep "$delay" + done + if [[ "$deleted" != true ]]; then + failed=$((failed + 1)) + echo "::error::failed to delete cache id $id after retries" >&2 + fi + done <<< "$cache_ids" + if (( failed > 0 )); then + echo "::error::$failed closed-PR cache entries could not be deleted; rerun maintenance" >&2 + exit 1 + fi + cache-budget: + name: Cache retention + if: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} + runs-on: ubuntu-24.04 + timeout-minutes: 10 + permissions: + contents: read + actions: write + pull-requests: read + steps: + - name: Skip while CI producers are running + id: retention-gate + env: + GH_TOKEN: ${{ github.token }} + run: | + set -euo pipefail + for workflow in ci-main.yml nightly.yml; do + if [[ "$(gh run list --workflow "$workflow" --status in_progress --limit 1 --jq 'length')" != "0" ]]; then + echo "skip=true" >> "$GITHUB_OUTPUT" + echo "$workflow is in_progress; skipping cache retention" >> "$GITHUB_STEP_SUMMARY" + exit 0 + fi + done + echo "skip=false" >> "$GITHUB_OUTPUT" + - name: Set up Velnor workflow runtime + if: ${{ steps.retention-gate.outputs.skip != 'true' && runner.environment == 'github-hosted' }} + uses: tailrocks/velnor/.github/actions/setup-velnor-workflow@e6fabca85499be62f939243d4452438449b69c53 + with: + rev: e6fabca85499be62f939243d4452438449b69c53 + - name: Set trusted workflow policy revision + if: steps.retention-gate.outputs.skip != 'true' + run: echo "VELNOR_WORKFLOW_POLICY_REVISION=e6fabca85499be62f939243d4452438449b69c53" >> "$GITHUB_ENV" + - name: Sweep closed-PR merge-ref caches + if: steps.retention-gate.outputs.skip != 'true' + env: + GH_TOKEN: ${{ github.token }} + run: | + set -euo pipefail + failed=0 + mapfile -t refs < <(gh api --paginate "repos/$GITHUB_REPOSITORY/actions/caches?per_page=100" \ + --jq '.actions_caches[].ref' | grep -E '^refs/pull/[0-9]+/merge$' | sort -u) + if ((${#refs[@]} == 0)); then + echo "No merge-ref cache scopes found" + exit 0 + fi + for ref in "${refs[@]}"; do + pr="${ref#refs/pull/}" + pr="${pr%/merge}" + state="$(gh pr view "$pr" --json state --jq .state 2>/dev/null || echo unknown)" + if [[ "$state" != "CLOSED" ]]; then + continue + fi + encoded="$(printf '%s' "$ref" | jq -sRr @uri)" + mapfile -t cache_ids < <(gh api --paginate "repos/$GITHUB_REPOSITORY/actions/caches?ref=$encoded" \ + --jq '.actions_caches[].id') + if ((${#cache_ids[@]} == 0)); then + continue + fi + echo "Sweeping $ref ($pr): ${#cache_ids[@]} entries" + for id in "${cache_ids[@]}"; do + deleted=false + for delay in 1 2 4 8; do + if gh api --method DELETE "repos/$GITHUB_REPOSITORY/actions/caches/$id" >/dev/null 2>&1; then + deleted=true + break + fi + sleep "$delay" + done + if [[ "$deleted" != true ]]; then + failed=$((failed + 1)) + echo "::error::failed to delete cache id $id for $ref after retries" >&2 + fi + done + done + if (( failed > 0 )); then + echo "::error::$failed closed-PR merge-ref cache entries could not be deleted; rerun maintenance" >&2 + exit 1 + fi + - name: Collect Actions cache account + if: steps.retention-gate.outputs.skip != 'true' + env: + GH_TOKEN: ${{ github.token }} + run: | + set -euo pipefail + mkdir -p "$RUNNER_TEMP/cache-retention" + gh api --paginate "repos/$GITHUB_REPOSITORY/actions/caches?per_page=100" \ + --jq '.actions_caches[] | {id, key, size_in_bytes, created_at, last_accessed_at}' \ + > "$RUNNER_TEMP/cache-retention/entries.jsonl" + jq -s '.' "$RUNNER_TEMP/cache-retention/entries.jsonl" \ + > "$RUNNER_TEMP/cache-retention/entries.json" + velnor-workflow cache-plan --mode=budget --entries "$RUNNER_TEMP/cache-retention/entries.json" \ + > "$RUNNER_TEMP/cache-retention/budget.json" + # `gh api --paginate --jq` runs the filter once per page and + # concatenates the outputs: summing inside the filter prints one + # number per page, and the total silently understates the account. + # Slurp the page stream first, then take one total over every entry. + total="$(jq '.total_held_bytes' "$RUNNER_TEMP/cache-retention/budget.json")" + count="$(jq 'length' "$RUNNER_TEMP/cache-retention/entries.json")" + headroom="$(jq '.headroom_bytes' "$RUNNER_TEMP/cache-retention/budget.json")" + if (( headroom >= 0 && headroom < 536870912 )); then + echo "::warning::Actions cache headroom below 512 MiB ($headroom bytes remaining)" >&2 + fi + jq -n --argjson total "$total" --argjson count "$count" --argjson headroom "$headroom" \ + --slurpfile budget "$RUNNER_TEMP/cache-retention/budget.json" \ + --arg captured_at "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ + '{captured_at: $captured_at, cache_count: $count, total_bytes: $total, headroom_bytes: $headroom, classes: $budget[0].classes}' \ + > "$RUNNER_TEMP/cache-retention/summary.json" + { + cat "$RUNNER_TEMP/cache-retention/summary.json" + echo "Per-class totals:" + jq -r '.classes[] | " \(.id): \(.entry_count) entries, \(.held_bytes) bytes (budget \(.budget_bytes))"' \ + "$RUNNER_TEMP/cache-retention/budget.json" + } >> "$GITHUB_STEP_SUMMARY" + - name: Plan retention evictions + if: steps.retention-gate.outputs.skip != 'true' + run: | + set -euo pipefail + # The plan is the generator's own retention policy, executed - never + # a shell copy of it: per-class budgets, bounded generations per + # variant class, and the protected classes (toolchain seeds, Cargo + # source bundles, the Docker seed baseline) reserved before rolling + # compiler snapshots are touched. An access timestamp is not a + # lease. The newest generation of a variant stays out of reach + # inside the producer window; a superseded generation of the same + # variant is eligible, because the newer save is the producer + # signal that the older entry is no longer being written. + velnor-workflow cache-plan \ + --now "$(date -u +%s)" \ + --entries "$RUNNER_TEMP/cache-retention/entries.json" \ + > "$RUNNER_TEMP/cache-retention/plan.json" + if jq -e 'length > 0' "$RUNNER_TEMP/cache-retention/plan.json" > /dev/null; then + { + echo "Retention plan (evict oldest first: bound, class budget, global budget):" + jq -r 'sort_by(.class, .reason) | group_by(.class, .reason)[] | " \(.[0].class) / \(.[0].reason): \(length) entries, \(map(.size_in_bytes) | add) bytes"' \ + "$RUNNER_TEMP/cache-retention/plan.json" + } >> "$GITHUB_STEP_SUMMARY" + else + echo "Retention plan: nothing to evict" >> "$GITHUB_STEP_SUMMARY" + fi + - name: Apply retention evictions + if: steps.retention-gate.outputs.skip != 'true' + env: + GH_TOKEN: ${{ github.token }} + run: | + set -euo pipefail + evicted=0 + freed=0 + failed=0 + # The plan is applied verbatim, in its own order: generations beyond + # their class bound first, then classes over budget, then the global + # sweep - which never touches a protected class. + while IFS=$'\t' read -r class reason id size key; do + if gh api --method DELETE "repos/$GITHUB_REPOSITORY/actions/caches/$id" >/dev/null; then + evicted=$((evicted + 1)) + freed=$((freed + size)) + echo "evicted id=$id class=$class reason=$reason size=$size key=$key" + else + failed=$((failed + 1)) + echo "::warning::failed to evict cache id $id (class $class, key $key)" >&2 + fi + done < <(jq -r '.[] | [.class, .reason, .id, .size_in_bytes, .key] | @tsv' \ + "$RUNNER_TEMP/cache-retention/plan.json") + # Every eviction is recorded under its cache class and its reason, + # so a later cold run can be correlated with the eviction that + # caused it. + { + echo "Evictions by cache class:" + jq -r 'group_by(.class)[] | " \(.[0].class): \(length) evictions, \(map(.size_in_bytes) | add) bytes"' \ + "$RUNNER_TEMP/cache-retention/plan.json" + } >> "$GITHUB_STEP_SUMMARY" + jq -n --argjson evicted "$evicted" --argjson freed "$freed" --argjson failed "$failed" \ + '{evicted_caches: $evicted, failed_evictions: $failed, freed_bytes: $freed}' \ + >> "$GITHUB_STEP_SUMMARY" + # A failed eviction is a loud failure, never a swallowed warning: + # silent DELETE failures leave the account over budget while the + # run reports success. + if (( failed > 0 )); then + echo "::error::$failed retention evictions failed; rerun maintenance" >&2 + exit 1 + fi + - name: Publish retention evidence + if: steps.retention-gate.outputs.skip != 'true' + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: cache-retention-${{ github.run_id }} + path: ${{ runner.temp }}/cache-retention + if-no-files-found: error + retention-days: 14 + - name: Enforce cache budget + if: steps.retention-gate.outputs.skip != 'true' + env: + GH_TOKEN: ${{ github.token }} + run: | + set -euo pipefail + # Re-query live state: the enforcement decision must reflect what the + # account actually holds after eviction, not the pre-eviction + # snapshot. The same page-streaming rule as collection applies: the + # sum is taken after slurping every page. + total="$(gh api --paginate "repos/$GITHUB_REPOSITORY/actions/caches?per_page=100" \ + --jq '.actions_caches[].size_in_bytes' | jq -s 'add // 0')" + budget="$(velnor-workflow cache-plan --mode=budget)" + if (( total > budget )); then + echo "::error::Actions cache account exceeds budget: $total > $budget bytes" >&2 + exit 1 + fi diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml new file mode 100644 index 0000000..fb9c849 --- /dev/null +++ b/.github/workflows/nightly.yml @@ -0,0 +1,112 @@ +# Generated by velnor-workflow. Regenerate; do not hand-edit. +name: Nightly +run-name: Nightly · ${{ github.event_name }} · ${{ github.ref_name }} + +on: + schedule: + - cron: '17 3 * * *' + workflow_dispatch: + inputs: + runner: + description: Execution backend + required: false + default: both + type: choice + options: + - velnor + - github + - both + scope: + description: Verification scope + required: true + default: full + type: choice + options: + - affected + - full + base_sha: + description: Git ref or SHA used as the affected-selection base + required: false + default: refs/heads/main + type: string + simulate_failure: + description: Force the red-to-signal test path + required: false + default: false + type: boolean + + +concurrency: + group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: false + +permissions: + actions: read + contents: read + +jobs: + dispatch-ci-main: + name: "Control / Dispatch ci-main" + if: ${{ github.event_name != 'workflow_dispatch' || !inputs.simulate_failure }} + runs-on: ubuntu-24.04 + timeout-minutes: 5 + permissions: + actions: write + contents: read + steps: + - name: Dispatch ci-main on default branch + env: + GH_TOKEN: ${{ github.token }} + DEFAULT_BRANCH: main + DISPATCH_RUNNER: ${{ github.event.inputs.runner || 'both' }} + DISPATCH_SCOPE: ${{ github.event.inputs.scope || 'full' }} + DISPATCH_BASE_SHA: ${{ github.event.inputs.base_sha || format('refs/heads/{0}', github.event.repository.default_branch) }} + shell: bash + run: | + set -euo pipefail + gh workflow run ci-main.yml \ + --ref "$DEFAULT_BRANCH" \ + -f runner="$DISPATCH_RUNNER" \ + -f scope="$DISPATCH_SCOPE" \ + -f base_sha="$DISPATCH_BASE_SHA" + nightly-red-to-signal: + name: "Control / Nightly red-to-signal" + if: ${{ github.event_name == 'workflow_dispatch' && inputs.simulate_failure }} + runs-on: ubuntu-24.04 + timeout-minutes: 5 + steps: + - name: Simulate nightly failure + shell: bash + run: | + set -euo pipefail + echo "nightly red-to-signal simulation requested" >&2 + exit 1 + nightly-alert: + name: "Control / Nightly red-to-signal" + if: ${{ always() && needs.nightly-red-to-signal.result == 'failure' }} + needs: [nightly-red-to-signal] + runs-on: ubuntu-24.04 + permissions: + contents: read + issues: write + steps: + - name: Open or update nightly failure signal + env: + GH_TOKEN: ${{ github.token }} + NIGHTLY_RESULT: ${{ needs.nightly-red-to-signal.result }} + shell: bash + run: | + set -euo pipefail + if [[ "$NIGHTLY_RESULT" == success ]]; then + exit 0 + fi + echo "::error::nightly-red-to-signal failed: $NIGHTLY_RESULT" + existing="$(gh api "repos/$GITHUB_REPOSITORY/issues?state=open" --jq '.[] | select(.title == "Nightly CI red") | .number' | sed -n '1p')" + body="$(printf '%s\n%s\n' \ + "nightly-red-to-signal result: $NIGHTLY_RESULT" \ + "Run: https://github.com/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID")" + if [[ -n "$existing" ]]; then + gh api --method PATCH "repos/$GITHUB_REPOSITORY/issues/$existing" -f body="$body" >/dev/null + else + gh api --method POST "repos/$GITHUB_REPOSITORY/issues" -f title='Nightly CI red' -f body="$body" >/dev/null + fi diff --git a/.github/workflows/publish-sonatype.yml b/.github/workflows/publish-sonatype.yml new file mode 100644 index 0000000..e9de41c --- /dev/null +++ b/.github/workflows/publish-sonatype.yml @@ -0,0 +1,28 @@ +name: Publish to Sonatype + +on: + push: + branches: + - main + +permissions: + contents: read + +jobs: + publish: + runs-on: ubuntu-latest + environment: Sonatype + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + - uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: 17 + - name: Cache Gradle packages + uses: actions/cache@v6 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle.kts') }} + restore-keys: ${{ runner.os }}-gradle + - name: Publish to Sonatype + run: ./publish-sonatype.sh diff --git a/config/fleet/velnor-host.env b/config/fleet/velnor-host.env new file mode 100644 index 0000000..069db88 --- /dev/null +++ b/config/fleet/velnor-host.env @@ -0,0 +1,11 @@ +# Generated by velnor-workflow. Merge into /etc/velnor/velnor.env on fleet hosts. +# Generator-only [cache.velnor]; never written to .github/ci/project.toml. +VELNOR_STORAGE_ROOT=/var +VELNOR_BUDGET_CACHES_BYTES=53687091200 +VELNOR_BUDGET_CARGO_BYTES=21474836480 +VELNOR_BUDGET_MISE_BYTES=21474836480 +VELNOR_BUDGET_ARTIFACTS_BYTES=21474836480 +VELNOR_BUDGET_TARGETS_BYTES=214748364800 +MBX_GC_MAX_TOTAL_SIZE=50GiB +# Same-repo PR jobs write the pr scope only; trusted events write trusted (D18). +VELNOR_MBX_GENERATION_BOUND=6