持續整合#

Arrow 的持續整合相當複雜,因為它需要在套件管理器、編譯器、多個軟體函式庫版本、作業系統和其他潛在變化的來源的不同組合中執行。在本文中,我們將概述其主要組件以及相關檔案和目錄。

Arrow CI 的一些核心檔案包括

  • docker-compose.yml - 在此處,我們定義了 docker 服務,可以使用環境變數或這些變數的預設值進行配置。

  • .env - 在此處,我們定義了預設值,以配置 docker-compose.yml 中的服務

  • appveyor.yml - 在此處,我們定義了在 Appveyor 上運行的工作流程

我們使用 Docker 以獲得可攜式和可重現的 Linux 建置,以及在 Windows 容器中運行 Windows 建置。我們使用 ArcheryCrossbow 來協助協調各種 CI 任務。

需要注意的一點是,docker-compose.yml 中定義的某些服務是相互依賴的。當在本機運行服務時,您必須先手動建置其依賴項,或者透過使用 archery docker run ... 來建置它,這會自動尋找並建置依賴項。

Arrow 專案中有許多與 CI 相關的重要目錄

  • .github/workflows - 透過 GitHub Actions 運行的工作流程,並由提交或合併 Pull Request 等事件觸發

  • dev/tasks - 包含透過 archery crossbow submit ... 觸發/提交的擴展作業,通常是每晚建置或與發布流程相關

  • ci/ - 包含腳本、dockerfiles 和任何補充檔案,例如修補程式檔案、conda 環境檔案、vcpkg triplet 檔案。

與其從檔案和資料夾的角度思考 Arrow CI,不如將其概念性地劃分為 2 個主要類別可能更簡單

  • 動作觸發的建置:根據 GitHub 上的特定動作(開啟 Pull Request、合併 Pull Request 等)觸發的 CI 作業

  • 擴展建置:手動觸發,其中許多是每晚運行的

動作觸發的建置#

.github/workflows 中的 .yml 檔案是在 GitHub 上響應特定動作而運行的工作流程。此目錄中的大多數工作流程都是 Arrow 實作特定的,並且在進行影響與該語言實作相關的程式碼變更時運行,但其他值得注意的工作流程包括

  • archery.yml - 如果對 Archery 工具或其運行的任務進行了變更,此工作流程將運行必要的驗證檢查

  • comment_bot.yml - 透過監聽 github Pull Request 評論中的以下字串來觸發某些動作

    • @github-actions crossbow submit ... - 運行指定的 Crossbow 命令

    • @github-actions autotune - 運行多個樣式器/格式化器,建置一些文件,並提交結果

    • @github-actions rebase - 將 PR 變基到 main 分支上

  • dev.yml - 在 PR 上有任何活動或 PR 被合併時運行;它運行 linter 並測試 PR 是否可以合併

  • dev_pr.yml - 在 PR 開啟或更新時運行;檢查 PR 標題的格式,如果需要,將受讓人新增到適當的 GitHub Issue(或新增評論請求使用者在標題中包含 Issue ID),並新增任何相關的 GitHub 標籤

還有兩個其他檔案定義了動作觸發的建置

  • appveyor.yml - 在與 Python 或 C++ 相關的提交上運行

擴展建置#

Crossbow 是 Archery 的子組件,可用於手動觸發建置。可以在 dev/tasks 目錄中找到可在 Crossbow 上運行的任務。此目錄包含

  • 檔案 dev/tasks/tasks.yml,其中包含可透過 Crossbow 運行的各種任務的配置

  • 子目錄,其中包含不同的任務範本(使用 jinja2 語法 指定),大致按語言或套件管理系統劃分。

這些任務大多數作為每晚建置的一部分運行,儘管也可以透過在 PR 中新增以 @github-actions crossbow submit 開頭的評論,後跟要運行的任務名稱來手動觸發。

為了方便起見,dev/tasks/tasks.yml 中的任務以群組形式定義,這使得一次向 Crossbow 提交多個任務變得更簡單。此處的任務定義包含有關要運行的 docker-compose.yml 中定義的哪個服務、要在其上運行任務的 CI 服務以及要用作該任務基礎的範本檔案的資訊。