Skip to content
All writing Part 07 of 09 · 一次 Golang 版本升級的連鎖反應
Engineering · 1 min read

釘版要附退場計畫

一個附了觸發原因、版本理由和解除條件的 pin 看起來完美,但證明回歸是真的、目標不是 EOL,才是真正的工作。

我們釘到 alpine:3.20,寫了教科書等級的退場筆記:觸發原因、為什麼選這個版本、什麼時候可以解除。三個欄位都填了。完美——除了「回歸」(regression:更新後壞掉的行為)不是真的,而 3.20 已經 EOL(End of Life,官方不再修補)。

釘版繞過一個上游回歸是合理的,靜默地釘版才是陷阱。一個沒有退場筆記的 pin 會變成一個沒人記得要解除的凍結。在 pin 旁邊記三件事:

  • 觸發原因:什麼迫使你釘版(「go.mod → 1.25 拉進了更新的 Alpine / libvips」)
  • 為什麼選這個版本:什麼是已知好的,你怎麼驗證的
  • 解除條件:讓你可以拔掉 pin 的具體事件

退場條件是區分刻意的暫時性 pin 和意外腐爛的關鍵。

釘版之前,先證明回歸是真的。 Pin 繼承了底下診斷的正確性。先用生產形態的輸入驗證(見測試結果只是關於輸入的事實)——釘過一個不存在的 bug 等於無故凍結。

然後確認「最後已知好」的版本不是 EOL。 通過測試的最新版本可能已經 end-of-life,用真實的 CVE(公開揭露的安全漏洞)修補換來了一個修正(見 EOL base image 讓安全更新靜默失效)。

觀察到回歸 閘門 1:用生產形態的輸入能重現嗎? 不能 → 沒東西需要釘 閘門 2:「最後已知好」還在支援中嗎? 不是 → 用 CVE 修補換修正 PIN + 三則筆記 觸發原因 │ 為什麼選這版 │ 解除條件 解除條件觸發 → 拔掉 pin (沒寫條件 → pin 悄悄變成永久的)
兩道閘門都被跳過——任何一道都能獨立終止事件。

兩道閘門都被跳過了,而任何一道都能獨立終止事件:閘門 1 因為回歸不是真的,閘門 2 因為 3.20 已經 EOL。退場筆記,那個唯一做對的部分,反而是最不重要的部分。

pin 的退場計畫是最容易寫的部分;驗證你有東西需要 pin,才是真正的工作。


參考來源:

Related: 回到連鎖反應總覽,或參見測試結果只是關於輸入的事實EOL base image 讓安全更新靜默失效

Tags #devops #debugging #docker
// connect

Be brave | Be wise | Be grateful

21 BreakinCode

// elsewhere
LinkedInMedium (lang: en)Youtube
wh:~$William Hung· © 2026 Taipei · GMT+8 · Available for collaboration