From ac57fff0ad48493080a1cdd96564f77ead9018df Mon Sep 17 00:00:00 2001 From: Jeffery Date: Sat, 16 May 2026 15:10:22 +0000 Subject: [PATCH] chore: polish health check output --- Dockerfile | 12 ++------ entrypoint.sh | 79 ++++++++++++++++++++++++++++++++++----------------- 2 files changed, 56 insertions(+), 35 deletions(-) diff --git a/Dockerfile b/Dockerfile index af59210..01abb7f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,21 +1,15 @@ FROM ubuntu:latest -# 更新並安裝必要的工具後清理暫存檔案以減小映像檔大小 -RUN apt update \ - && apt install -y curl \ - && apt clean \ +RUN apt-get update \ + && apt-get install -y --no-install-recommends curl \ && rm -rf /var/lib/apt/lists/* -# 複製私人證書到容器中 COPY rootCA.pem /usr/local/share/ca-certificates/rootCA.crt COPY jsc.idv.me+4.pem /usr/local/share/ca-certificates/jsc.idv.me+4.crt -# 複製入口腳本到容器中 COPY entrypoint.sh /entrypoint.sh -# 更新 CA 證書以確保系統信任新的證書 RUN update-ca-certificates - RUN chmod +x /entrypoint.sh -ENTRYPOINT ["/entrypoint.sh"] \ No newline at end of file +ENTRYPOINT ["/entrypoint.sh"] diff --git a/entrypoint.sh b/entrypoint.sh index 844a85d..3401e37 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,46 +1,73 @@ #!/bin/bash +set -u -# 當 GitHub Actions 手動取消 workflow 時,Runner 會對容器送出終止訊號。 -# 透過 trap 可在收到訊號時立即退出,避免無限迴圈持續重試。 +timestamp() { + date -u +"%Y-%m-%dT%H:%M:%SZ" +} + +log() { + printf '[%s] %s\n' "$(timestamp)" "$1" +} + +section() { + printf '\n==================================================\n' + printf '%s\n' "$1" + printf '%s\n' '--------------------------------------------------' +} + +fail() { + log "[ERROR] $1" + exit 1 +} + +# 當 workflow 被取消時,立即結束,避免健康檢查持續重試。 on_terminate() { - echo "[$(date -u +"%Y-%m-%dT%H:%M:%SZ")] 收到取消訊號,停止健康檢查。" + log "[WARN] 收到取消訊號,停止健康檢查。" exit 130 } trap on_terminate TERM INT -echo "==================================================" +HEALTH_CODE="${HEALTH_CODE:-200}" -echo "參數檢查" +section "參數檢查" +if [ -z "${CHECK_URL:-}" ] || [ "$CHECK_URL" = "null" ]; then + fail "CHECK_URL 不可為空。" +fi -echo "--------------------------------------------------" +if [ -z "$HEALTH_CODE" ] || [ "$HEALTH_CODE" = "null" ]; then + fail "HEALTH_CODE 不可為空。" +fi -# 顯示 CHECK_URL 參數,並檢查是否為空或 "null",如果是則輸出錯誤訊息並退出 -echo "CHECK_URL=$CHECK_URL" && ([ -z "$CHECK_URL" ] || [ "$CHECK_URL" = "null" ]) && exit 1 +log "[INFO] CHECK_URL=$CHECK_URL" +log "[INFO] HEALTH_CODE=$HEALTH_CODE" -# 顯示 HEALTH_CODE 參數,並檢查是否為空或 "null",如果是則輸出錯誤訊息並退出 -echo "HEALTH_CODE=$HEALTH_CODE" && ([ -z "$HEALTH_CODE" ] || [ "$HEALTH_CODE" = "null" ]) && exit 1 +section "取得狀態碼" +log "[INFO] 開始檢查:$CHECK_URL" -echo "==================================================" - -echo "取得狀態碼" - -echo "--------------------------------------------------" - -# 使用無窮迴圈持續嘗試,直到成功取得有效狀態碼 while true; do - echo -n "[$(date -u +"%Y-%m-%dT%H:%M:%SZ")] $CHECK_URL ... " + printf '[%s] [INFO] GET %s ... ' "$(timestamp)" "$CHECK_URL" - # 使用 curl 取得狀態碼,最長等待 60 秒,並將結果輸出到環境變數 STATUS_CODE - STATUS_CODE=$(curl -s --max-time 60 -o /dev/null -w "%{http_code}" "$CHECK_URL") + status_code="$(curl -sS --max-time 60 -o /dev/null -w '%{http_code}' "$CHECK_URL" || true)" + if [ -z "$status_code" ]; then + status_code="000" + fi - echo "$STATUS_CODE" && [ "$STATUS_CODE" == "$HEALTH_CODE" ] && break + printf '%s\n' "$status_code" - # 如果狀態碼為 "000",表示連線失敗,等待 60 秒後重試 + if [ "$status_code" = "$HEALTH_CODE" ]; then + log "[OK] 狀態碼符合預期:$status_code" + break + fi + + log "[WARN] 目前狀態碼 $status_code,預期 $HEALTH_CODE,60 秒後重試。" sleep 60 done -echo "==================================================" - -# 將狀態碼輸出到環境變數 -echo "status_code=$STATUS_CODE" >> "$GITHUB_OUTPUT" \ No newline at end of file +section "完成" +log "[INFO] 輸出 status_code=$status_code" +if [ -n "${GITHUB_OUTPUT:-}" ]; then + echo "status_code=$status_code" >> "$GITHUB_OUTPUT" +else + log "[WARN] GITHUB_OUTPUT 未設定,略過寫入輸出檔。" +fi