# Baut und veröffentlicht die Release-Images, wenn ein Tag vX.Y.Z gepusht wird. # # Bewusst registry-neutral: dieselbe Datei läuft auf GitHub (ghcr.io) und auf # Forgejo/Gitea mit Actions (Forgejo liest .github/workflows, wenn es kein # .forgejo/workflows gibt). Wohin gepusht wird, steht NICHT hier, sondern in # den Repository-Einstellungen: # Variablen: REGISTRY (Default ghcr.io, z. B. git.opnexus.dev) # IMAGE_NAMESPACE (Default: Repo-Besitzer, kleingeschrieben) # Secrets: REGISTRY_USERNAME (Default: der auslösende Benutzer) # REGISTRY_TOKEN (Default: GITHUB_TOKEN — das reicht nur für # ghcr.io; auf Forgejo ein Zugriffstoken mit # Berechtigung "write:package" eintragen) # Wer auf mehrere Registries veröffentlichen will, pusht den Tag einfach zu # mehreren Remotes — jeder Remote baut mit seiner eigenen Konfiguration. # Ergebnis: //opnexus-{backend,frontend,proxy,updater}: # (flache Namen, weil verschachtelte Pfade je Registry unterschiedlich gehen). # # Der Publish-Job braucht einen Runner mit Docker-Zugriff, der QEMU- # Emulation für arm64 erlaubt (privilegiert). name: Release on: push: tags: ["v[0-9]+.[0-9]+.[0-9]+*"] jobs: verify: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: scripts/check_version.sh "${GITHUB_REF_NAME%%-*}" test: uses: ./.github/workflows/ci.yml publish: needs: [verify, test] runs-on: ubuntu-latest permissions: contents: read packages: write strategy: fail-fast: true matrix: service: [backend, frontend, proxy, updater] steps: - uses: actions/checkout@v4 - name: Ziel bestimmen id: target env: REGISTRY: ${{ vars.REGISTRY || 'ghcr.io' }} NAMESPACE: ${{ vars.IMAGE_NAMESPACE || github.repository_owner }} run: | # Registry-Pfade müssen kleingeschrieben sein. echo "image=$(echo "$REGISTRY/$NAMESPACE/opnexus-${{ matrix.service }}" | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_OUTPUT" - uses: docker/setup-qemu-action@v3 - uses: docker/setup-buildx-action@v3 - uses: docker/login-action@v3 with: registry: ${{ vars.REGISTRY || 'ghcr.io' }} username: ${{ secrets.REGISTRY_USERNAME || github.actor }} password: ${{ secrets.REGISTRY_TOKEN || secrets.GITHUB_TOKEN }} - id: meta uses: docker/metadata-action@v5 with: images: ${{ steps.target.outputs.image }} # v1.9.0 -> 1.9.0, 1.9, 1 (+ latest); Vorabversionen bekommen nur # den vollen Tag und nie "latest". tags: | type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}} - uses: docker/build-push-action@v6 with: context: ./${{ matrix.service }} platforms: linux/amd64,linux/arm64 push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }}