跳到主要內容

R 4.0 遷移回顧

·6 分鐘閱讀
Christopher J. 'CJ' Wright
conda-forge/core 成員
Matthew R. Becker
conda-forge/core 成員

雖然 R 4.0 的遷移在功能上已完成相當長一段時間,但最近 r-java 及其相依套件的遷移,正好提供了一個很好的機會來撰寫關於 conda-forge 中大規模遷移的技術問題,以及我們如何解決這些問題的回顧。

R 4.0 的遷移重建了 conda-forge 中每個以 r-base 作為需求的套件,包括超過 2200 個 feedstock。 conda-forge 中如此大規模的遷移面臨幾個障礙。首先,由於每個 feedstock 都是一個獨立的 GitHub 儲存庫,因此需要合併超過 2200 個提取請求 (PR)。其次,conda-forgeanaconda.org 上的套件位於 CDN(內容傳遞網路)之後。這項服務降低了 Anaconda Inc. 的網路託管成本,但也造成了大約 30 分鐘的延遲,從套件上傳到 anaconda.org 到它透過命令列使用 conda 顯示為可用之間。因此,即使套件的相依性已經建置完成,我們也必須等到它們出現在 CDN 上,才能成功發出下一個 PR 並使其正確建置。最後,現有的機器人和 conda 基礎設施限制了遷移的吞吐量,部分原因是 conda 求解器的速度。

鑑於 R 4.0 遷移的規模,我們藉此機會嘗試了一系列新技術來加速大規模遷移。主要的增強功能包括使用 GitHub Actions 自動合併 PR、使用 mamba 快速檢查套件環境的可解性,以及為 autotick 機器人啟用長時間運行的遷移任務。總而言之,R 4.0 的大部分 feedstock 在不到一週的時間內被重建,許多 PR 從發出到合併的時間在 30 分鐘或更短的時間內完成。這些對 autotick 機器人和 conda-forge 基礎設施的增強功能,可用於增強未來的遷移(例如,Python 3.9)並減少 feedstock 的維護負擔。

自動合併 conda-forge PR

conda-forge 上的典型遷移中,我們會向 feedstock 發出 PR,然後要求 feedstock 維護者確保其通過並合併它。在 R 4.0 遷移的情況下,conda-forge 上 R 套件的維護者在絕大多數 feedstock 上使用維護團隊(即 @conda-forge/r)。這個團隊很小,因此手動合併 2000 多個 PR 是一項龐大的工程。因此,在他們的許可下,我們將 conda-forge 自動合併功能添加到他們維護的所有 R feedstock 中。自動合併機器人依賴 GitHub Actions,能夠自動合併來自 autotick 機器人的任何 PR,這些 PR 通過了配方 linter、持續整合服務,並且在 PR 標題中具有特殊的 [bot automerge] slug。此功能消除了等待維護者合併 PR 的瓶頸,並減輕了 R 維護團隊的維護負擔。

使用 mamba 檢查可解性

雖然能夠自動合併 PR 消除了執行 R 4.0 遷移的大部分工作,但它依賴於 PR 在第一次發出時正確建置。由於 CDN 延遲和套件相依性的建置時間,套件的相依性可能在它們的所有遷移 PR 合併後不會立即可用。如果機器人在相依套件可用之前發出套件遷移 PR,則 PR 將因環境無法解決而失敗,並且必須手動重新啟動。這種失敗將抵消首先使用自動合併的任何好處。

為了控制這種邊緣情況,我們採用了 mamba 套件,在發出 PR 之前檢查 PR 環境的可解性。 mambaconda 的快速替代方案,它可以更快地產生環境解決方案,速度快幾個數量級。由於我們必須多次執行 PR 環境檢查,因此極快的求解器對於使程式碼效率足以作為 autotick 機器人的一部分運行至關重要。我們最終使用 mamba 來嘗試安裝要遷移的 feedstock 產生的每個變體的相依性。透過此檢查,autotick 機器人能夠發出第一次嘗試就通過的遷移 PR,因此可以自動合併,許多在 30 分鐘或更短的時間內完成。

提高 Autotick 機器人的效率

最後,我們對 autotick 機器人基礎設施進行了幾項升級,以提高機器人的正常運行時間和效率。首先,我們從每小時的 cron job 遷移到一組鏈式 CI job。此變更消除了機器人運行之間的停機時間。其次,我們開始將 autotick 機器人從一個龐大的程式碼塊重構為一組分散的微服務,這些微服務並行執行各種獨立任務。這些獨立任務用於檢查先前發出的 PR 的狀態等,它們是分開運行的,使機器人可以花更多時間發出 PR。最後,我們最佳化了 PR 的內部優先順序,以確保機器人將更多時間花在較大的遷移上,因為那裡有更多工作要做。對 autotick 機器人基礎設施的更多工作,包括 Vinicius Cerutti 作為 Google Summer of Code 計畫一部分完成的工作,將進一步簡化機器人的操作。

儘管機器人基礎設施最初有一些小問題,但對於如此規模的努力來說,遷移運行得相當順利。絕大多數遷移 PR 在我們開始後的一週內完成,這在 conda-forge 上如此規模的遷移中尚屬首次。最近解決了最大的問題,即修復了 openjdk 配方並從 r-java 中移除了 aarch64ppc64le 建置,使 R 生態系統的最後一大塊得以更新。

展望未來,我們為 R 4.0 遷移所做的改進似乎廣泛適用於其他遷移任務,包括每年的 python 次要版本升級。這些大規模遷移尤其適用,因為它們通常只涉及對 feedstock 本身的少量變更,並且通常在 CI 上失敗,因為會產生損壞的套件。更快的遷移將有助於為下游使用者提供最新的功能,並將過渡時間保持在最短,從而有助於培養生態系統的更高穩定性以及使用者期望從 conda-forge 獲得的無縫體驗。