From 441b9c99d2c454e42e136b2825a192b37ea19971 Mon Sep 17 00:00:00 2001 From: "Adrian A. Baumann" Date: Thu, 6 Nov 2025 23:36:41 +0100 Subject: [PATCH] Changes in workflow --- .gitea/workflows/build-on-demand.yml | 110 +++++++++++++++++++-------- 1 file changed, 78 insertions(+), 32 deletions(-) diff --git a/.gitea/workflows/build-on-demand.yml b/.gitea/workflows/build-on-demand.yml index 9050f9c..931a610 100644 --- a/.gitea/workflows/build-on-demand.yml +++ b/.gitea/workflows/build-on-demand.yml @@ -42,19 +42,21 @@ jobs: curl -sL "https://github.com/mikefarah/yq/releases/download/${YQ_VER}/yq_linux_amd64" -o /usr/local/bin/yq chmod +x /usr/local/bin/yq yq --version - + - name: Read workload image from deployment (old vs new) id: img shell: bash run: | set -euo pipefail - file="$DEPLOY_FILE" - cname="$CONTAINER_NAME" - expected_repo="$EXPECTED_REPO" + file="${DEPLOY_FILE:-argocd/deployment.yaml}" + cname="${CONTAINER_NAME:-web}" + expected_repo="${EXPECTED_REPO:-git.baumann.gr/adebaumann/vui}" - # Extract ONLY from .spec.template.spec.containers[], selecting by .name == cname - # Works across multi-doc YAML (the Service doc will be ignored) - extract() { + # --- functions ------------------------------------------------------ + have_yq() { command -v yq >/dev/null 2>&1; } + + # yq-based extractor (multi-doc aware; Deployment only; container name match) + yq_extract() { yq -r ' select(.kind == "Deployment") | .spec.template.spec.containers // [] | @@ -63,50 +65,94 @@ jobs: ' "$1" 2>/dev/null | tail -n 1 } - debug_list() { - echo "== workload images in $1 ==" >&2 - yq -r ' - select(.kind == "Deployment") | - .spec.template.spec.containers // [] | - .[] | "\(.name): \(.image)" - ' "$1" 2>/dev/null | nl -ba >&2 || true + # ultra-tolerant fallback: grep around containers: block and pick name==web image + # (still ignores initContainers by staying within the "containers:" block) + fallback_extract() { + # print the containers block, then associate names with images + awk -v cname="$cname" ' + BEGIN{ in_cont=0; name=""; image="" } + /^containers:/ {in_cont=1; next} + in_cont { + # end of containers block when dedented to less than two spaces or new top-level key + if ($0 ~ /^[[:alpha:]][[:alnum:]_:-]*:/ || $0 ~ /^ *initContainers:/) { in_cont=0 } + # capture name and image lines + if ($0 ~ /^[[:space:]]*-?[[:space:]]*name:[[:space:]]*/) { + name=$0; sub(/^.*name:[[:space:]]*/,"",name); gsub(/^[ "\047]+|[ "\047]+$/,"",name) + } + if ($0 ~ /^[[:space:]]*image:[[:space:]]*/) { + image=$0; sub(/^.*image:[[:space:]]*/,"",image); gsub(/^[ "\047]+|[ "\047]+$/,"",image) + if (name==cname) { print image; exit } + } + } + ' "$1" } - # Old image (from previous commit) + list_workload_images() { + echo "== workload containers in $1 ==" >&2 + if have_yq; then + yq -r ' + select(.kind == "Deployment") | + .spec.template.spec.containers // [] | + .[] | "\(.name): \(.image)" + ' "$1" 2>/dev/null | nl -ba >&2 || true + else + # coarse list for visibility + awk ' + /^ *containers:/, /^[^ ]/ { if ($0 ~ /name:|image:/) print } + ' "$1" | nl -ba >&2 || true + fi + } + # -------------------------------------------------------------------- + + # Ensure yq is present; if install failed earlier, try once more + if ! have_yq; then + echo "yq missing; attempting quick install..." >&2 + curl -fsSL https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -o /usr/local/bin/yq || true + chmod +x /usr/local/bin/yq || true + fi + + # Prepare old file (previous commit) if exists if git cat-file -e "${{ steps.base.outputs.base }}":"$file" 2>/dev/null; then git show "${{ steps.base.outputs.base }}:$file" > /tmp/old.yaml - debug_list /tmp/old.yaml - old_image="$(extract /tmp/old.yaml || true)" else - old_image="" + : > /tmp/old.yaml fi - # New image (from workspace) - if [ -f "$file" ]; then - debug_list "$file" - new_image="$(extract "$file" || true)" + list_workload_images /tmp/old.yaml || true + list_workload_images "$file" || true + + if have_yq; then + old_image="$(yq_extract /tmp/old.yaml || true)" + new_image="$(yq_extract "$file" || true)" else - new_image="" + old_image="$(fallback_extract /tmp/old.yaml || true)" + new_image="$(fallback_extract "$file" || true)" fi - echo "Old workload image: $old_image" - echo "New workload image: $new_image" + # If yq path failed to find it, try fallback once more as safety + if [ -z "${new_image:-}" ]; then + new_image="$(fallback_extract "$file" || true)" + fi + if [ -z "${old_image:-}" ]; then + old_image="$(fallback_extract /tmp/old.yaml || true)" + fi - if [ -z "$new_image" ]; then - echo "ERROR: Could not find containers[].name == \"$cname\" in $file" + echo "Old workload image: ${old_image:-}" + echo "New workload image: ${new_image:-}" + + if [ -z "${new_image:-}" ]; then + echo "ERROR: Could not find containers[].name == \"$cname\" image in $file" exit 1 fi - # Sanity-check repo prefix (avoid accidentally building the init image) + # Split repo and tag new_repo="${new_image%:*}" new_tag="${new_image##*:}" if [[ "$new_repo" != "$expected_repo" ]]; then echo "ERROR: Found container \"$cname\" image repo is \"$new_repo\" but expected \"$expected_repo\"" exit 1 fi - - # Old tag (if any) - if [ -n "$old_image" ]; then + if [ -n "${old_image:-}" ]; then old_tag="${old_image##*:}" else old_tag="" @@ -121,7 +167,7 @@ jobs: echo "new_tag=$new_tag" echo "registry=$registry" } >> "$GITHUB_OUTPUT" - + - name: Skip if tag unchanged if: steps.img.outputs.changed != 'true' run: echo "Workload image tag unchanged; skipping build."