推出破壞性變更的指南

回報問題 查看原始碼 夜間 7.4 ,直接在 Google Cloud 控制台實際操作。 7.3 7.2 7.1 7.0 6.5

我們要對 Bazel 做出破壞性變更是不可避免的。我們必須 變更設計並修正效果不彰的問題不過,我們需要 確保社群與 Bazel 生態系統都能遵循為此 Bazel 專案採用了 回溯相容性政策。 本文件說明 Bazel 協作者如何做出破壞 您在 Bazel 中進行的變更以遵守這項政策。

  1. 遵守設計文件政策

  2. 回報 GitHub 問題。

  3. 執行變更。

  4. 更新標籤。

  5. 更新存放區。

  6. 將不相容標記翻轉

GitHub 問題

回報 GitHub 問題 在 Bazel 存放區中執行 查看範例

建議您:

  • 標題開頭為標記名稱 (標記名稱開頭為 incompatible_)。

  • 您新增了標籤 incompatible-change

  • 說明包含變更的說明,以及相關設計文件的連結。

  • 說明中包含遷移方案,可讓使用者瞭解 更新程式碼理想情況下,如果採用的是機械式變更,則請在變更時 遷移工具。

  • 說明中包含了就算 就無法遷移這樣一來,搜尋引擎就能更容易找到 GitHub 問題。請確認錯誤訊息有幫助且可採取行動。可能的話,錯誤訊息應包含不相容的名稱 旗標。

遷移工具時,請考慮使用以下工具: 建構工具。 這項工具可將自動修正項目套用至 BUILDWORKSPACE.bzl 檔案。此裝置也可能會回報警告。

導入作業

在 Bazel 中建立新標記。預設值必須為 false。說明文字應包含 GitHub 問題的網址。由於標記名稱開頭為 incompatible_,因此需要中繼資料標記:

      metadataTags = {
        OptionMetadataTag.INCOMPATIBLE_CHANGE,
      },

在提交說明中,簡要說明標記。並在下列表單中新增 RELNOTES:RELNOTES: --incompatible_name_of_flag has been added. See #xyz for details

修訂版本也應更新相關說明文件,確保沒有 程式碼與文件不一致的修訂視窗。由於說明文件有版本控制,因此不會不小心提前發布變更。

標籤

合併修訂版本,並準備好採用不相容的變更時,請新增標籤 migration-ready 以便瞭解 GitHub 的問題。

如果發現旗標有問題,且使用者應該目前無法遷移: 移除旗標 migration-ready

如果你打算在下一個主要版本中翻轉旗標,請加上「breaking-change-X.0」標籤對問題的影響

更新存放區

Bazel CI 會在 Bazel@HEAD + Downstream。這些依附元件通常是其他 Bazel 專案的依附元件,因此必須遷移這些依附元件,才能讓更廣大的社群解除遷移作業的封鎖。如要監控這些專案的遷移狀態,您可以使用 bazelisk-plus-incompatible-flags 管道。 如要瞭解這個管道的運作方式,請按這裡

我們的開發支援團隊會監控 migration-ready 標籤。將這個標籤新增至 GitHub 問題後,團隊會處理下列事項:

  1. 在 GitHub 問題中建立註解,追蹤需要遷移的失敗和下游專案清單 (參閱範例)

  2. 回報 GitHub 問題,以通知因不相容變更而中斷的每個下游專案擁有者 (查看範例)

  3. 確認所有問題都已在目標發布日期前解決

至於遷移下游管道中的專案,「並」不算是不相容的變更作者,但您可以採取下列做法,加快遷移作業速度,讓 Bazel 使用者和 Bazel Green Team 作業更輕鬆。

  1. 傳送 PR 以修正下游專案。

  2. 請洽詢 Bazel 社群,以便取得遷移相關協助 (例如 Bazel 規則作者 SIG)。

翻轉旗幟

將標記的預設值切換為 true 之前,請確認下列事項:

  • 遷移生態系統中的核心存放區。

    bazelisk-plus-incompatible-flags 管道中,標記應顯示在 The following flags didn't break any passing Bazel team owned/co-owned projects 下方。

  • 檢查清單中的所有問題都標示為已修正/已關閉。

  • 使用者疑慮和問題已解決。

如果標記已準備好在 Bazel 中切換,但在 Google 內部遷移作業中遭到封鎖,建議您在內部 blazerc 檔案中將標記值設為 false,以解除標記切換的封鎖。如此一來,我們就能確保 Bazel 使用者在預設情況下優先仰賴新行為。

將標記預設值變更為 true 時,請注意:

  • 在修訂版本說明中使用 RELNOTES[INC],並加上 格式如下: RELNOTES[INC]: --incompatible_name_of_flag is flipped to true. See #xyz for details 您可以在修訂版本說明的其餘部分加入其他資訊。
  • 在說明中使用 Fixes #xyz,這樣在合併了提交內容後,GitHub 問題就會關閉。
  • 視需要查看並更新說明文件。
  • 請提出新問題 #abc,以便追蹤移除標記的進度。

移除標記

在 HEAD 中切換標記後,應最終從 Bazel 中移除。如果您打算移除不相容的標記:

  • 如有重大不相容的變更,請考慮讓使用者有更多時間完成遷移。 在理想情況下,標記應可在至少一個主要版本中提供。
  • 對於移除標記的提交,請在說明中使用 Fixes #abc,這樣在合併提交時,GitHub 問題就會關閉。