From 9bc6664dc08edf7765df7cf1ab7d83d81836ae77 Mon Sep 17 00:00:00 2001 From: OoO Date: Mon, 4 May 2026 14:34:05 +0800 Subject: [PATCH] =?UTF-8?q?fix(p37):=20cd.yaml=20SPA=20shadow=20grep=20pip?= =?UTF-8?q?efail=20bug=20=E2=80=94=20=E7=9C=9F=E6=AD=A3=E4=BF=AE=E5=A5=BD?= =?UTF-8?q?=20CD=20failure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit P34/P36 都沒打到的 root cause: ETAG=$(echo "$HDR" | grep -i '^etag:' | ...) 當 grep 找不到匹配 (mo.wooo.work /health 不帶 etag header), grep exit 1 → bash pipefail → 變數賦值整行 exit 1 → set -e 殺掉整個 script → run 280/281 同樣位置死。 修:每個 grep pipeline 結尾補 `|| true` 兜底,empty result 不殺 script。 本機 bash -eo pipefail 模擬實 prod /health response: ETAG=[] CLEN=[64] XPT=[] FLASK_OK=1 (CLEN=64 != 7480 觸發 PASS) ✅ 預期下個 CD run 該 step 綠 --- .gitea/workflows/cd.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/cd.yaml b/.gitea/workflows/cd.yaml index 2649611..a6422fe 100644 --- a/.gitea/workflows/cd.yaml +++ b/.gitea/workflows/cd.yaml @@ -336,9 +336,10 @@ jobs: SPA_LEN='7480' # 用 /health(純 Flask,不會被 SPA 路徑攔)做基準探針 HDR=$(curl -sS -D - -o /dev/null --max-time 10 https://mo.wooo.work/health 2>/dev/null || echo "") - ETAG=$(echo "$HDR" | grep -i '^etag:' | tr -d '"\r' | awk '{print $2}' | tr 'A-Z' 'a-z') - CLEN=$(echo "$HDR" | grep -i '^content-length:' | awk '{print $2}' | tr -d '\r') - XPT=$(echo "$HDR" | grep -i '^x-process-time:' | awk '{print $2}' | tr -d '\r') + # P37: grep 沒匹配返回 1,pipefail+set -e 會殺整段腳本 — 全部加 || true + ETAG=$(echo "$HDR" | grep -i '^etag:' 2>/dev/null | tr -d '"\r' | awk '{print $2}' | tr 'A-Z' 'a-z' || true) + CLEN=$(echo "$HDR" | grep -i '^content-length:' 2>/dev/null | awk '{print $2}' | tr -d '\r' || true) + XPT=$(echo "$HDR" | grep -i '^x-process-time:' 2>/dev/null | awk '{print $2}' | tr -d '\r' || true) FLASK_OK=0 # P36 修:用 if/then 而非 && 串連,避免 bash -e 在第一條 false 就 exit if [ -n "$XPT" ] && [ "$XPT" != "0" ] && [ "$XPT" != "0.0" ]; then FLASK_OK=1; fi