From 4127833c20fe5865acb430d0bf59eb80c46c118a Mon Sep 17 00:00:00 2001 From: Jeffery Date: Wed, 15 Jul 2026 14:58:37 +0800 Subject: [PATCH 1/2] =?UTF-8?q?chore(gitea=20=E5=B7=A5=E4=BD=9C=E6=B5=81):?= =?UTF-8?q?=20=E6=94=B9=E7=94=A8=E5=85=B1=E7=94=A8=20scoped=20workflows?= =?UTF-8?q?=EF=BC=8Cci.yaml=20=E6=94=B9=E7=82=BA=20codex=20=E8=87=AA?= =?UTF-8?q?=E6=B8=AC=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 共同的 CI / CD(版本計算、release 發佈、AI Code Review、tag 反查、release 清理) 改由 composite-template 的 scoped workflows 自動套用;本 repo 僅保留 codex CLI 安裝與實測的自測流程(workflow 名稱同為 CI,僅 develop 的 PR 執行), 並移除功能已被共用流程覆蓋的 master.yaml。 Co-Authored-By: Claude Fable 5 --- .gitea/workflows/ci.yaml | 132 ++++++++--------------------------- .gitea/workflows/master.yaml | 54 -------------- 2 files changed, 30 insertions(+), 156 deletions(-) delete mode 100644 .gitea/workflows/master.yaml diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 839c7aa..cf1a29c 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -1,140 +1,68 @@ # ============================================================================= -# CI Workflow(Gitea Actions) -# 用途:在 Pull Request 開啟或更新時觸發的持續整合流程,依序執行三個 job: -# 1. BUILD - 發佈 Gitea Release(beta 版本號取自 run_number),並輸出 is_beta。 -# 2. TEST - 依 BUILD 輸出的 is_beta 決定是否執行;checkout 原始碼,執行本 -# composite action(setup-codex),再用 codex exec 產生「自我介紹」 -# 文字,透過 heredoc 寫入 job output。 -# 3. RESULT - 顯示 TEST job 輸出的 message,用於驗證整條流程串接成功。 -# 另外,CI 僅在 base 分支為 master 或 develop 的 Pull Request 觸發。 -# 更新日期:2026/07/03 17:56:45 +# setup-codex 專案自測工作流 +# +# 共同的 CI / CD 流程(版本計算、release 發佈、AI Code Review、tag 反查、 +# release 清理)由 actions/composite-template 的 scoped workflows 自動套用, +# 本檔只保留 setup-codex 專屬的自測步驟,與共用流程並行執行: +# 以本 repo 根目錄的 composite action(./)安裝 codex CLI, +# 再執行 codex exec 產生自我介紹,驗證安裝與認證成功。 +# +# 參數優先權:${{ gitea.* }} -> ${{ vars.* }}(比照共用工作流,不使用 env 傳參) # ============================================================================= -# workflow 名稱,會顯示在 Gitea Actions 的執行清單中。 +# 名稱與共用工作流同為 CI(Gitea 以檔案路徑識別 workflow,名稱重複不會衝突; +# UI 上兩條 run 同名,可由 job 組成區分:共用版有 BUILD job,自測版只有 TEST / RESULT)。 name: CI -# 觸發條件設定區塊。 + on: - # 監聽 Pull Request 事件。 + # 與共用 CI 相同的觸發條件,僅在 PR 開啟與同步更新時執行。 pull_request: - # 限制只有當 PR 的目標(base)分支為 master 或 develop 時才觸發此 CI。 branches: - # 納入的目標分支:master。 - master - # 納入的目標分支:develop。 - develop - # 僅在 PR「開啟」(opened) 或「有新 commit 推送 / 更新」(synchronize) 時觸發, - # 避免 closed / reopened 等其他事件也啟動整條 CI。 types: [opened, synchronize] -# 定義本 workflow 的所有 job。 + jobs: - # ---- Job 1:BUILD(發佈 Release)---- - build: - # job 顯示名稱(前綴數字用於在 UI 中排序閱讀)。 - name: 1. BUILD - # 指定執行環境(runner label),使用 ubuntu runner。 - runs-on: ubuntu - # 此 job 專屬的環境變數。 - env: - # 定義環境變數 IS_BETA:當 PR 的 base 分支為 develop 時為字串 'true',否則為 'false'; - # 作為下方 is_beta 輸出的來源,用來決定 test job 是否執行。 - IS_BETA: ${{ gitea.base_ref == 'develop' }} - # 定義此 job 對外輸出,供後續 job(test)取用其判斷結果。 - outputs: - # 將環境變數 IS_BETA 暴露為 job 層級的 is_beta 輸出;當 PR base 分支為 develop 時為 'true', - # 供 test job 以 `if ... == 'true'` 判斷是否執行(即:僅 develop 的 PR 會跑 test)。 - is_beta: ${{ env.IS_BETA }} - # 此 job 的執行步驟。 - steps: - - name: Calculate Version - id: calculate-version - uses: https://gitea.jsc.idv.tw/actions/calculate-version@${{ vars.ACTION_CALCULATE_VERSION }} - with: - is_beta: ${{ env.IS_BETA }} - # 步驟:發佈 Release。 - - name: Publishing Release - # 使用第三方 action 建立 Gitea Release;版本號由 repo variable 控制, - # 便於集中管理 action 版本、避免硬編碼。 - uses: akkuman/gitea-release-action@${{ vars.ACTION_GITEA_RELEASE_VERSION }} - env: - VERSION: ${{ steps.calculate-version.outputs.version }} - # 傳入該 action 的參數。 - with: - # Release 顯示名稱:「儲存庫名稱 v版本號」。 - name: "${{ gitea.event.repository.name }} v${{ env.VERSION }}" - # Release 對應的 tag 名稱,前綴 v + 版本號。 - tag_name: "v${{ env.VERSION }}" - # tag 指向的 commit,使用本次觸發事件的 commit SHA。 - target_commitish: ${{ gitea.sha }} - # 是否標記為「預發佈」(prerelease):當 PR 目標分支 base_ref 為 develop 時為 true, - # 代表流向 develop 的變更視為預發佈版本。 - prerelease: ${{ env.IS_BETA }} - # ---- Job 2:TEST(執行 setup-codex 並產生自我介紹)---- + # ---- Job 1:TEST(安裝 codex CLI 並實際執行)---- test: - # job 顯示名稱。 - name: 2. TEST - # 指定 ubuntu runner。 + name: TEST runs-on: ubuntu - # 相依關係:需等 build job 成功後才執行。 - needs: [build] - # 執行條件:僅當 build job 的 is_beta 輸出等於字串 'true' 時才執行本 test job; - # 否則整個 test job 會被略過。 - if: ${{ needs.build.outputs.is_beta == 'true' }} - # 定義此 job 對外輸出,供後續 job(result)取用。 + # 比照共用 CI 的 beta 判斷:只有目標分支為 develop 的 PR 才自測。 + if: ${{ gitea.base_ref == 'develop' }} outputs: - # 將名為 execute 的步驟輸出的 message,暴露為 job 層級的 message 輸出。 + # 將 codex 的回覆往下傳給 result job。 message: ${{ steps.execute.outputs.message }} - # 此 job 的執行步驟。 steps: - # 步驟:取出原始碼。 + # 取出原始碼,讓 uses: ./ 能找到本 repo 的 composite action。 - name: Source Code Checkout - # 使用官方 checkout action 將 repo 內容拉到 runner;版本由 repo variable 控制。 uses: actions/checkout@${{ vars.ACTION_CHECKOUT_VERSION }} - # 步驟:執行本 repo 的 composite action(setup-codex)。 + # 執行本 repo 的 composite action(即 setup-codex 自身)。 - name: Run Setup Codex - # 指定步驟 id,方便後續引用其輸出。 id: setup-codex - # 「./」代表使用當前 repo 根目錄的 action(即本專案自身這個 composite action)。 uses: ./ - # 傳入該 action 的參數。 with: - # 從 secrets 帶入 CODEX_OAUTH 授權憑證,供 codex 登入 / 認證使用(機密不外顯)。 oauth: ${{ secrets.CODEX_OAUTH }} - # 步驟:實際呼叫 codex 產生自我介紹並寫入 job output。 + # 實際呼叫 codex 產生自我介紹,以 heredoc 寫入多行 output。 - name: Execute Codex - # 指定步驟 id 為 execute,對應上方 outputs.message 的來源。 id: execute - # 明確指定以 bash 執行下方 run 腳本。 shell: bash - # 多行 shell 腳本(run: | 表示保留換行的區塊字面值)。 run: | - # 執行 codex exec 送出提示「請你進行自我介紹」,取得回覆文字存入 MESSAGE 變數; - # 2>/dev/null 將 stderr 丟棄,避免非結果訊息污染輸出內容。 MESSAGE=$(codex exec "請你進行自我介紹" 2>/dev/null) - # 用大括號將多個 echo 群組化,統一把整段輸出一次重導向到 $GITHUB_OUTPUT。 { - # 宣告輸出鍵 message 並使用 heredoc 分隔符 CODEX_EOF,以支援「多行值」的寫法。 echo "message<>) 到 $GITHUB_OUTPUT 檔,登記為此步驟的 output。 } >> "$GITHUB_OUTPUT" - # ---- Job 3:RESULT(顯示 TEST 的 message)---- + + # ---- Job 2:RESULT(輸出 codex 回覆)---- result: - # job 顯示名稱。 - name: 3. RESULT - # 指定 ubuntu runner。 + name: RESULT runs-on: ubuntu - # 相依關係:需等 build 與 test 兩個 job 都完成後才執行。 - needs: [build,test] - # 此 job 專屬的環境變數。 - env: - # 從 test job 的輸出取得 message,供下方步驟印出。 - MESSAGE: ${{ needs.test.outputs.message }} - # 此 job 的執行步驟。 + needs: [test] steps: - # 步驟:印出訊息。 + # 這裡例外使用 step 層 env 中轉:message 為多行且可能含引號等特殊字元, + # 直接內嵌到 run 會破壞 shell 語法,經環境變數傳遞才安全。 - name: Show Message - # 將環境變數 MESSAGE 的內容輸出到 log,用於確認整條流程串接與 codex 回覆結果。 + env: + MESSAGE: ${{ needs.test.outputs.message }} run: echo "$MESSAGE" diff --git a/.gitea/workflows/master.yaml b/.gitea/workflows/master.yaml deleted file mode 100644 index 9088837..0000000 --- a/.gitea/workflows/master.yaml +++ /dev/null @@ -1,54 +0,0 @@ -# ============================================================================= -# 用途說明: -# 本 workflow 為「CD(持續部署)」流程,於程式碼 push 到 master 分支時觸發。 -# 主要工作為 checkout 完整原始碼、依指定 commit 反查其所屬的 git tag, -# 並將該 tag 輸出顯示,供後續部署或版本追蹤使用。 -# 更新日期:2026/07/03 17:43:30 (Asia/Taipei) -# ============================================================================= - -# workflow 名稱,顯示於 Gitea Actions 介面 -name: CD -# 觸發條件設定 -on: - # 監聽 push 事件 - push: - # 僅限定下列分支 - branches: - # 只有 push 到 master 分支時才會觸發本 workflow - - master -# 定義所有工作(jobs) -jobs: - # 部署工作,job 識別鍵為 deploy - deploy: - # 此 job 的顯示名稱 - name: DEPLOY - # 指定執行環境(runner label)為 ubuntu - runs-on: ubuntu - # job 層級環境變數 - env: - # 取事件 commits 陣列的第二筆(索引 1)之 commit id 作為要處理的 SHA - # 需人工確認:使用索引 1 而非 0,取的是事件中「第二個」commit; - # 當一次 push 只包含單一 commit 時,索引 1 可能取不到值(為空)。 - COMMIT_SHA: ${{ gitea.event.commits[1].id }} - # 依序執行的步驟 - steps: - # 步驟一:取出原始碼 - - name: Source Code Checkout - # 使用 actions/checkout,版本由 repo/organization 變數 ACTION_CHECKOUT_VERSION 決定 - uses: actions/checkout@${{ vars.ACTION_CHECKOUT_VERSION }} - # with:傳入 checkout action 的參數區塊 - with: - # fetch-depth: 0 代表抓取完整 git 歷史(含所有 tag), - # 以利後續 git describe 能正確反查 tag(淺層 clone 會導致查不到)。 - fetch-depth: 0 - # 步驟二:取得該 commit 所屬的 tag - - name: Get Commit Tag - # 設定步驟 id 為 commit,供後續步驟以 steps.commit.outputs 取得輸出 - id: commit - # git describe --contains 會找出「包含」指定 commit 的最近 tag, - # 並將結果以 tag=... 寫入 $GITEA_OUTPUT,成為此步驟的輸出參數 tag。 - run: echo "tag=$(git describe --contains ${{ env.COMMIT_SHA }})" >> $GITEA_OUTPUT - # 步驟三:顯示取得的 tag - - name: Show Tag - # 印出上一步(id=commit)輸出的 tag 值,方便於 log 確認結果 - run: echo "${{ steps.commit.outputs.tag }}" -- 2.53.0 From b8520349172427de98d839d8878541b8b35e60c5 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Wed, 15 Jul 2026 14:58:37 +0800 Subject: [PATCH 2/2] =?UTF-8?q?docs(=E5=B7=A5=E4=BD=9C=E6=B5=81=E8=AA=AA?= =?UTF-8?q?=E6=98=8E):=20=E6=94=B9=E5=AF=AB=20readme=20=E7=82=BA=E5=85=B1?= =?UTF-8?q?=E7=94=A8=E5=B7=A5=E4=BD=9C=E6=B5=81=E8=88=87=E8=87=AA=E6=B8=AC?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E8=AA=AA=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- .gitea/workflows/readme.md | 108 +++++++++++-------------------------- 1 file changed, 32 insertions(+), 76 deletions(-) diff --git a/.gitea/workflows/readme.md b/.gitea/workflows/readme.md index ca3bbf0..12ce827 100644 --- a/.gitea/workflows/readme.md +++ b/.gitea/workflows/readme.md @@ -1,86 +1,42 @@ -# ============================================================================= -# 用途說明: -# 這份文件整理 `.gitea/workflows/` 內現有 workflow 與其工作項目,方便人工 -# 快速理解 CI/CD 觸發條件與各 job 的責任分工。 -# 更新日期:2026/07/11 18:39:51 (Asia/Taipei) -# ============================================================================= +# setup-codex 工作流說明 + +本專案已改用共用工作流:共同的 CI / CD 流程由 `actions/composite-template` 的 `.gitea/scoped_workflows/`(Gitea scoped workflows 機制)自動套用到本 repo 執行,**不在本目錄內**。本目錄只保留 setup-codex 專屬的自測工作流,與共用流程並行執行。 ## 工作流總覽 -| 檔案 | 類型 | 名稱 | 目的 | 觸發條件 | -| --- | --- | --- | --- | --- | -| `.gitea/workflows/ci.yaml` | Workflow | `CI` | PR 進入 `master` / `develop` 時跑持續整合,並串接 release、Codex 測試與結果輸出 | `pull_request`,且 base branch 為 `master` 或 `develop`,事件型別為 `opened`、`synchronize` | -| `.gitea/workflows/master.yaml` | Workflow | `CD` | `master` 分支 push 後,查出對應 commit 所屬 tag 並輸出 | `push` 到 `master` | -| `.gitea/workflows/readme.md` | 文件 | 目前工作流清單文件 | 列出目前 workflow 與 job 名稱,供人工閱讀 | 無 | +| 檔案 | 名稱 | 觸發條件 | 目的 | +| --- | --- | --- | --- | +| (共用)`composite-template/.gitea/scoped_workflows/ci.yaml` | `CI` | `pull_request`(`opened`、`synchronize`;目標分支 `master` / `develop`) | 版本計算、release 發佈、AI Code Review、舊 release 清理 | +| (共用)`composite-template/.gitea/scoped_workflows/master.yaml` | `CD` | `push` 到 `master` | 反查本次合併對應的 release tag | +| `.gitea/workflows/ci.yaml` | `CI`(自測) | `pull_request`(`opened`、`synchronize`;目標分支 `master` / `develop`),僅 base 為 `develop` 時執行 | 以本 repo 的 composite action 安裝 codex CLI 並實測 | + +共用工作流的細節與 vars / secrets 需求,請見 `composite-template/.gitea/scoped_workflows/readme.md`。 ## `.gitea/workflows/ci.yaml` -- Workflow 名稱:`CI` -- 檔案路徑:`.gitea/workflows/ci.yaml` -- 目的: - - 在 Pull Request 開啟或更新時執行持續整合流程。 - - 先發佈 Gitea Release,再視條件執行 `setup-codex`,最後輸出 Codex 回覆內容做為流程驗證。 -- 觸發條件: - - `pull_request` - - 只在 PR base branch 為 `master` 或 `develop` 時觸發 - - 只在事件型別為 `opened`、`synchronize` 時觸發 -- 主要輸入 / 環境變數: - - `env.IS_BETA = ${{ gitea.base_ref == 'develop' }}` - - `vars.ACTION_CALCULATE_VERSION` - - `vars.ACTION_GITEA_RELEASE_VERSION` - - `vars.ACTION_CHECKOUT_VERSION` - - `secrets.CODEX_OAUTH` - - `gitea.event.repository.name` - - `gitea.sha` - - `needs.build.outputs.is_beta` - - `steps.calculate-version.outputs.version` - - `steps.execute.outputs.message` -- 重要節點: - - `build` job 先計算版本,再建立 Release。 - - `test` job 只在 `is_beta == 'true'` 時執行,也就是 base branch 為 `develop` 的 PR。 - - `test` job 會使用本 repo 的 composite action `./`,也就是 `setup-codex`。 - - `test` job 透過 `codex exec "請你進行自我介紹"` 產生多行訊息,寫入 job output。 - - `result` job 會把 `test` job 的 `message` 印到 log。 -- 備註: - - `build` job 與 `test` job 的輸出鏈很依賴 action 版本與 secrets 狀態,若外部 action 版本改變,行為可能跟著變動,需人工確認。 +### Job:TEST — 安裝並實測 codex CLI(`if: gitea.base_ref == 'develop'`) -## `.gitea/workflows/master.yaml` +| 步驟 | 目的 | +| --- | --- | +| `Source Code Checkout` | 取出原始碼,讓 `uses: ./` 能找到本 repo 的 composite action | +| `Run Setup Codex` | 執行本 repo 根目錄的 composite action(即 setup-codex 自身),以 OAuth 憑證完成 codex CLI 安裝與認證 | +| `Execute Codex` | 執行 `codex exec "請你進行自我介紹"`,將多行回覆以 heredoc 寫入 step output `message`,驗證 CLI 可用 | -- Workflow 名稱:`CD` -- 檔案路徑:`.gitea/workflows/master.yaml` -- 目的: - - 在 `master` 分支有 push 時,檢查完整 git 歷史後,以指定 commit 反查對應 tag,並輸出 tag。 -- 觸發條件: - - `push` - - 只限 `master` 分支 -- 主要輸入 / 環境變數: - - `vars.ACTION_CHECKOUT_VERSION` - - `env.COMMIT_SHA = ${{ gitea.event.commits[1].id }}` - - `GITEA_OUTPUT` - - `gitea.event.commits` - - `steps.commit.outputs.tag` -- 重要節點: - - `checkout` 使用 `fetch-depth: 0`,以保留完整 tag 歷史,方便 `git describe --contains` 查詢。 - - `Get Commit Tag` 會把 `git describe --contains` 的結果寫成 step output `tag`。 - - `Show Tag` 只負責把 tag 印出到 log。 -- 備註: - - `COMMIT_SHA` 取的是 `gitea.event.commits[1].id`,不是索引 0。這個寫法代表它預期事件中至少有兩筆 commits,若只有一筆 commit,可能取不到值,需人工確認。 - - `git describe --contains` 的結果會受 tag 存在與歷史關係影響;若 commit 不在任何 tag 可辨識範圍內,輸出可能不符合預期,需人工確認。 +### Job:RESULT — 輸出 codex 回覆 -## `.gitea/workflows/readme.md` +| 步驟 | 目的 | +| --- | --- | +| `Show Message` | 將 TEST 輸出的 `message` 印到執行紀錄,確認輸出鏈串接成功(此步驟例外以 step 層 `env` 中轉,因 message 為多行且可能含特殊字元) | -- 檔案路徑:`.gitea/workflows/readme.md` -- 類型:工作流清單文件,不是 workflow -- 目的: - - 目前以簡短清單列出 `CI` 與 `CD`,以及各自的 job 名稱。 -- 觸發條件: - - 無,這是文件。 -- 主要輸入 / 環境變數: - - 無 -- 重要節點: - - 目前內容只列出: - - `CI` -> `BUILD`、`TEST`、`RESULT` - - `CD` -> `BUILD`、`DEPLOY` -- 備註: - - 這份清單文件與實際 workflow 內容存在落差的可能性,因為 `master.yaml` 目前只看到 `deploy` job,沒有 `BUILD` job;此處需人工確認。 - - 若要把這份草稿直接覆寫成正式文件,建議先同步確認 workflow 與文件是否一致。 +### 參數 + +| 參數 | 優先權鏈 | 說明 | +| --- | --- | --- | +| 是否執行自測 | `gitea.base_ref == 'develop'` | 比照共用 CI 的 beta 判斷,僅 develop 的 PR 執行 | +| checkout 版本 | `vars.ACTION_CHECKOUT_VERSION` | 指定 `actions/checkout` 的 tag(組織層級已設定) | +| `oauth` | `secrets.CODEX_OAUTH` | codex CLI 的 OAuth 憑證(本 repo 專屬 secret,必須設定) | + +## 備註 + +- 原本的 CI / CD 工作流(版本計算、release 發佈、AI Code Review、tag 反查)已刪除,其功能完全由共用工作流覆蓋;目前的 `ci.yaml` 是內容不同的自測流程,請勿在本目錄重新加入與共用流程重複的步驟,否則同一事件會重複執行(重複發 release、重複 AI review)。 +- 自測與共用 CI 是兩條獨立的 workflow run,且顯示名稱同為 `CI`(Gitea 以檔案路徑識別,名稱重複不衝突;可由 job 組成區分——共用版為 `BUILD / TEST / RESULT`,自測只有 `TEST / RESULT`)。自測失敗不會擋下共用 CI 的 release 發佈,合併前請同時確認兩者的執行結果。 -- 2.53.0