Buildkite

Juanito FatasThinking about what to do.

buildkite.com

buildkite.com

Buildkite 成立於 2013 年 3 月 17 日,是一家來自澳洲的精悍小團隊。2020 年春,多元化團隊目前有 20 多名員工。公司提供「持續集成」服務(Continuous Integration、CI)。Buildkite 提供用 Go 寫成的開源 Agent 客戶端和精美的後台介面(使用 Ruby on Rails & React 開發),比如 rails/rails 的後台:

https://buildkite.com/rails/rails

https://buildkite.com/rails/rails

只要在自己的機器上裝 Buildkite 提供的 Agent 客戶端(筆電也可以),就可以使用 Buildkite 了。所以 Buildkite 幾乎可以跟任何的雲服務集成。知名客戶有 Airbnb、Basecamp、DigitalOcean、Intercom、PagerDuty、Shopify、Webflow 等。2019 年 4 月,YC 前十的企業,有 4 家採用 Buildkite1

用 Buildkite 最大的好處是,可以自己加機器,機器在你手上有最高的客製化。不需要自己打造管理測試的介面,Buildkite.com 提供了精美良好的介面。

在要跑 CI 的主機上2安裝 Buildkite Agent 後,Agent 會常常去問 buildkite.com 有沒有事可以做。當公司的開發者,推送程式碼到 SCM3 上時,SCM 收到 Commit 後,會發出 Webhook 給 Buildkite.com。

Buildkite.com 收到 Webhook 通知後,會根據專案的設定檔 pipeline.ymlpipeline.json,告訴來找工作的 Agent 有事情做了哦。Agent 回去你的主機,照著 pipeline.yml 的設定來新建一個 Build

Pipeline 可以想成是 docker container、一台雲主機 EC2。Pipeline 可以拆分成多個步驟(比如測試),每個步驟可以設定要用幾名 Agent 來完成。完成步驟的 Agent 便會各自向 buildkite.com 回報。

PipelineSteps 可以像是這樣子:

steps:
  - name: "Style"
    command: "bin/ci/style"
    parallelism: 5

  - name: "Testing"
    command: "bin/ci/rspec"
    parallelism: 10

  - name: "Performance"
    command: "bin/ci/performance"
    parallelism: 5

上面我們這個 Pipeline,請 5 位 Agent 去做 Style、10 位 Agent 去做 Testing4、5 位 Agent 去做 Performance。更多各種各式各樣的 Pipeline 範例參考:Example Buildkite Pipelines

因為主機是我們自己擁有的,所以要開幾台就開幾台,也沒有任何的安全疑慮。當然唯一的安全疑慮是 buildkite-agent,但是 buildkite-agent 是 Buildkite 提供的服務,有安全條款保證。

專案可以根據單一用途拆分成多個 Pipeline。跑測試用的 Pipeline,部署用的 Pipeline。每個 Pipeline 可以觸發新的 build 形成 workflow。比如測試 Pipeline 的 Build 執行完後,在部署用的 Pipeline 觸發一個新的 Build 實現部署。

讓我們來看看 rails/rails 的一個 Build。

這個 Build 由許多個 Steps 來測試不同的模組,同時又測試多版不同的 Ruby:

https://buildkite.com/rails/rails/builds/67485

https://buildkite.com/rails/rails/builds/67485

上面是 rails/rails 專案的 Build #67485。下面有許多個步驟。

railties (2.6) (12/12) 代表用了 12 台 Agent 來跑測試:

actiontext (master) 的步驟 FAIL 了:

https://buildkite.com/rails/rails/builds/67485#job-bbdda50f-ef5e-45ce-9262-5df302fee555

https://buildkite.com/rails/rails/builds/67485#job-bbdda50f-ef5e-45ce-9262-5df302fee555

點進去再點 Timeline 可以看到這個步驟是由 Agent buildkite-i-0c40e9dee2705da21-1 執行的,點這個連結,便可以直接進去機器看究竟是什麼錯誤。

相信現在對 Buildkite 大致瞭解了。下面我們來看看 Buildkite 有什麼功能。

SlackAmazon EventBridge 到 macOS app CCMenu 皆有支援,其他像是 Hipchat、Flowdock、Campfire 有吃 webhooks 的團隊溝通工具,也都可以設定一下就收到通知了。

主機上安裝多個 Agent 來跑測試(每個帳戶目前最多可有 10000 台 Agent,壹萬台 EC2!!)。詳見 Parallel Builds

官方推薦使用 AWS EC2 來自動擴展:Elastic CI Stack for AWS。成功案例:HotelTonight。

buildkite-agent-metrics 可推送執行數據至 StatsD 或是 CloudWatch。

不想手工設定各種 Pipeline 可以撰寫程式來自動產生,像 rails/rails 的 pipeline.yml 跟源代碼分離,用這裡 rails/buildkite-configpipeline_generate 產生的。詳見 Dynamic Pipeline

跟資安審計有關的 Pipeline,可以透過建立相應的 Teams 來管理。

可以給資料庫定期做備份、打包軟體發佈,詳見 Scheduled Builds

Flaky 測試好幫手:

retry:
  automatic: true

比如瀏覽器測試,可以顯示測試執行失敗的圖片,詳見 Links & Images in Log Output

腳本部署(Capistrano、任何 Bash 腳本)
部署到 Heroku
部署用 Kubernates

有需要審批後再部署也OK。

用公司帳號登入 Buildkite。支援 Okta、G Suite、ADFS、Custom SAML、OneLogin 等,詳見 SSO

比如可以在公司放一個 LIFX 燈泡,用 Webhooks API 控制亮滅。

提供 RESTGraphQL API 供客製化需求。

開源專案、教育組織免費。非營利機構基本上免費,提供大量折扣。有興趣可以寫信給我。商業公司按人頭收費($15),也提供企業方案(2999 美元)。詳見 Buildkite 的收費模式

新功能一覽:Buildkite Changelog
公司工程部落格:Building Buildkite
客戶案例:ShopifyIntercom
創始人 Keith Pitt

https://buildkite.com/screencasts

https://buildkite.com/screencasts

How Flexport halved testing costs with an auto-scaling CI/CD cluster