81 lines
1.7 KiB
Bash
81 lines
1.7 KiB
Bash
#!/bin/bash
|
||
set -u
|
||
|
||
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() {
|
||
log "[WARN] 收到取消訊號,停止健康檢查。"
|
||
exit 130
|
||
}
|
||
|
||
trap on_terminate TERM INT
|
||
|
||
HEALTH_CODE="${HEALTH_CODE:-200}"
|
||
|
||
section "參數檢查"
|
||
if [ -z "${CHECK_URL:-}" ] || [ "$CHECK_URL" = "null" ]; then
|
||
fail "CHECK_URL 不可為空。"
|
||
fi
|
||
|
||
if [ -z "$HEALTH_CODE" ] || [ "$HEALTH_CODE" = "null" ]; then
|
||
fail "HEALTH_CODE 不可為空。"
|
||
fi
|
||
|
||
case "$CHECK_URL" in
|
||
http://*|https://*) ;;
|
||
*)
|
||
fail "CHECK_URL 只允許 http:// 或 https://。"
|
||
;;
|
||
esac
|
||
|
||
log "[INFO] CHECK_URL=$CHECK_URL"
|
||
log "[INFO] HEALTH_CODE=$HEALTH_CODE"
|
||
|
||
section "取得狀態碼"
|
||
log "[INFO] 開始檢查:$CHECK_URL"
|
||
|
||
while true; do
|
||
printf '[%s] [INFO] GET %s ... ' "$(timestamp)" "$CHECK_URL"
|
||
|
||
status_code="$(curl -sS --proto '=http,https' --proto-redir '=http,https' --max-time 60 --url "$CHECK_URL" -o /dev/null -w '%{http_code}' || true)"
|
||
if [ -z "$status_code" ]; then
|
||
status_code="000"
|
||
fi
|
||
|
||
printf '%s\n' "$status_code"
|
||
|
||
if [ "$status_code" = "$HEALTH_CODE" ]; then
|
||
log "[OK] 狀態碼符合預期:$status_code"
|
||
break
|
||
fi
|
||
|
||
log "[WARN] 目前狀態碼 $status_code,預期 $HEALTH_CODE,60 秒後重試。"
|
||
sleep 60
|
||
done
|
||
|
||
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
|