持續集成

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

    測試所執行的命令。

延伸閱讀

持续集成是什么?

results matching ""

    No results matching ""