以前 CI pipeline 百家爭鳴,多半的專案都還會接第三方的 CI 來做自動化測試,例如常聽到的 CirceCI / Travis 等等
現在 Github 自己也推出了 CI 工具,可以直接在專案上整合使用。
之前我在嘗試 Rails 專案跑 Github Actions 的時候,因為沒有像其他第三方的 CI 工具有很多範例,所以初期有點碰壁。
不過後來整理出一個簡單的流程來跑 Rails 專案的自動化測試,這裡會簡單說明專案的設定步驟。
本文可以搭配專案範例 (rails-github-actions-example)一起觀看。
CI pieplne
一般來說 Rails 專案的 CI 步驟大致上如下
- 設定 Ruby / Node 或是一些測試要用的基本建設
- 設定 Database (PostgreSQL / MySQL)
- 安裝專案所需依賴 (bundler, yarn, npm, etc…)(這邊如果可以 cache 是最好不過,節省每次安裝時間)
- 建立測試用的 database (migrate / 準備假資料)
- 跑測試
我們會從 0 開始搭建,過程不會超過 5 分鐘
建立新專案
rails new rails-github-actions-example --skip-turbolinks --skip-spring --database=postgresql -T
先加入 rspec 的 gem 到 Gemfile
gem "rspec-rails", "~> 3.8"
bundle install 後安裝 rspec
rails generate rspec:install
這時候直接用 scaffold 隨意建立一個 model
rails generate scaffold User name:string email:string
然後你就會發現 rspec 的基本測試也幫你寫完了
再來 rake db:migrate
之後,我們跑一下 rspec
沒意外的話應該會看到測試案例跑過了(如果有少數幾個案例失敗的話,可以先註解掉)
建立 CI workflow
建立資料夾 .github/workflows
建立檔案 .github/workflows/rails.yml
name: Rails
on: push
jobs:
verify:
name: Build
runs-on: ubuntu-latest
services:
postgres:
image: postgres:11
env:
# postgreSQL 帳號密碼設定
POSTGRES_USER: rails_github_actions
POSTGRES_DB: rails_github_actions_test
POSTGRES_PASSWORD: ""
ports: ["5432:5432"]
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
# if you need redis
# redis:
# image: redis
# ports:
# - 6379:6379
# options: --entrypoint redis-server
steps:
- uses: actions/checkout@v1
- name: Set up Ruby
uses: actions/setup-ruby@v1
with:
ruby-version: 2.6.3
- name: Set up Node
uses: actions/setup-node@v1
with:
node-version: 10.13.0
- name: Install dependencies
run: |
sudo apt-get -yqq install libpq-dev build-essential libcurl4-openssl-dev
gem install bundler
bundle install --jobs 4 --retry 3
yarn install
- name: Setup test database
env:
RAILS_ENV: test
PGHOST: localhost
PGUSER: rails_github_actions
run: |
cp config/database.ci.yml config/database.yml
rake db:create db:migrate
- name: Run tests
env:
PGHOST: localhost
PGUSER: rails_github_actions
# 獲得分發的端口
PGPORT: ${{ job.services.postgres.ports[5432] }}
RAILS_ENV: test
run: rspec
在 Rails 目錄 config
下建立 CI 專用的 database.ci.yml
test:
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
database: rails_github_actions_test
username: <%= ENV['PGUSER'] %>
好了,整包 push 上去 github 應該可以看到 github actions 開始跑了,沒意外的話應該是成功的。
小結
如果你還在使用其他第三方的 CI,目前就情況來看,可以先觀望不必急著換。
原因是因為目前的速度並不快。
CI piepline 在速度提升上必須有 cache 的幫助才能讓專案的 dependency 不用每次重新加載。
但就目前情況來看,這部分還不是很令人滿意,如果直接遷移過來,想必會有一個過渡期(而且花錢還沒用XD)