Files
computer-playbook/.github/workflows/release-version.yml
T
kevinveenbirkenbachandClaude Opus 5 5318df2e9d feat(ci): resolve image refs from services.yml SPOT
moby/buildkit was hardcoded in four places across two workflows and catthehacker/ubuntu in two act scripts, none of them reachable by the image mirror: utils/docker/image/discovery.py only scans roles/**/meta/services.yml. So the one image the CI build cannot proceed without was pulled straight from Docker Hub, unmirrored, which is what broke the fedora build in run 30160077828.

Declare both as mirror-only services on svc-runner, following the test-e2e-playwright precedent, so the existing mirror pipeline picks them up unchanged. New scripts/meta/resolve/image/service_ref.sh reads image+version back out of the declaration and is the single source for consumers outside Ansible; its mode argument is mandatory (upstream never touches the network, mirror prefers the GHCR tag and falls back to upstream). The fallback is why the mirror job can keep running in parallel with the build instead of gating it.

ACT_PLATFORM_IMAGE moves to an env handler so act consumers read the declared value via BASH_ENV, and workflow.sh now demands it instead of defaulting to a literal. Operator overrides still win through eb.setdefault.

Verified: service_ref.sh in all four paths (upstream, mirror hit, missing mode, invalid mode); the mirror path matches GHCRProvider.image_base() character for character and resolves against the live registry anonymously; ACT_PLATFORM_IMAGE resolves through the real BASH_ENV mechanism; make quality green on all four targets.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-25 19:12:37 +02:00

171 lines
5.4 KiB
YAML

name: "🚀 Release: Version Logic"
on:
workflow_call:
inputs:
tag:
description: "Version tag to release (e.g. v1.2.3)"
required: true
type: string
workflow_dispatch:
inputs:
tag:
description: "Version tag to release (e.g. v1.2.3)"
required: true
type: string
concurrency:
group: infinito-release
cancel-in-progress: false
permissions:
contents: write
packages: write
security-events: write
actions: read
env:
REGISTRY: ghcr.io
DEFAULT_DISTRO: "debian"
jobs:
check-ci-images:
name: 🔎 Check CI images
runs-on: ubuntu-latest
outputs:
missing: ${{ steps.check.outputs.missing }}
ci_tag: ${{ steps.citag.outputs.ci_tag }}
distros: ${{ steps.vars.outputs.distros }}
repo_prefix: ${{ steps.vars.outputs.repo_prefix }}
owner: ${{ steps.vars.outputs.owner }}
version_tag: ${{ steps.vars.outputs.version_tag }}
publish_latest: ${{ steps.highest.outputs.publish_latest }}
steps:
- name: ⬇️ Checkout trusted workflow repo (helpers)
uses: actions/checkout@v7.0.0
with:
ref: ${{ github.sha }}
path: _helpers
persist-credentials: false
- name: 🔍 Resolve release inputs
id: vars
shell: bash
run: bash _helpers/scripts/github/resolve/release_inputs.sh "${{ inputs.tag || github.event.inputs.tag }}"
- name: ⬇️ Checkout repository at version tag
uses: actions/checkout@v7.0.0
with:
ref: ${{ steps.vars.outputs.version_tag }}
path: _src
fetch-depth: 0
fetch-tags: true
- name: 🧮 Compute CI tag (ci-<sha> of version tag)
id: citag
shell: bash
run: |
set -euo pipefail
sha="$(git -C _src rev-parse HEAD)"
echo "ci_tag=ci-${sha}" >> "$GITHUB_OUTPUT"
- name: 🤔 Decide whether this version should update latest
id: highest
shell: bash
env:
REPOSITORY_DIR: _src
VERSION_TAG: ${{ steps.vars.outputs.version_tag }}
run: _helpers/scripts/meta/resolve/publish_latest.sh
- name: 🔑 Login to GHCR (manifest checks)
uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: 🔎 Check whether CI images already exist
id: check
shell: bash
env:
OWNER: ${{ steps.vars.outputs.owner }}
REPO_PREFIX: ${{ steps.vars.outputs.repo_prefix }}
INFINITO_DISTROS: ${{ steps.vars.outputs.distros }}
CI_TAG: ${{ steps.citag.outputs.ci_tag }}
run: |
set -euo pipefail
missing="$(_helpers/scripts/meta/resolve/missing/ci_images.sh)"
echo "missing=${missing}" >> "$GITHUB_OUTPUT"
build-ci-images-if-missing:
name: 🏗️ Build missing CI images
needs: check-ci-images
if: needs.check-ci-images.outputs.missing == 'true'
uses: ./.github/workflows/images-build-ci.yml
with:
distros: ${{ needs.check-ci-images.outputs.distros }}
checkout_ref: ${{ needs.check-ci-images.outputs.version_tag }}
image_tag: ${{ needs.check-ci-images.outputs.ci_tag }}
concurrency_channel: release-backfill
secrets: inherit
release:
name: 🚀 Release version
needs:
- check-ci-images
- build-ci-images-if-missing
if: |
always() &&
needs.check-ci-images.result == 'success' &&
(
needs.build-ci-images-if-missing.result == 'success' ||
needs.build-ci-images-if-missing.result == 'skipped'
)
runs-on: ubuntu-latest
env:
VERSION_TAG: ${{ needs.check-ci-images.outputs.version_tag }}
OWNER: ${{ needs.check-ci-images.outputs.owner }}
REPO_PREFIX: ${{ needs.check-ci-images.outputs.repo_prefix }}
INFINITO_DISTROS: ${{ needs.check-ci-images.outputs.distros }}
CI_TAG: ${{ needs.check-ci-images.outputs.ci_tag }}
PUBLISH_LATEST: ${{ needs.check-ci-images.outputs.publish_latest }}
steps:
- name: ⬇️ Checkout trusted workflow repo (helpers)
uses: actions/checkout@v7.0.0
with:
ref: ${{ github.sha }}
persist-credentials: false
- name: 🔍 Resolve buildkit image ref
id: buildkit
shell: bash
run: |
set -euo pipefail
ref="$(bash scripts/meta/resolve/image/service_ref.sh svc-runner buildkit mirror)"
echo "ref=${ref}" >> "$GITHUB_OUTPUT"
- name: ⬇️ Pre-pull buildkit image (retry 7x, 20s)
shell: bash
env:
MAX_ATTEMPTS: "7"
RETRY_DELAY_SECONDS: "20"
run: bash scripts/github/runner/pull_with_retry.sh "${{ steps.buildkit.outputs.ref }}"
- name: 🔧 Set up Docker Buildx
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
with:
driver-opts: image=${{ steps.buildkit.outputs.ref }}
- name: 🔑 Login to GHCR
uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: 🏷️ Retag CI images to release tags (and latest for the highest version)
shell: bash
run: scripts/image/release.sh