From 8ab6ddb4ca3b70bb11e2d2b5fc9cd5407872c53e Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 3 May 2026 23:31:17 +0800 Subject: [PATCH] =?UTF-8?q?fix(ci):=20=E4=BF=AE=E5=BE=A9=20Docker=20build?= =?UTF-8?q?=20lock=20stale=20=E5=81=B5=E6=B8=AC=EF=BC=88=E5=A5=88=E7=A7=92?= =?UTF-8?q?=20+=20=E6=99=82=E5=8D=80=E7=B8=AE=E5=AF=AB=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E5=A4=B1=E6=95=97=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit docker network inspect 回傳 "2026-05-03 00:07:48.009219232 +0800 CST" date -d 不接受:(1) 奈秒小數 (2) 數字 offset + 縮寫同時存在 → CREATED_EPOCH=0 → stale 永不觸發 → lock 最長殘留 30min 才 timeout 修法:sed 去除奈秒與末尾縮寫後再解析,Python3 作備援 stale 告警訊息加上 age 秒數,方便排查 Co-Authored-By: Claude Opus 4.7 (1M context) --- .gitea/workflows/cd.yaml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/.gitea/workflows/cd.yaml b/.gitea/workflows/cd.yaml index ee1c6aac..de84a0d4 100644 --- a/.gitea/workflows/cd.yaml +++ b/.gitea/workflows/cd.yaml @@ -282,11 +282,21 @@ jobs: CREATED_AT=$(docker network inspect "$LOCK_NAME" \ --format '{{.Created}}' 2>/dev/null || true) if [ -n "$CREATED_AT" ]; then - CREATED_EPOCH=$(date -d "$CREATED_AT" +%s 2>/dev/null || echo 0) + # 2026-05-03 ogt: 修復 stale 偵測 — Docker 回傳 "2006-01-02 15:04:05.999999999 -0700 MST" + # date -d 不接受奈秒小數點與末尾時區縮寫(CST/MST 等),導致 CREATED_EPOCH=0 → stale 永不觸發 + # 修法:sed 去除奈秒 (.NNN...) 和末尾縮寫 (空格+大寫字母),GNU date 才能正確解析 + CREATED_CLEAN=$(echo "$CREATED_AT" | sed 's/\.[0-9]*//' | sed 's/ [A-Z][A-Z]*$//') + CREATED_EPOCH=$(date -d "$CREATED_CLEAN" +%s 2>/dev/null || \ + python3 -c " +import sys, datetime, re +ts = re.sub(r'\.\d+', '', sys.argv[1]) +ts = re.sub(r'\s+[A-Z]{2,4}$', '', ts.strip()) +print(int(datetime.datetime.strptime(ts, '%Y-%m-%d %H:%M:%S %z').timestamp())) +" "$CREATED_AT" 2>/dev/null || echo 0) NOW_EPOCH=$(date +%s) if [ "$CREATED_EPOCH" -gt 0 ] && \ [ $((NOW_EPOCH - CREATED_EPOCH)) -gt "$STALE_SECONDS" ]; then - echo "⚠️ stale Docker build lock detected, removing ${LOCK_NAME}" + echo "⚠️ stale Docker build lock detected (age=$((NOW_EPOCH - CREATED_EPOCH))s > ${STALE_SECONDS}s), removing ${LOCK_NAME}" docker network rm "$LOCK_NAME" >/dev/null 2>&1 || true continue fi