Skip to content

ci: pin actions, isolate the reviewer and lint workflows for security - #621

Merged
whes1015 merged 12 commits into
mainfrom
ci/harden-workflows
Oct 16, 2026
Merged

whes1015 merged 12 commits into
mainfrom
ci/harden-workflows

Conversation

@whes1015

@whes1015 whes1015 commented Oct 15, 2026 •

Copy link
Copy Markdown
Member

Stack 最後一層:下面的 #614、#616、#615、#618、#619、#620 都已合併,base 是 main。

這個 PR 做了什麼

收緊 GitHub Actions 的供應鏈與權限:所有 action 改釘 commit SHA、review.yml 在帶 secrets 的環境裡不再跑任何 PR 能控制的東西、actionlint 不再從 main 用 curl | bash 執行,並新增 workflow 安全檢查(zizmor)、Dependabot、套件 import lint 和 DateTime.now() gate。另外修正三處和程式碼不符的文件。

改動內容

CI/workflow

  • c1cfa263 所有 action 改釘完整 commit SHA,後面附 # vX.Y.Z(用 gh api 解析 tag,annotated tag 追到 commit)。原本的 @v5 這類 tag 可以被移動。
  • 1f0f22c9 Dependabot:只管 GitHub Actions,每週一次、7 天冷卻期(避免剛發布就被竄改的版本立刻被拉進來),合成一個 PR。
    • Dependabot 的 commit 一定帶 Signed-off-by: dependabot[bot],會被 tool/check/commits.sh 擋下,審查者要用自己的名義重新 commit。檔案裡有寫。
  • 80c27b67 review.yml 不再執行 PR 能控制的任何東西
    • 原本在 pull_request_target(有 secrets)底下跑 alibaba/open-code-review@main。現在釘在 v1.12.13,它安裝的 npm CLI 也用 ocr_version: 1.12.13 釘住;不釘的話會裝 latest,action 釘了也沒用。
    • workflow 預設權限改成無,job 只拿 contents: read、pull-requests: write(和原本相同)。
    • 拼進 script 的值改走 env;加上威脅模型說明:只 checkout base、只抓 head 的 git 物件,不執行 PR 的程式碼。
  • d9db2096 actionlint 改成固定版本並驗證 checksum
    • tool/internal/pinned_tool.sh 下載 actionlint 1.7.12 和 zizmor 1.30.1,比對每個壓縮檔的 SHA-256,不符就拒絕(已測)。執行檔放在 .git/dpip-tools。
    • tool/check/workflows.sh 用和原本相同的 -shellcheck= 參數執行,CI 和 tool/check.sh 都跑。
  • 92523e13 不推送的 job 不把 token 留在 .git/config(persist-credentials: false);只有發布 job 需要推 tag 而保留。
  • b290b7f7 release.yml 每個 job 只拿用得到的權限:workflow 預設無;version 與 build 只能讀;publish 可寫(推 tag、建 release)。
    • 唯讀 token 看不到 draft release,只看得到已發布的;release workflow 本來就不建 draft,所以版本序號檢查不受影響。
    • 持有簽章金鑰和商店憑證的 build job 不再拿可寫的 token。
  • b2bcf370 release.yml 的建置值改走環境變數,不再用 ${{ }} 直接貼進 script。secrets 刻意不放進 Build 步驟的環境,讓建置相依讀不到。
  • d2901118 新增 workflow 安全檢查:tool/check/workflow_security.sh 離線跑 zizmor,CI 和本機都跑。
    • release 的四個快取保留,各加上有理由的 ignore:只有 main/tag 自己存的快取會被還原,PR 的快取不會進到這個 job。唯一例外是 review.yml 以 main 範圍代 PR 執行,這個風險由它的版本釘選控制。
  • 71a0eff4 開啟 always_use_package_imports:lib/ 沒有違規,layering.sh 的註解跟著更新。vendor 的 third_party/meshtastic_flutter(產生的 protobuf 程式碼)有自己的 analysis_options.yaml,繼承根目錄規則但排除這一條。
  • 2546891f DateTime.now() gate:tool/check/wall_clock.sh 找出 lib/ 裡沒有 // wall-clock: <理由> 標記的呼叫,CI 和 tool/check.sh(有快取)都跑;13 個測試在 test/tool/wall_clock_gate_test.dart。既有 24 個呼叫都標上具體理由。

文件

  • acd378bd ARCHITECTURE.md 的推播章節照程式碼重寫(傳輸是 awesome_notifications_fcm,不是 firebase_messaging),notification_service.dart 裡相同的過時說明一起改。AppDelegate.swift 的註解改成實際接手通知 delegate 的 awesome_notifications(已從原始碼確認)。
  • b486504e 拿掉 reporter 文件裡從沒實作過的「四分之一抽籤」,測試註解一起改。

相關 issue

沒有對應的 issue。

怎麼驗

  • tool/commit.sh --push 通過:analyze、codegen、全部 Dart 測試、actionlint、zizmor、新的 wall-clock gate。
  • checksum 不符時拒絕執行,已手動測試。
  • 合併後第一次 snapshot release 要盯一下:release.yml 的權限與環境變數改動只有實際跑 release 才驗得到。

需要在 repo 設定裡做的:

  • Settings → Actions:關閉「Allow GitHub Actions to create and approve pull requests」(目前開著)。
  • 同一頁的預設 workflow 權限目前是「write」,每個 job 都已自己宣告,可以改成「read」。
  • Dependabot 在 dependabot.yml 進到 main 後自動開始,不用另外開。
  • Dependabot 升級 review action 時,ocr_version 要手動跟著改,Dependabot 看不到那一行。
  • ci.yml 的 git fetch 現在不帶憑證,因為 repo 是公開的;如果改成私有,要把憑證加回去。
  • 要升級兩個 linter:改版本並更新 pinned_tool.sh 裡的四個 checksum。zizmor 選 1.30.1 而不是 1.31.0,因為後者只發布一天,不符合 7 天冷卻。
  • Windows 上這兩個 workflow gate 會失敗並說明原因,不會跳過。

另外發現的: lib/features/earthquake/data/monitor_demo.dart 第 61、81、117、139、254 行的 debug 示範時間戳應該用 AppTime(在時鐘錯誤的手機上,示範倒數會偏差同樣的量)。這個 PR 只標記,不改行為。

檢查清單

  • tool/check/commits.sh 通過
  • 一個 commit 一件事
  • analyze 與測試通過(tool/commit.sh --push)
  • 沒有新的使用者可見字串
  • 沒有 UI 變更

@codecov

codecov Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 94.49%. Comparing base (15abd92) to head (2546891).
⚠️ Report is 15 commits behind head on main.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@whes1015

Copy link
Copy Markdown
Member Author

Force-push:rebase 到目前的 main(807f5d9d),並把開著的 PR 排成 stack:#614 → #616 → #615 → #618 → #619 → #620 → #621,base 改成下面那一層的分支。

和 main 及其他 PR 的衝突都是兩邊各自新增的內容,雙方都保留;ARB 在檔尾補逗號後重新產生 l10n。每一層都單獨跑過 analyze 和完整測試,頂端跑過 tool/commit.sh --push。

唯一有實質修改的是「pass build values to scripts through the environment」這個 commit:#620 新增的 DPIP_PRERELEASE 也改走環境變數 RELEASE_PRERELEASE,#620 檢查這一行的測試跟著更新。

@whes1015
whes1015 added this pull request to stack #626 October 16, 2026 19:21
@whes1015
whes1015 force-pushed the ci/harden-workflows branch from d89345d to 54e97e0 Compare October 16, 2026 19:31
@whes1015

Copy link
Copy Markdown
Member Author

Force-push:#614 合併後 rebase 到新的 main(238297ea),拿掉 #614 合併前的舊 commit。

內容沒有變:main 上合併進來的 tree 和 stack 第一層完全相同,搬過去之後每一層的 tree 也都和之前一樣,所以先前各層的 analyze 和測試結果仍然有效。

@whes1015
whes1015 force-pushed the ci/harden-workflows branch from 54e97e0 to 81ac7d9 Compare October 16, 2026 19:37
@whes1015

Copy link
Copy Markdown
Member Author

Force-push:#616 合併後 rebase 到新的 main(34336fb6),拿掉 #616 合併前的舊 commit。

內容沒有變:main 上合併進來的 tree 和 stack 第一層完全相同,搬過去之後每一層的 tree 也都和之前一樣。push 前 gate 全過。

@whes1015
whes1015 force-pushed the ci/harden-workflows branch 2 times, most recently from e184fc2 to 4944f11 Compare October 16, 2026 19:48
@whes1015

Copy link
Copy Markdown
Member Author

Force-push:#615、#618 合併後 rebase 到新的 main(690e746f)。

「Update branch」會把這一層疊在下面那層 commit 的副本上,所以先前多出 #615、#618 的重複 commit;這次 rebase 把它們拿掉了。內容沒有變:每一層的 tree 和之前相同,push 前 gate 全過。

@whes1015
whes1015 force-pushed the ci/harden-workflows branch from 4944f11 to b034964 Compare October 16, 2026 19:53
@whes1015

Copy link
Copy Markdown
Member Author

Force-push:#619 合併後 rebase 到新的 main(15abd92d),拿掉 #619 合併前的舊 commit。

內容沒有變:每一層的 tree 和之前相同,push 前 gate 全過。

Base automatically changed from feat/prerelease-diagnostics to main October 16, 2026 20:21
@whes1015
whes1015 force-pushed the ci/harden-workflows branch from b034964 to 2546891 Compare October 16, 2026 20:24
@whes1015

Copy link
Copy Markdown
Member Author

Force-push:#620 合併後 rebase 到新的 main(e4075e6c),拿掉 #620 合併前的舊 commit。

內容沒有變:tree 和之前相同,push 前 gate 全過。

@whes1015
whes1015 merged commit bc4dc0e into main Oct 16, 2026
6 checks passed
@whes1015
whes1015 deleted the ci/harden-workflows branch October 16, 2026 20:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant