diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..bb589a0 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,11 @@ +FROM alpine:latest + +# 更新並安裝必要的工具後清理暫存檔案以減小映像檔大小 +RUN apk update \ + && apk add --no-cache curl jq + +COPY entrypoint.sh /entrypoint.sh + +RUN chmod +x /entrypoint.sh + +ENTRYPOINT ["/entrypoint.sh"] \ No newline at end of file diff --git a/action.yaml b/action.yaml index e43cfb2..85fd278 100644 --- a/action.yaml +++ b/action.yaml @@ -1,88 +1,14 @@ -name: 'Calculate Version' -description: '自動計算語義化版本號' -inputs: - gitea-server: - description: 'Gitea 伺服器 URL' - required: true - repository: - description: '儲存庫名稱 (格式: owner/repo)' - required: true - token: - description: 'Gitea API Token' - required: true - initial-version: - description: '初始版本號' - required: false - default: '0.0.1' - patch-limit: - description: '小版號上限 (達到時進位中版號)' - required: false - default: '10' - minor-limit: - description: '中版號上限 (達到時進位大版號)' - required: false - default: '10' +name: 'CALCULATE VERSION' +description: '計算版本號' +author: 'Jeffery' outputs: - version: + VERSION: description: '計算出的新版本號' value: ${{ steps.calculate.outputs.version }} - previous-version: - description: '上一個版本號' - value: ${{ steps.calculate.outputs.previous-version }} runs: - using: 'composite' - steps: - - name: 計算版本號 - id: calculate - shell: bash - run: | - # 獲取最新的 release tag - LATEST_TAG=$(curl -s "${{ inputs.gitea-server }}/api/v1/repos/${{ inputs.repository }}/releases" \ - -H "Authorization: token ${{ inputs.token }}" \ - -H "Accept: application/json" | \ - jq -r 'if length > 0 then .[0].tag_name else "v0.0.0" end' | sed 's/^v//') - - # 如果沒有找到版本或版本為空,使用初始版本前一版 - if [ -z "$LATEST_TAG" ] || [ "$LATEST_TAG" = "null" ]; then - # 解析初始版本並減1來設定基準 - IFS='.' read -r INIT_MAJOR INIT_MINOR INIT_PATCH <<< "${{ inputs.initial-version }}" - if [ $INIT_PATCH -gt 0 ]; then - LATEST_TAG="$INIT_MAJOR.$INIT_MINOR.$((INIT_PATCH - 1))" - elif [ $INIT_MINOR -gt 0 ]; then - LATEST_TAG="$INIT_MAJOR.$((INIT_MINOR - 1)).$((inputs.patch-limit - 1))" - elif [ $INIT_MAJOR -gt 0 ]; then - LATEST_TAG="$((INIT_MAJOR - 1)).$((inputs.minor-limit - 1)).$((inputs.patch-limit - 1))" - else - LATEST_TAG="0.0.0" - fi - fi - - echo "上一版本: $LATEST_TAG" - echo "previous-version=$LATEST_TAG" >> $GITHUB_OUTPUT - - # 分解版本號 - IFS='.' read -r MAJOR MINOR PATCH <<< "$LATEST_TAG" - - # 確保變數為數字 - MAJOR=${MAJOR:-0} - MINOR=${MINOR:-0} - PATCH=${PATCH:-0} - - # 增加 patch 版本 - PATCH=$((PATCH + 1)) - - # 如果 patch >= 上限,重置為 0 並增加 minor - if [ $PATCH -ge ${{ inputs.patch-limit }} ]; then - PATCH=0 - MINOR=$((MINOR + 1)) - fi - - # 如果 minor >= 上限,重置為 0 並增加 major - if [ $MINOR -ge ${{ inputs.minor-limit }} ]; then - MINOR=0 - MAJOR=$((MAJOR + 1)) - fi - - NEW_VERSION="$MAJOR.$MINOR.$PATCH" - echo "新版本: $NEW_VERSION" - echo "version=$NEW_VERSION" >> $GITHUB_OUTPUT + using: 'docker' + image: 'Dockerfile' + env: + GITEA_SERVER_URL: ${{ gitea.server_url }} + GITEA_REPOSITORY: ${{ gitea.repository }} + RUNNER_TOKEN: ${{ secrets.RUNNER_TOKEN }} \ No newline at end of file diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..c0ae05d --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,69 @@ +#!/bin/bash + +echo "==================================================" + +echo "參數檢查" + +echo "--------------------------------------------------" + +# 顯示 GITEA_SERVER_URL 參數,並檢查是否為空或 "null",如果是則輸出錯誤訊息並退出 +echo "GITEA_SERVER_URL=$GITEA_SERVER_URL" && ([ -z "$GITEA_SERVER_URL" ] || [ "$GITEA_SERVER_URL" = "null" ]) && exit 1 + +# 顯示 GITEA_REPOSITORY 參數,並檢查是否為空或 "null",如果是則輸出錯誤訊息並退出 +echo "GITEA_REPOSITORY=$GITEA_REPOSITORY" && ([ -z "$GITEA_REPOSITORY" ] || [ "$GITEA_REPOSITORY" = "null" ]) && exit 1 + +# 顯示 RUNNER_TOKEN 參數,並檢查是否為空或 "null",如果是則輸出錯誤訊息並退出 +echo "RUNNER_TOKEN=$RUNNER_TOKEN" && ([ -z "$RUNNER_TOKEN" ] || [ "$RUNNER_TOKEN" = "null" ]) && exit 1 + +echo "==================================================" + +echo "取得最新的版本號" + +echo "--------------------------------------------------" + +# 組合 RELEASE_HEADER 參數,並顯示出來 +RELEASE_HEADER="Authorization: token $RUNNER_TOKEN" && echo "RELEASE_HEADER=$RELEASE_HEADER" + +# 組合 RELEASE_URL 參數,並顯示出來 +RELEASE_URL="$GITEA_SERVER_URL/api/v1/repos/$GITEA_REPOSITORY/releases" && echo "RELEASE_URL=$RELEASE_URL" + +# 取得成品資訊 +RELEASE_JSON="$(curl -s -H "$RELEASE_HEADER" "$RELEASE_URL")" + +# 從成品資訊取得最新的版本號 +LATEST_VERSION=$(echo "$RELEASE_JSON" | jq -r 'if length > 0 then .[0].tag_name else "v0.0.0" end' | sed 's/^v//') + +# 並檢查是否為空或 "null" 後 +([ -z "$LATEST_VERSION" ] || [ "$LATEST_VERSION" = "null" ]) && LATEST_VERSION="0.0.0" + +# 顯示 LATEST_VERSION 參數 +echo "LATEST_VERSION=$LATEST_VERSION" + +echo "==================================================" + +echo "計算版本號" + +echo "--------------------------------------------------" + +# 分解版本號 +IFS='.' read -r MAJOR MINOR PATCH <<< "$LATEST_VERSION" + +# 確保變數為數字 +MAJOR=${MAJOR:-0} +MINOR=${MINOR:-0} +PATCH=${PATCH:-0} + +# 增加 PATCH 版本 +PATCH=$((PATCH + 1)) + +# 如果 PATCH >= 10,重置為 0 並增加 MINOR 版本 +[ $PATCH -ge 10 ] && { PATCH=0; MINOR=$((MINOR + 1)); } + +# 如果 MINOR >= 10,重置為 0 並增加 MAJOR 版本 +[ $MINOR -ge 10 ] && { MINOR=0; MAJOR=$((MAJOR + 1)); } + +# 組合新的版本號 +NEW_VERSION="$MAJOR.$MINOR.$PATCH" + +# 將版本輸出到環境變數 +echo "version=$NEW_VERSION" >> $GITHUB_OUTPUT \ No newline at end of file diff --git a/readme.md b/readme.md deleted file mode 100644 index 56b159d..0000000 --- a/readme.md +++ /dev/null @@ -1,97 +0,0 @@ -# Calculate Version Action - -這是一個自動計算語義化版本號的 GitHub Action,支援自定義版本遞增規則。 - -## 功能特色 - -- 🔄 自動從 Gitea releases 獲取最新版本 -- 📈 支援自定義版本遞增規則 -- 🎯 可配置的版本號上限 -- 🔧 完全可重用的 composite action - -## 輸入參數 - -| 參數名稱 | 必要 | 預設值 | 描述 | -|---------|------|--------|------| -| `gitea-server` | ✅ | - | Gitea 伺服器 URL | -| `repository` | ✅ | - | 儲存庫名稱 (格式: owner/repo) | -| `token` | ✅ | - | Gitea API Token | -| `initial-version` | ❌ | `0.0.1` | 初始版本號 | -| `patch-limit` | ❌ | `10` | 小版號上限 (達到時進位中版號) | -| `minor-limit` | ❌ | `10` | 中版號上限 (達到時進位大版號) | - -## 輸出參數 - -| 參數名稱 | 描述 | -|---------|------| -| `version` | 計算出的新版本號 | -| `previous-version` | 上一個版本號 | - -## 使用範例 - -### 基本用法 - -```yaml -- name: 計算版本號 - id: version - uses: ./.gitea/actions/calculate-version - with: - gitea-server: ${{ gitea.server_url }} - repository: ${{ gitea.repository }} - token: ${{ secrets.GITEA_TOKEN }} -``` - -### 自定義設定 - -```yaml -- name: 計算版本號 - id: version - uses: ./.gitea/actions/calculate-version - with: - gitea-server: ${{ gitea.server_url }} - repository: ${{ gitea.repository }} - token: ${{ secrets.GITEA_TOKEN }} - initial-version: '1.0.0' - patch-limit: '5' # 小版號到 4 時進位 - minor-limit: '5' # 中版號到 4 時進位 -``` - -### 使用輸出 - -```yaml -- name: 顯示版本資訊 - run: | - echo "上一版本: ${{ steps.version.outputs.previous-version }}" - echo "新版本: ${{ steps.version.outputs.version }}" - -- name: 建立 Release - uses: akkuman/gitea-release-action@v1 - with: - name: "My App v${{ steps.version.outputs.version }}" - tag_name: "v${{ steps.version.outputs.version }}" -``` - -## 版本遞增規則 - -1. **預設增加小版號 (patch)**:每次執行都會增加小版號 -2. **小版號進位**:當小版號 ≥ `patch-limit` 時,重置為 0 並增加中版號 -3. **中版號進位**:當中版號 ≥ `minor-limit` 時,重置為 0 並增加大版號 - -### 範例版本演進 (預設設定) - -``` -初始:0.0.1 -第2次:0.0.2 -... -第10次:0.0.9 -第11次:0.1.0 ← 小版號重置,中版號進位 -... -第101次:0.9.9 -第102次:1.0.0 ← 中版號重置,大版號進位 -``` - -## 注意事項 - -- Action 必須放在 `.gitea/actions/calculate-version/` 目錄下 -- 需要有 `GITEA_TOKEN` secret 來存取 API -- 第一次執行時會從 `initial-version` 開始計算