From a8f2c46c87f8e51ee9e709548e593d2dad2efedd Mon Sep 17 00:00:00 2001 From: Molecule AI Core-DevOps Date: Wed, 13 May 2026 04:37:06 +0000 Subject: [PATCH] fix(ci): remove || true guards from jq pipelines in audit-force-merge.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Silent-failure regression from 8c343e3a. The || true guards on jq pipelines masked parse errors and allowed empty strings to propagate into the force-merge audit event (e.g. missing title, merge_sha, or merged_by). With set -euo pipefail already in place, jq failures now propagate as hard errors — the correct behavior. Use jq's // operator for graceful defaults instead: MERGE_SHA=$(jq -r '.merge_commit_sha // empty') # exits 5 on missing field MERGED_BY=$(jq -r '.merged_by.login // "unknown"') # exits 5 on missing field Co-Authored-By: Claude Opus 4.7 --- .gitea/scripts/audit-force-merge.sh | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/.gitea/scripts/audit-force-merge.sh b/.gitea/scripts/audit-force-merge.sh index be665d45..10ee9e6b 100755 --- a/.gitea/scripts/audit-force-merge.sh +++ b/.gitea/scripts/audit-force-merge.sh @@ -49,11 +49,16 @@ if [ "$MERGED" != "true" ]; then exit 0 fi -MERGE_SHA=$(echo "$PR" | jq -r '.merge_commit_sha // empty') || true -MERGED_BY=$(echo "$PR" | jq -r '.merged_by.login // "unknown"') || true -TITLE=$(echo "$PR" | jq -r '.title // ""') || true -BASE_BRANCH=$(echo "$PR" | jq -r '.base.ref // "main"') || true -HEAD_SHA=$(echo "$PR" | jq -r '.head.sha // empty') || true +# NOTE: no || true — with set -euo pipefail, jq parse failures (e.g. field +# missing from API response) propagate as hard errors. Use jq's // operator +# for graceful defaults instead of bash || true guards. This was re-added by +# 8c343e3a ("fix(gitea): add || true guards to jq pipelines") — reverted +# here because the guards mask silent failures that hide malformed API responses. +MERGE_SHA=$(echo "$PR" | jq -r '.merge_commit_sha // empty') +MERGED_BY=$(echo "$PR" | jq -r '.merged_by.login // "unknown"') +TITLE=$(echo "$PR" | jq -r '.title // ""') +BASE_BRANCH=$(echo "$PR" | jq -r '.base.ref // "main"') +HEAD_SHA=$(echo "$PR" | jq -r '.head.sha // empty') if [ -z "$MERGE_SHA" ]; then echo "::warning::PR #${PR_NUMBER} merged=true but no merge_commit_sha — cannot evaluate force-merge." @@ -75,7 +80,7 @@ STATUS=$(curl -sS -H "$AUTH" \ declare -A CHECK_STATE while IFS=$'\t' read -r ctx state; do [ -n "$ctx" ] && CHECK_STATE[$ctx]="$state" -done < <(echo "$STATUS" | jq -r '.statuses // [] | .[] | "\(.context)\t\(.status)"') || true +done < <(echo "$STATUS" | jq -r '.statuses // [] | .[] | "\(.context)\t\(.status)"') # 4. For each required check, was it green at merge? YAML block scalars # (`|`) leave a trailing newline; skip blank/whitespace-only lines. @@ -97,7 +102,10 @@ fi # 5. Emit structured audit event. NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ) -FAILED_JSON=$(printf '%s\n' "${FAILED_CHECKS[@]}" | jq -R . | jq -s .) || true +# jq -R (raw input) converts each line to a JSON string; jq -s wraps into array. +# If FAILED_CHECKS is unexpectedly empty (shouldn't happen — we exit above), +# this produces []. No || true needed. +FAILED_JSON=$(printf '%s\n' "${FAILED_CHECKS[@]}" | jq -R . | jq -s .) # Print as a single-line JSON so Vector's parse_json transform can pick # it up cleanly from docker_logs.