diff --git a/entrypoint.sh b/entrypoint.sh index 9e71d87..7ee7e92 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,96 +1,109 @@ #!/bin/bash -echo "==================================================" +set -euo pipefail -echo "參數檢查" +readonly LINE="==================================================" +readonly SUBLINE="--------------------------------------------------" -echo "--------------------------------------------------" +section() { + printf '\n%s\n%s\n%s\n' "$LINE" "$1" "$SUBLINE" +} -# 顯示 GITEA_SERVER_URL 參數,並檢查是否為空或 "null",如果是則輸出錯誤訊息並退出 -echo "GITEA_SERVER_URL=$GITEA_SERVER_URL" && ([ -z "$GITEA_SERVER_URL" ] || [ "$GITEA_SERVER_URL" = "null" ]) && exit 1 +info() { + printf '[info] %s\n' "$1" +} -# 顯示 GITEA_REPOSITORY 參數,並檢查是否為空或 "null",如果是則輸出錯誤訊息並退出 -echo "GITEA_REPOSITORY=$GITEA_REPOSITORY" && ([ -z "$GITEA_REPOSITORY" ] || [ "$GITEA_REPOSITORY" = "null" ]) && exit 1 +fail() { + printf '[error] %s\n' "$1" >&2 + exit 1 +} -# 顯示 RUNNER_TOKEN 參數 -echo "RUNNER_TOKEN=$RUNNER_TOKEN" +require_env() { + local name="$1" + local value="$2" -# 顯示 IS_BETA 參數,未設定時預設為 false -echo "IS_BETA=$IS_BETA" && ([ -z "$IS_BETA" ] || [ "$IS_BETA" = "null" ]) && IS_BETA="false" + if [ -z "$value" ] || [ "$value" = "null" ]; then + fail "$name 未設定" + fi -echo "==================================================" + printf '%s=%s\n' "$name" "$value" +} -echo "取得最新的版本號" +write_output() { + printf 'version=%s\n' "$1" >> "$GITHUB_OUTPUT" +} -echo "--------------------------------------------------" +section "參數檢查" -# 組合 RELEASE_URL 參數,並顯示出來 -RELEASE_URL="$GITEA_SERVER_URL/api/v1/repos/$GITEA_REPOSITORY/releases" && echo "RELEASE_URL=$RELEASE_URL" +require_env "GITEA_SERVER_URL" "${GITEA_SERVER_URL:-}" +require_env "GITEA_REPOSITORY" "${GITEA_REPOSITORY:-}" -# 檢查是否為空或 "null" -if [ -n "$RUNNER_TOKEN" ] && [ "$RUNNER_TOKEN" != "null" ]; then - # 組合 RELEASE_HEADER 參數,並顯示出來 - RELEASE_HEADER="Authorization: token $RUNNER_TOKEN" && echo "RELEASE_HEADER=$RELEASE_HEADER" - - # 取得成品資訊 - RELEASE_JSON="$(curl -s -H "$RELEASE_HEADER" "$RELEASE_URL")" +if [ -n "${RUNNER_TOKEN:-}" ] && [ "${RUNNER_TOKEN:-}" != "null" ]; then + printf 'RUNNER_TOKEN=%s\n' '***' else - # 取得成品資訊 - RELEASE_JSON="$(curl -s "$RELEASE_URL")" + printf 'RUNNER_TOKEN=%s\n' '未提供' fi -# 從成品資訊取得最新的正式版版本號(排除 beta,去除 v 前綴) -LATEST_VERSION=$(echo "$RELEASE_JSON" | jq -r '[.[] | select(.tag_name | test("-beta\\.") | not)] | if length > 0 then .[0].tag_name else "v0.0.0" end' | sed 's/^v//') +IS_BETA="${IS_BETA:-false}" +if [ "$IS_BETA" = "null" ] || [ -z "$IS_BETA" ]; then + IS_BETA="false" +fi +printf 'IS_BETA=%s\n' "$IS_BETA" -# 並檢查是否為空或 "null" 後 -([ -z "$LATEST_VERSION" ] || [ "$LATEST_VERSION" = "null" ]) && LATEST_VERSION="0.0.0" +section "取得版本資料" -# 顯示 LATEST_VERSION 參數 -echo "LATEST_VERSION=$LATEST_VERSION" +RELEASE_URL="$GITEA_SERVER_URL/api/v1/repos/$GITEA_REPOSITORY/releases" +info "RELEASE_URL=$RELEASE_URL" -echo "==================================================" +if [ -n "${RUNNER_TOKEN:-}" ] && [ "${RUNNER_TOKEN:-}" != "null" ]; then + info "使用授權 token 取得 release" + RELEASE_JSON="$(curl -fsS -H "Authorization: token $RUNNER_TOKEN" "$RELEASE_URL")" +else + info "使用匿名請求取得 release" + RELEASE_JSON="$(curl -fsS "$RELEASE_URL")" +fi -echo "計算版本號" +LATEST_VERSION="$( + printf '%s' "$RELEASE_JSON" | jq -r ' + [ .[] | select(.tag_name | test("-beta\\.") | not) | .tag_name ][0] // "v0.0.0" + ' | sed 's/^v//' +)" -echo "--------------------------------------------------" +if [ -z "$LATEST_VERSION" ] || [ "$LATEST_VERSION" = "null" ]; then + LATEST_VERSION="0.0.0" +fi + +info "LATEST_VERSION=$LATEST_VERSION" + +section "計算版本號" -# 分解版本號 IFS='.' read -r MAJOR MINOR PATCH <<< "$LATEST_VERSION" +MAJOR="${MAJOR:-0}" +MINOR="${MINOR:-0}" +PATCH="${PATCH:-0}" -# 確保變數為數字 -MAJOR=${MAJOR:-0} -MINOR=${MINOR:-0} -PATCH=${PATCH:-0} - -# 增加 PATCH 版本 PATCH=$((PATCH + 1)) +if [ "$PATCH" -ge 10 ]; then + PATCH=0 + MINOR=$((MINOR + 1)) +fi -# 如果 PATCH >= 10,重置為 0 並增加 MINOR 版本 -[ $PATCH -ge 10 ] && { PATCH=0; MINOR=$((MINOR + 1)); } +if [ "$MINOR" -ge 10 ]; then + MINOR=0 + MAJOR=$((MAJOR + 1)) +fi -# 如果 MINOR >= 10,重置為 0 並增加 MAJOR 版本 -[ $MINOR -ge 10 ] && { MINOR=0; MAJOR=$((MAJOR + 1)); } - -# 組合新的版本號 NEW_VERSION="$MAJOR.$MINOR.$PATCH" -# 如果是 beta 版本,計算 beta 編號 if [ "$IS_BETA" = "true" ]; then - # 從所有 release 中找出符合 NEW_VERSION-beta.N 的最大 beta 編號 - BETA=$(echo "$RELEASE_JSON" | jq -r --arg prefix "v$NEW_VERSION-beta." \ - '[.[] | select(.tag_name | startswith($prefix)) | .tag_name | ltrimstr($prefix) | tonumber] | if length > 0 then max else 0 end') - + BETA="$( + printf '%s' "$RELEASE_JSON" | jq -r --arg prefix "v$NEW_VERSION-beta." ' + [ .[] | select(.tag_name | startswith($prefix)) | .tag_name | ltrimstr($prefix) | tonumber ] | if length > 0 then max else 0 end + ' + )" BETA=$((BETA + 1)) - - NEW_VERSION="$NEW_VERSION-beta.$BETA" && echo "NEW_VERSION=$NEW_VERSION" - - # 將版本輸出到環境變數 - echo "version=$NEW_VERSION" >> $GITHUB_OUTPUT && exit 0 + NEW_VERSION="$NEW_VERSION-beta.$BETA" fi -echo "NEW_VERSION=$NEW_VERSION" - -echo "==================================================" - -# 將版本輸出到環境變數 -echo "version=$NEW_VERSION" >> $GITHUB_OUTPUT \ No newline at end of file +info "NEW_VERSION=$NEW_VERSION" +write_output "$NEW_VERSION"