diff --git a/Dockerfile b/Dockerfile index eeb3e2e..62fd762 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,10 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0 +FROM mcr.microsoft.com/dotnet/sdk:10.0 -RUN apt-get update \ - && apt-get install -y --no-install-recommends curl jq unzip docker \ +# 更新並安裝必要的工具後清理暫存檔案以減小映像檔大小 +RUN apt update \ + && apt install -y curl jq unzip \ && rm -rf /var/lib/apt/lists/* - + COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh diff --git a/action.yaml b/action.yaml index 61c8479..ca579ad 100644 --- a/action.yaml +++ b/action.yaml @@ -1,17 +1,20 @@ name: 'NUGET PUSH' -description: '打包套件' +description: '推送 NUGET 套件' author: 'Jeffery' inputs: - token: - default: '' - version: + RELEASE_VERSION: required: true - source: - required: true - api_key: - required: true - index: + description: '要推送的版本號,ex: ${{ needs.calculate.outputs.version }}' + RELEASE_INDEX: default: 0 + description: '要推送的版本中第幾個成品,預設為 0' runs: using: 'docker' image: 'Dockerfile' + env: + GITEA_SERVER_URL: ${{ gitea.server_url }} + GITEA_REPOSITORY: ${{ gitea.repository }} + RELEASE_VERSION: ${{ inputs.RELEASE_VERSION }} + RELEASE_INDEX: ${{ inputs.RELEASE_INDEX }} + RUNNER_TOKEN: ${{ secrets.RUNNER_TOKEN }} + NUGET_AUTHOR: ${{ gitea.author }} \ No newline at end of file diff --git a/entrypoint.sh b/entrypoint.sh index 2ba4d2e..047df25 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,78 +1,73 @@ -#!/bin/sh -set -eu +#!/bin/bash -token="${INPUT_TOKEN:-}" -version="${INPUT_VERSION:?INPUT_VERSION is required}" -nuget_source="${INPUT_SOURCE:?INPUT_SOURCE is required}" -api_key="${INPUT_API_KEY:?INPUT_API_KEY is required}" -asset_index="${INPUT_INDEX:-0}" -server_url="${GITEA_SERVER_URL:-${GITHUB_SERVER_URL:-}}" -repository="${GITEA_REPOSITORY:-${GITHUB_REPOSITORY:-}}" +echo "==================================================" -if [ -z "${server_url}" ]; then - echo "GITEA_SERVER_URL or GITHUB_SERVER_URL is required" >&2 - exit 1 -fi +echo "參數檢查" -if [ -z "${repository}" ]; then - echo "GITEA_REPOSITORY or GITHUB_REPOSITORY is required" >&2 - exit 1 -fi +echo "--------------------------------------------------" -release_url="${server_url}/api/v1/repos/${repository}/releases/tags/v${version}" -work_dir="/tmp/nuget-push" -archive_dir="${work_dir}/archive" -output_dir="${work_dir}/output" +# 顯示 GITEA_SERVER_URL 參數,並檢查是否為空或 "null",如果是則輸出錯誤訊息並退出 +echo "GITEA_SERVER_URL=$GITEA_SERVER_URL" && ([ -z "$GITEA_SERVER_URL" ] || [ "$GITEA_SERVER_URL" = "null" ]) && exit 1 -mkdir -p "${archive_dir}" "${output_dir}" +# 顯示 GITEA_REPOSITORY 參數,並檢查是否為空或 "null",如果是則輸出錯誤訊息並退出 +echo "GITEA_REPOSITORY=$GITEA_REPOSITORY" && ([ -z "$GITEA_REPOSITORY" ] || [ "$GITEA_REPOSITORY" = "null" ]) && exit 1 -fetch_json() { - if [ -n "${token}" ]; then - curl -fsSL -H "Authorization: token ${token}" "$1" - return - fi +# 顯示 RELEASE_VERSION 參數,並檢查是否為空或 "null",如果是則輸出錯誤訊息並退出 +echo "RELEASE_VERSION=$RELEASE_VERSION" && ([ -z "$RELEASE_VERSION" ] || [ "$RELEASE_VERSION" = "null" ]) && exit 1 - curl -fsSL "$1" -} +# 顯示 RELEASE_INDEX 參數,並檢查是否為空或 "null",如果是則輸出錯誤訊息並退出 +echo "RELEASE_INDEX=$RELEASE_INDEX" && ([ -z "$RELEASE_INDEX" ] || [ "$RELEASE_INDEX" = "null" ]) && exit 1 -download_file() { - if [ -n "${token}" ]; then - curl -fsSL -H "Authorization: token ${token}" "$1" -o "$2" - return - fi +# 顯示 RUNNER_TOKEN 參數,並檢查是否為空或 "null",如果是則輸出錯誤訊息並退出 +echo "RUNNER_TOKEN=$RUNNER_TOKEN" && ([ -z "$RUNNER_TOKEN" ] || [ "$RUNNER_TOKEN" = "null" ]) && exit 1 - curl -fsSL "$1" -o "$2" -} +# 顯示 NUGET_AUTHOR 參數,並檢查是否為空或 "null",如果是則輸出錯誤訊息並退出 +echo "NUGET_AUTHOR=$NUGET_AUTHOR" && ([ -z "$NUGET_AUTHOR" ] || [ "$NUGET_AUTHOR" = "null" ]) && exit 1 -echo "RELEASE_URL: ${release_url}" +echo "==================================================" -release_json="$(fetch_json "${release_url}")" -download_name="$(printf '%s' "${release_json}" | jq -er ".assets[${asset_index}].name")" -download_url="$(printf '%s' "${release_json}" | jq -er ".assets[${asset_index}].browser_download_url")" -archive_path="${archive_dir}/${download_name}" +echo "取得成品連結" -echo "DOWNLOAD_NAME: ${download_name}" -echo "DOWNLOAD_URL: ${download_url}" +echo "--------------------------------------------------" -echo "ARTIFACT DOWNLOADING..." -download_file "${download_url}" "${archive_path}" +# 組合 RELEASE_HEADER 參數,並顯示出來 +RELEASE_HEADER="Authorization: token $RUNNER_TOKEN" && echo "RELEASE_HEADER=$RELEASE_HEADER" -echo "ARTIFACT UNZIPPING..." -unzip -o "${archive_path}" -d "${output_dir}" >/dev/null +# 組合 RELEASE_URL 參數,並顯示出來 +RELEASE_URL="$GITEA_SERVER_URL/api/v1/repos/$GITEA_REPOSITORY/releases/tags/v$RELEASE_VERSION" && echo "RELEASE_URL=$RELEASE_URL" -packages_found=0 +# 取得成品資訊 +RELEASE_JSON="$(curl -s -H "$RELEASE_HEADER" "$RELEASE_URL")" -echo "ARTIFACT PUSHING..." -for package in "${output_dir}"/*.nupkg; do - if [ ! -f "${package}" ]; then - continue - fi +# 從成品資訊取得名稱與連結 +RELEASE_NAME="$(echo "$RELEASE_JSON" | jq -r ".assets[$RELEASE_INDEX].name")" && echo "RELEASE_NAME=$RELEASE_NAME" +RELEASE_URL="$(echo "$RELEASE_JSON" | jq -r ".assets[$RELEASE_INDEX].browser_download_url")" && echo "RELEASE_URL=$RELEASE_URL" - packages_found=1 - dotnet nuget push "${package}" --source "${nuget_source}" --api-key "${api_key}" --skip-duplicate -done +echo "==================================================" -if [ "${packages_found}" -eq 0 ]; then - echo "No .nupkg files found after extracting ${download_name}" >&2 - exit 1 -fi \ No newline at end of file +echo "下載成品" + +echo "--------------------------------------------------" + +curl -H "$RELEASE_HEADER" "$RELEASE_URL" -o "$RELEASE_NAME" + +echo "==================================================" + +echo "解壓縮成品" + +echo "--------------------------------------------------" + +unzip "$RELEASE_NAME" -d output + +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