From f7686a3b2f77ecb003d7644243d34567a571e812 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Sat, 16 May 2026 15:26:05 +0000 Subject: [PATCH] refactor: tidy nuget push output --- Dockerfile | 12 +++--- entrypoint.sh | 112 ++++++++++++++++++++++++++++---------------------- 2 files changed, 70 insertions(+), 54 deletions(-) diff --git a/Dockerfile b/Dockerfile index fe309d5..c8c59c6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,13 @@ FROM mcr.microsoft.com/dotnet/sdk:10.0 -# 更新並安裝必要的工具後清理暫存檔案以減小映像檔大小 -RUN apt update \ - && apt install -y curl jq unzip \ - && apt clean \ +# 安裝必要工具,並清理 apt 快取以縮小映像檔 +RUN apt-get update \ + && apt-get install -y --no-install-recommends curl jq unzip \ + && apt-get clean \ && rm -rf /var/lib/apt/lists/* - + COPY entrypoint.sh /entrypoint.sh 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 82bc7e5..f5b459b 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,75 +1,91 @@ #!/bin/bash -echo "==================================================" +set -Eeuo pipefail -echo "參數檢查" +section() { + printf '\n==================================================\n' + printf '%s\n' "$1" + printf '--------------------------------------------------\n' +} -echo "--------------------------------------------------" +require_value() { + local name="$1" + local value="$2" -# 顯示 GITEA_SERVER_URL 參數,並檢查是否為空或 "null",如果是則輸出錯誤訊息並退出 -echo "GITEA_SERVER_URL=$GITEA_SERVER_URL" && ([ -z "$GITEA_SERVER_URL" ] || [ "$GITEA_SERVER_URL" = "null" ]) && exit 1 + printf '%s=%s\n' "$name" "$value" -# 顯示 GITEA_REPOSITORY 參數,並檢查是否為空或 "null",如果是則輸出錯誤訊息並退出 -echo "GITEA_REPOSITORY=$GITEA_REPOSITORY" && ([ -z "$GITEA_REPOSITORY" ] || [ "$GITEA_REPOSITORY" = "null" ]) && exit 1 + if [ -z "$value" ] || [ "$value" = "null" ]; then + printf '錯誤:%s 不可為空\n' "$name" >&2 + exit 1 + fi +} -# 顯示 RELEASE_VERSION 參數,並檢查是否為空或 "null",如果是則輸出錯誤訊息並退出 -echo "RELEASE_VERSION=$RELEASE_VERSION" && ([ -z "$RELEASE_VERSION" ] || [ "$RELEASE_VERSION" = "null" ]) && exit 1 +require_index() { + local value="$1" -# 顯示 RELEASE_INDEX 參數,並檢查是否為空或 "null",如果是則輸出錯誤訊息並退出 -echo "RELEASE_INDEX=$RELEASE_INDEX" && ([ -z "$RELEASE_INDEX" ] || [ "$RELEASE_INDEX" = "null" ]) && exit 1 + if [[ ! "$value" =~ ^[0-9]+$ ]]; then + printf '錯誤:RELEASE_INDEX 必須是非負整數\n' >&2 + exit 1 + fi +} -# 顯示 RUNNER_TOKEN 參數,並檢查是否為空或 "null",如果是則輸出錯誤訊息並退出 -echo "RUNNER_TOKEN=$RUNNER_TOKEN" && ([ -z "$RUNNER_TOKEN" ] || [ "$RUNNER_TOKEN" = "null" ]) && exit 1 +section "參數檢查" +require_value "GITEA_SERVER_URL" "${GITEA_SERVER_URL:-}" +require_value "GITEA_REPOSITORY" "${GITEA_REPOSITORY:-}" +require_value "RELEASE_VERSION" "${RELEASE_VERSION:-}" +require_value "RELEASE_INDEX" "${RELEASE_INDEX:-}" +require_index "${RELEASE_INDEX:-}" +require_value "RUNNER_TOKEN" "${RUNNER_TOKEN:-}" +require_value "NUGET_AUTHOR" "${NUGET_AUTHOR:-}" -# 顯示 NUGET_AUTHOR 參數,並檢查是否為空或 "null",如果是則輸出錯誤訊息並退出 -echo "NUGET_AUTHOR=$NUGET_AUTHOR" && ([ -z "$NUGET_AUTHOR" ] || [ "$NUGET_AUTHOR" = "null" ]) && exit 1 +section "取得成品連結" -echo "==================================================" +release_header="Authorization: token $RUNNER_TOKEN" +release_api_url="$GITEA_SERVER_URL/api/v1/repos/$GITEA_REPOSITORY/releases/tags/v$RELEASE_VERSION" -echo "取得成品連結" +printf 'RELEASE_API_URL=%s\n' "$release_api_url" -echo "--------------------------------------------------" +release_json="$(curl -fsSL -H "$release_header" "$release_api_url")" +release_asset_path=".assets[$RELEASE_INDEX]" -# 組合 RELEASE_HEADER 參數,並顯示出來 -RELEASE_HEADER="Authorization: token $RUNNER_TOKEN" && echo "RELEASE_HEADER=$RELEASE_HEADER" +release_name="$(printf '%s' "$release_json" | jq -r "$release_asset_path.name")" +require_value "RELEASE_NAME" "$release_name" -# 組合 RELEASE_URL 參數,並顯示出來 -RELEASE_URL="$GITEA_SERVER_URL/api/v1/repos/$GITEA_REPOSITORY/releases/tags/v$RELEASE_VERSION" && echo "RELEASE_URL=$RELEASE_URL" +release_url="$(printf '%s' "$release_json" | jq -r "$release_asset_path.browser_download_url")" +require_value "RELEASE_URL" "$release_url" -# 取得成品資訊 -RELEASE_JSON="$(curl -s -H "$RELEASE_HEADER" "$RELEASE_URL")" +section "下載成品" -# 從成品資訊取得名稱 -RELEASE_NAME="$(echo "$RELEASE_JSON" | jq -r ".assets[$RELEASE_INDEX].name")" && echo "RELEASE_NAME=$RELEASE_NAME" && ([ -z "$RELEASE_NAME" ] || [ "$RELEASE_NAME" = "null" ]) && exit 1 +curl -fsSL -H "$release_header" "$release_url" -o "$release_name" +printf '已下載:%s\n' "$release_name" -# 從成品資訊取得連結 -RELEASE_URL="$(echo "$RELEASE_JSON" | jq -r ".assets[$RELEASE_INDEX].browser_download_url")" && echo "RELEASE_URL=$RELEASE_URL" && ([ -z "$RELEASE_URL" ] || [ "$RELEASE_URL" = "null" ]) && exit 1 +section "解壓縮成品" -echo "==================================================" +rm -rf output +mkdir -p output +unzip -q "$release_name" -d output +printf '已解壓縮到:%s\n' "output" -echo "下載成品" +section "推送 NUGET 套件" -echo "--------------------------------------------------" +nuget_source="$GITEA_SERVER_URL/api/packages/$NUGET_AUTHOR/nuget/index.json" +printf 'NUGET_SOURCE=%s\n' "$nuget_source" -curl -H "$RELEASE_HEADER" "$RELEASE_URL" -o "$RELEASE_NAME" +mapfile -t nuget_packages < <(find output -type f -name '*.nupkg' | sort) -echo "==================================================" +if [ "${#nuget_packages[@]}" -eq 0 ]; then + printf '錯誤:找不到 .nupkg 檔案\n' >&2 + exit 1 +fi -echo "解壓縮成品" +nuget_package="${nuget_packages[0]}" -echo "--------------------------------------------------" +printf 'NUGET_PACKAGE=%s\n' "$nuget_package" -unzip "$RELEASE_NAME" -d output +dotnet nuget push "$nuget_package" \ + --source "$nuget_source" \ + --api-key "$RUNNER_TOKEN" \ + --skip-duplicate \ + --allow-insecure-connections -echo "==================================================" - -echo "推送 NUGET 套件" - -echo "--------------------------------------------------" - -# 組合 NUGET_SOURCE 參數,並顯示出來 -NUGET_SOURCE="$GITEA_SERVER_URL/api/packages/$NUGET_AUTHOR/nuget/index.json" && echo "NUGET_SOURCE=$NUGET_SOURCE" - -dotnet nuget push "output/*.nupkg" --source "$NUGET_SOURCE" --api-key "$RUNNER_TOKEN" --skip-duplicate --allow-insecure-connections - -echo "==================================================" \ No newline at end of file +section "完成"