Buildkite 成立於 2013 年 3 月 17 日,是一家來自澳洲的精悍小團隊。2020 年春,多元化團隊目前有 20 多名員工。公司提供「持續集成」服務(Continuous Integration、CI)。Buildkite 提供用 Go 寫成的開源 Agent 客戶端和精美的後台介面(使用 Ruby on Rails & React 開發),比如 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.yml
或 pipeline.json
,告訴來找工作的 Agent 有事情做了哦。Agent 回去你的主機,照著 pipeline.yml
的設定來新建一個 Build。
Pipeline 可以想成是 docker container、一台雲主機 EC2。Pipeline 可以拆分成多個步驟(比如測試),每個步驟可以設定要用幾名 Agent 來完成。完成步驟的 Agent 便會各自向 buildkite.com 回報。
Pipeline 的 Steps 可以像是這樣子:
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 去做 Testing
4、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:
上面是 rails/rails 專案的 Build #67485。下面有許多個步驟。
railties (2.6) (12/12)
代表用了 12 台 Agent 來跑測試:
actiontext (master)
的步驟 FAIL 了:
點進去再點 Timeline
可以看到這個步驟是由 Agent buildkite-i-0c40e9dee2705da21-1
執行的,點這個連結,便可以直接進去機器看究竟是什麼錯誤。
相信現在對 Buildkite 大致瞭解了。下面我們來看看 Buildkite 有什麼功能。
從 Slack、Amazon EventBridge 到 macOS app CCMenu 皆有支援,其他像是 Hipchat、Flowdock、Campfire 有吃 webhooks 的團隊溝通工具,也都可以設定一下就收到通知了。
主機上安裝多個 Agent 來跑測試(每個帳戶目前最多可有 10000 台 Agent,壹萬台 EC2!!)。詳見 Parallel Builds。
We added EC2 spot instances to our CI fleet, now peaking at nearly 2300 concurrent build agents with @buildkite pic.twitter.com/DMGuj0ht1Z
— John Arthorne (@jarthorne) August 10, 2016
官方推薦使用 AWS EC2 來自動擴展:Elastic CI Stack for AWS。成功案例:HotelTonight。
Very excited to share that @HotelTonight’s entire platform has migrated to @buildkite. Thanks to their Elastic stack we’ve shaved 10+ minutes off our CI runs and doubled the amount of builds we can run.
— Callum Jones (@callumj) February 14, 2019
buildkite-agent-metrics 可推送執行數據至 StatsD 或是 CloudWatch。
不想手工設定各種 Pipeline 可以撰寫程式來自動產生,像 rails/rails 的 pipeline.yml
跟源代碼分離,用這裡 rails/buildkite-config 的 pipeline_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 控制亮滅。
開源專案、教育組織免費。非營利機構基本上免費,提供大量折扣。有興趣可以寫信給我。商業公司按人頭收費($15),也提供企業方案(2999 美元)。詳見 Buildkite 的收費模式。
新功能一覽:Buildkite Changelog
公司工程部落格:Building Buildkite
客戶案例:Shopify、Intercom
創始人 Keith Pitt
How Flexport halved testing costs with an auto-scaling CI/CD cluster
We’ve been adding more and more CI steps, ever since we’ve moved from Jenkins to @buildkite - this change was really worth it. pic.twitter.com/tSYMsIG3bA
— Peter Steinberger (@steipete) February 17, 2020
Last week, Intercom shipped code to production 1073 times.
— Brian Scanlan (@brian_scanlan) April 3, 2018
77 minute rspec test run down to 7 minutes. Yup @buildkite is awesome! pic.twitter.com/OWitrpXvBL
— Tys von Gaza (@tvongaza) May 5, 2016
This is how I manage and deploy @calibreapp worldwide. 🗺️
— Ben Schwarz (@benschwarz) March 30, 2017
Terraform check/plan. Approve—deploy 🎩
All on @buildkite, the world’s best CI 😤 pic.twitter.com/ua7587tZp7