持續集成
Martin Flower 有一篇文章詳細定義與介紹 Continuous Integration(持續集成),這裡介紹一些 CI 服務商,以及 Travis CI 的簡易使用教學。
使用方式
一個常見的場景:
專案有一組測試套裝,可能有 5000 支測試。 開發者開發時,只跑有修改到的測試(可能 50 支)。 測試通過,推上 CI Server,跑完整的測試。 測試通過時,可以在 GitHub 上看到,便可以確定新加入的程式,沒有將別的東西弄壞。 測試失敗時,可以在 GitHub 上看到,便可以知道新加入的程式,把別的東西弄壞了。
持續集成服務列表
下面是在 GitHub 官方推薦整合工具上所列出的 9 個服務,按照英文字母排序:
許多服務都針對開源專案提供免費方案,開源專案最廣為使用的是 Travis CI。 自己架設 CI 則可以考慮 Jenkins 解決方案。
如何使用 CI
首先去選擇的 CI 服務註冊一個帳號,然後找到要採用 CI 的 GitHub 專案,按照指示啟用該專案即可。
CI 跑測試的流程
Web 專案的測試,通常跑在 Linux 機器上。CI 通常會把你的專案,使用 Git 抓下來,安裝一些必要的套件(可指定),設定 Ruby 環境,選擇 Ruby 版本,安裝需要使用的 Gem(bundler),進行您指定的腳本($ bundle exec rake test
)。
範例:https://travis-ci.org/rails/rails/jobs/146281990。
如何使用 CI 服務
各大 CI 通常透過一個設定檔案(Travis:.travis.yml
、Circle CI:.circle.yml
),或是在 Web UI 上面做設定(譬如 Codeship)。通常需要設定的東西有:
- 使用的 Ruby 版本
- 執行腳本前的前置作業
- 要執行的腳本(如何執行專案的測試)
- 執行腳本後的後置作業
每次在開發新功能時,在 GitHub 上推送程式碼或新建 Pull Request 時,CI 便會根據設定執行測試套裝。
Travis CI
travis-ci.org 是來自德國柏林的持續集成服務供應商,當前支援 Clojure、NodeJS、Ruby、Python、Perl 等 11 種程式語言。方便設定,簡單易用,和各大服務整合良好(Slack、Hipchat、GitHub)。
實際例子
請參考這個專案的 README:https://github.com/JuanitoFatas/setup-travis-ci-example。
.travis.yml
範例解說
sudo: false
language: ruby
cache: bundler
rvm:
- 2.3.1
- 2.2.5
- 2.1
- 2.0
- ruby-head
matrix:
fast_finish: true
allow_failures:
- rvm: ruby-head
script: bundle exec rspec
sudo: false
2015 之後在 Travis 上啟用的專案,可以享受 container-based 的測試環境(更大的 RAM、專屬的 CPU、更快的網路、更快的啟動時間),採用 docker,較為快速,缺點是無法使用
sudo
指令,若專案需要使用 sudo 在跑測試之前安裝套件,便不可以使用此設定。詳見 Travis 文件。language: ruby
表示這個專案是一個 Ruby 專案,Ruby 專案則會採用此文所述的預設設定。
cache: bundler
實驗性的功能,能讓 Build 的子任務之間,已經安裝的 gem 可以重複利用,加快
bundle install
的速度,詳見 Travis CI 官方文件:Caching Dependencies and Directories。rvm
指定要執行測試的 Ruby 版本。這裡指定了五個:
- 2.3.1 - 2.2.5 - 2.1 - 2.0 - ruby-head
注意這個順序,這個順序會影響執行的順序,先出現的先執行。通常 Ruby 專案(通常是 RubyGem)要測試多個版本,可以將重要的版本放在前面(上面),可以允許失敗的 Ruby 版本放在後面。指定了五個 Ruby 版本則會將我們的測試在五個版本的 Ruby 上面跑。
matrix
fast_finish: true allow_failures: - rvm: ruby-head
allow_failures
可以指定什麼情況可以允許測試失敗。fast_finish
在所有測試通過(去除掉 allow_failures 所指定的情況)時,即將所有測試視為通過。script
測試所執行的命令。