commit 516b5a59f92c66eb218da4b268d87fd45e7b61f5 Author: Jeffery Date: Thu Sep 18 14:32:23 2025 +0800 first commit diff --git a/.gitea/workflows/master.yaml b/.gitea/workflows/master.yaml new file mode 100644 index 0000000..4a53e4b --- /dev/null +++ b/.gitea/workflows/master.yaml @@ -0,0 +1,28 @@ +on: + push: + branches: + - master +jobs: + cd: + name: "CD > 發布專案" + runs-on: docker + env: + RUNNER_TOOL_CACHE: /toolcache + steps: + - name: 計算版本號 + id: version + uses: https://gitea.jsc.idv.tw/jiantw83/calculate-version-action@v${{ vars.CALCULATE_VERSION }} + with: + gitea-server: ${{ gitea.server_url }} + repository: ${{ gitea.repository }} + token: ${{ secrets.GITEA_TOKEN }} + - name: 發布專案 + uses: akkuman/gitea-release-action@v1 + with: + tag_name: "v${{ steps.version.outputs.VERSION }}" + - name: 清理舊版本 (保留最新2個) + uses: https://gitea.jsc.idv.tw/jiantw83/cleanup-release-action@v${{ vars.CLEANUP_RELEASE_VERSION }} + with: + gitea-server: ${{ gitea.server_url }} + repository: ${{ gitea.repository }} + token: ${{ secrets.GITEA_TOKEN }} \ No newline at end of file diff --git a/action.yaml b/action.yaml new file mode 100644 index 0000000..e43cfb2 --- /dev/null +++ b/action.yaml @@ -0,0 +1,88 @@ +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' +outputs: + 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 diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..56b159d --- /dev/null +++ b/readme.md @@ -0,0 +1,97 @@ +# 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` 開始計算