From b60124491022ba9cfd28f5007ed71d4a5a616f71 Mon Sep 17 00:00:00 2001 From: humocs-man <251756307+humocs-man@users.noreply.github.com> Date: Sat, 19 Sep 2026 17:21:59 +0200 Subject: [PATCH] new build --- .gitea/workflows/build-v2.yml | 323 ++++++++++++++++++++++++++++++++++ 1 file changed, 323 insertions(+) create mode 100644 .gitea/workflows/build-v2.yml diff --git a/.gitea/workflows/build-v2.yml b/.gitea/workflows/build-v2.yml new file mode 100644 index 0000000..cb1a8b7 --- /dev/null +++ b/.gitea/workflows/build-v2.yml @@ -0,0 +1,323 @@ +# ============================================================================= +# KONSOLIDIERTER BUILD-WORKFLOW (experimentell) +# ----------------------------------------------------------------------------- +# Führt die beiden bisherigen Workflows zusammen: +# - build.yml: Buildx direkt in die Registry (fragiler +# go-zstd-chunked-Workaround, kein --recursive beim Signieren) +# - redhat_build.yml: OCI-Export + Skopeo-Recompress zu zstd:chunked + +# rekursives Legacy-Signieren (der verlässlichere Weg) +# +# Ablauf hier: Buildx -> OCI-Archiv -> Skopeo-Push mit zstd:chunked -> +# rekursives Cosign-Signieren im Legacy-Format (.sig, für +# sigstoreSigned in policy.json erforderlich). +# +# FALLBACK: build.yml und redhat_build.yml bleiben unverändert bestehen. +# Dieser Workflow startet NUR manuell (workflow_dispatch), damit du ihn in +# Ruhe testen kannst. Zur Übernahme: +# 1. Diesen Workflow per workflow_dispatch auf main testen. +# 2. Bei Erfolg: `on:`-Trigger (schedule/pull_request) von build.yml +# hierher übernehmen und build.yml + redhat_build.yml löschen +# (oder per `on: workflow_dispatch` als manuellen Fallback behalten). +# ============================================================================= +name: Build container image v2 (consolidated) + +on: + workflow_dispatch: + +env: + IMAGE_DESC: "Custom Fedora bootc image" + IMAGE_NAME: "${{ github.event.repository.name }}" + DEFAULT_TAG: "stable" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref || github.run_id }} + cancel-in-progress: true + +jobs: + build_push: + name: Build and push image + runs-on: ubuntu-24.04 + + permissions: + contents: read + packages: write + id-token: write + + steps: + + # ------------------------------------------------------------ + # Environment + # ------------------------------------------------------------ + + - name: Prepare environment + run: | + set -euo pipefail + + REGISTRY_HOST=$(echo "${{ github.server_url }}" | awk -F/ '{print $3}') + OWNER_LOWER="${{ github.repository_owner }}" + NAME_LOWER="${{ env.IMAGE_NAME }}" + + echo "REGISTRY_HOST=${REGISTRY_HOST}" >> "${GITHUB_ENV}" + echo "IMAGE_REGISTRY=${REGISTRY_HOST}/${OWNER_LOWER,,}" >> "${GITHUB_ENV}" + echo "IMAGE_NAME=${NAME_LOWER,,}" >> "${GITHUB_ENV}" + + echo "DATE_TAG=$(date -u +'%Y%m%d')" >> "${GITHUB_ENV}" + echo "BUILD_DATE_ISO=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> "${GITHUB_ENV}" + + # ------------------------------------------------------------ + # Image tag + # ------------------------------------------------------------ + + - name: Determine image tag + run: | + set -euo pipefail + + BRANCH="${GITHUB_REF_NAME}" + + if [[ "$BRANCH" == "main" ]]; then + echo "IMAGE_TAG=${DEFAULT_TAG}" >> "${GITHUB_ENV}" + echo "IS_TEST_BUILD=false" >> "${GITHUB_ENV}" + else + SANITIZED=$(echo "$BRANCH" \ + | sed 's/[^a-zA-Z0-9._-]/-/g' \ + | head -c 50) + + echo "IMAGE_TAG=test-${SANITIZED}" >> "${GITHUB_ENV}" + echo "IS_TEST_BUILD=true" >> "${GITHUB_ENV}" + fi + + # ------------------------------------------------------------ + # Checkout + # ------------------------------------------------------------ + + - name: Checkout + uses: actions/checkout@v7.0.1 + + # ------------------------------------------------------------ + # Registry-Auth für den Build-Kontext (Containerfile kopiert + # configs/auth.json ins Image, Datei liegt nur als Template im Repo) + # ------------------------------------------------------------ + + - name: Prepare Registry Auth File + env: + AUTH_BASE64: ${{ secrets.READONLY_AUTH_BASE64 }} + run: | + set -euo pipefail + + sed "s|READONLY_TOKEN_PLACEHOLDER|${AUTH_BASE64}|g" \ + configs/auth.json.template > configs/auth.json + + # ------------------------------------------------------------ + # Buildx + # ------------------------------------------------------------ + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v4.4.0 + + # ------------------------------------------------------------ + # Image metadata + # ------------------------------------------------------------ + + - name: Image Metadata + id: metadata + uses: docker/metadata-action@v6.2.0 + with: + images: ${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=raw,value=${{ env.IMAGE_TAG }} + type=raw,value=${{ env.IMAGE_TAG }}.${{ env.DATE_TAG }},enable=${{ env.IS_TEST_BUILD == 'false' }} + type=raw,value=${{ env.DATE_TAG }},enable=${{ env.IS_TEST_BUILD == 'false' }} + type=sha,enable=${{ github.event_name == 'pull_request' }} + type=ref,event=pr + labels: | + org.opencontainers.image.created=${{ env.BUILD_DATE_ISO }} + org.opencontainers.image.description=${{ env.IMAGE_DESC }} + org.opencontainers.image.documentation=${{ github.server_url }}/${{ github.repository }} + org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }} + org.opencontainers.image.title=${{ env.IMAGE_NAME }} + org.opencontainers.image.url=${{ github.server_url }}/${{ github.repository }} + org.opencontainers.image.vendor=${{ github.repository_owner }} + org.opencontainers.image.version=${{ env.IMAGE_TAG }}.${{ env.DATE_TAG }} + containers.bootc=1 + ostree.bootable=1 + + # ------------------------------------------------------------ + # Registry login + # ------------------------------------------------------------ + + - name: Login to Gitea Container Registry + if: github.event_name != 'pull_request' + uses: docker/login-action@v4.6.0 + with: + registry: ${{ env.REGISTRY_HOST }} + username: ${{ github.repository_owner }} + password: ${{ secrets.REGISTRY }} + + # ------------------------------------------------------------ + # Prepare OCI output + # ------------------------------------------------------------ + + - name: Prepare OCI archive + run: | + rm -rf "${{ github.workspace }}/oci-layout.tar" + + # ------------------------------------------------------------ + # Build image (kein direkter Push: garantiertes zstd:chunked + # kommt im nächsten Schritt via Skopeo) + # ------------------------------------------------------------ + + - name: Build Image (Docker Buildx OCI-Export) + uses: docker/build-push-action@v7.4.0 + id: build_image + with: + context: . + file: ./Containerfile + + push: false + pull: true + + tags: ${{ steps.metadata.outputs.tags }} + labels: ${{ steps.metadata.outputs.labels }} + + cache-from: type=registry,ref=${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache-amd64-main + cache-to: type=registry,ref=${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache-amd64-main,mode=max + + outputs: type=oci,dest=${{ github.workspace }}/oci-layout.tar,tar=true + + # ------------------------------------------------------------ + # Inspect OCI archive + # ------------------------------------------------------------ + + - name: Inspect OCI archive + if: github.event_name != 'pull_request' + run: | + set -euo pipefail + + echo "OCI archive:" + ls -lh "${{ github.workspace }}/oci-layout.tar" + + echo + echo "OCI index.json:" + tar -xf "${{ github.workspace }}/oci-layout.tar" \ + -O index.json | jq . + + echo + echo "OCI image references:" + tar -xf "${{ github.workspace }}/oci-layout.tar" \ + -O index.json \ + | jq -r ' + .manifests[] + | .annotations["org.opencontainers.image.ref.name"] // "(no ref.name)" + ' + + # ------------------------------------------------------------ + # Install Skopeo + # ------------------------------------------------------------ + + - name: Install Skopeo + if: github.event_name != 'pull_request' + run: | + sudo apt-get update + sudo apt-get install -y skopeo + + # ------------------------------------------------------------ + # Push images via Skopeo (zstd:chunked) + # ------------------------------------------------------------ + + - name: Push Images via Skopeo (zstd:chunked) + if: github.event_name != 'pull_request' + run: | + set -euo pipefail + + OCI_ARCHIVE="${{ github.workspace }}/oci-layout.tar" + TAGS="${{ steps.metadata.outputs.tags }}" + + echo "Images to push:" + echo "${TAGS}" + + for DEST_TAG in ${TAGS}; do + SOURCE_TAG="${DEST_TAG##*:}" + + echo + echo "============================================================" + echo "Source OCI tag : ${SOURCE_TAG}" + echo "Destination : ${DEST_TAG}" + echo "============================================================" + + skopeo copy \ + --dest-creds "${{ github.repository_owner }}:${{ secrets.REGISTRY }}" \ + --dest-compress-format zstd:chunked \ + "oci-archive:${OCI_ARCHIVE}:${SOURCE_TAG}" \ + "docker://${DEST_TAG}" + done + + # ------------------------------------------------------------ + # Install envsubst + # ------------------------------------------------------------ + + - name: Install envsubst dependencies + if: github.event_name != 'pull_request' && env.IS_TEST_BUILD == 'false' + run: | + sudo apt-get update + sudo apt-get install -y gettext + + # ------------------------------------------------------------ + # Install Cosign + # ------------------------------------------------------------ + + - name: Install Cosign + if: github.event_name != 'pull_request' && env.IS_TEST_BUILD == 'false' + uses: sigstore/cosign-installer@v4.1.2 + + # ------------------------------------------------------------ + # Sign image (rekursiv, Legacy-.sig für sigstoreSigned-Policy) + # ------------------------------------------------------------ + + - name: Sign container image (Recursive Digest) + if: github.event_name != 'pull_request' && env.IS_TEST_BUILD == 'false' + env: + COSIGN_PRIVATE_KEY: ${{ secrets.SIGNING_SECRET }} + COSIGN_PASSWORD: "" + run: | + set -euo pipefail + + echo "${{ secrets.REGISTRY }}" \ + | cosign login "${{ env.REGISTRY_HOST }}" \ + -u "${{ github.repository_owner }}" \ + --password-stdin + + echo "Frage finalen Registry-Digest via Skopeo ab..." + + OUTER_DIGEST=$( + skopeo inspect \ + --creds "${{ github.repository_owner }}:${{ secrets.REGISTRY }}" \ + "docker://${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.DEFAULT_TAG }}" \ + | jq -r .Digest + ) + + echo "Registry digest: ${OUTER_DIGEST}" + + IMAGE_REF="${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_NAME }}@${OUTER_DIGEST}" + + echo "Signiere Image rekursiv:" + echo "${IMAGE_REF}" + + cosign sign -y \ + --key env://COSIGN_PRIVATE_KEY \ + --recursive \ + --use-signing-config=false \ + --new-bundle-format=false \ + --registry-referrers-mode=legacy \ + "${IMAGE_REF}" + + # ------------------------------------------------------------ + # Cleanup + # ------------------------------------------------------------ + + - name: Post-Build Cleanup + if: always() + run: | + rm -f configs/auth.json + rm -f "${{ github.workspace }}/oci-layout.tar" + + docker buildx prune -a -f || true