Skip to content

掃描掛回 PR、草稿也跑 CI,並開始量覆蓋率 - #18

Merged
hoshimoe merged 2 commits into
mainfrom
claude/ci-minutes-coverage-49ujcd
Aug 22, 2026
Merged

掃描掛回 PR、草稿也跑 CI,並開始量覆蓋率#18
hoshimoe merged 2 commits into
mainfrom
claude/ci-minutes-coverage-49ujcd

Conversation

@hoshimoe

@hoshimoe hoshimoe commented Aug 22, 2026

Copy link
Copy Markdown
Member

CI 方案升級之後,執行成本不再參與任何取捨。判準收斂成一句:CI 做得到的驗證,就讓它在合併前跑。 手動觸發只留給診斷與特殊組合。

改動

  • security.yml:三道「掃描不上 PR」閘門拆掉。 先前的理由是「這幾種掃描找到的東西是修一次就結束的,在 PR 攔下與在 main 攔下代價一樣,所以省下每個 PR 數分鐘」。那句話的前半仍然成立,後半不再是收益;而代價一直都在——一個在 main 才被攔下的問題,是一個已經合併的問題

  • 草稿 PR 也跑 CI。 檔頭的註解先前寫著「草稿不跑(下面每個 job 的 if)」,而那個 if 在本倉庫根本不存在——草稿 PR 一直都在跑。註解描述的是一件沒有發生的事,而且方向是「以為更省」,所以不會有帳單、不會有紅燈、不會有任何人抱怨。現在條文與行為對上了,而且對的是「跑」那一邊。

  • 覆蓋率開始量go/),總數印進 job summary(附逐套件明細),profile 留成 artifact。刻意不設下限:一個憑空訂的數字要嘛擋不住任何東西、要嘛讓某些套件從第一天起就紅,而一個永遠紅著的檢查等於沒有檢查

  • 修掉一段指著條文說自己不必照辦的註解。 security job 上方寫著「本倉庫是公開的,所以掃描與 gojs 同時起跑,不等它們綠燈」,並聲明「兩種形狀是刻意的,不是漂移」。那段文字從 2026-08-16 起就是錯的,而且取代它的 needs: 一直都在——就在同一個 job 裡下面幾行,還帶著自己的註解。沒有跟上的只有那段文字。

    這是最不容易被查的形狀:讀到的人會以為「這裡已經對照過了」,於是沒有人去對照。

零相依那條硬性規則不受影響:這一輪沒有動 go/go.modjs/package.json,覆蓋率量測用的是 Go 內建的 -coverprofile,沒有引入任何工具。

本機驗證

go buildgo vetgofmt -lgo test -race 四項綠,npm test 綠,覆蓋率 81.6%(這一輪量到最高的一個)。

CI 成本不再是判準(使用者裁示 2026-08-21,Enterprise 50k 分鐘/月),
判準收斂成一句:CI 做得到的驗證,就讓它在合併前跑。

- security.yml:CodeQL/govulncheck/Trivy 各自那條
  `if: github.event_name != 'pull_request'` 拆掉。2026-08-16 那個取捨的
  前半仍然成立(這三種找到的東西是修一次就結束的),失效的是後半——
  省下的分鐘數值 0,而「在 main 才被攔下 = 已經合併」的代價一直都在。
- ci.yml 的檔頭:草稿 PR 也跑 CI。舊註解寫著「草稿不跑(下面每個 job 的
  if)」,而那個 if 十五個倉庫裡只有兩個真的有——十三個倉庫的草稿 PR
  一直都在跑,註解描述的是一件沒有發生的事。那種錯不會自己被發現:
  它的方向是「以為更省」,不會有帳單也不會有紅燈。
- 覆蓋率:量出來、報進 job summary、留成 artifact。在此之前十五個倉庫的
  workflow 裡 -coverprofile 一次都沒有出現。刻意不設下限——當天量到的
  十個 Go 倉庫是 42.5%~81.6%,一個統一的數字要嘛擋不住任何東西、
  要嘛讓兩個倉庫從第一天起就紅。

決策見 workspace decisions/infrastructure/CI-成本不再是判準.md。
本倉庫**比其他倉庫更需要這一層,因為它是公開的**。內部服務出貨到 Debian
節點,平臺是我們自己決定的;這裡的使用者是誰、在什麼作業系統上編譯,
我們不知道。一個「只在 Linux 上成立」的假設,在這裡是**對外承諾的一部分**。

兩層各回答一個問題,**不得互相代替**(裁示 2026-08-22):

- **交叉編譯**(`Go SDK` job)——我能不能在開發環境裡建立生產執行檔?
  五個目標各 build + vet 一遍。本倉庫先前**一個都沒有**。
- **目標平臺實跑**(新的 `platforms` job)——有沒有遺漏平臺特定語法
  可能造成失敗?Windows 與 macOS 上真的 build/vet/test,Go 與 JS 都跑。

第一次跑就抓到兩個,兩個都只在 Windows 上成立:

1. **`logging` 斷言 log 檔是 0600**。NTFS 有 ACL、沒有 POSIX mode,
   每個可寫檔案 `os.Stat` 都回 0666。照前例處置:講明那個保證在這個平臺上
   不成立,不假裝通過。
2. **`lifecycle` 的測試用 `syscall.SIGUSR1`,Windows 沒有這個符號**——
   不是斷言紅,是**整個測試套件編不過**。拆成 `signal_unix_test.go`
   (`!windows`,內容一個位元組沒改)與 `signal_windows_test.go`
   (講明 Windows 為什麼送不出信號:沒有 SIGUSR1,而 `os.Process.Signal`
   在那裡只支援 Kill)。

**Windows 那半刻意留一支會印出來的測試,而不是讓那個檔案在 Windows 上
不存在**——一個單純排除掉某平臺的測試套件,從那個平臺看過去,
跟一個通過的套件長得一模一樣。

驗證:五個目標 build + vet 全過、Linux 全套測試綠、JS 33 項全過。
@hoshimoe
hoshimoe merged commit a36d2bb into main Aug 22, 2026
11 checks passed
@hoshimoe
hoshimoe deleted the claude/ci-minutes-coverage-49ujcd branch August 22, 2026 14:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant