Nic Lin's Blog

喜歡在地上滾的工程師

Rails 專案搭配 Github Actions 進行 RSpec 自動化測試

以前 CI pipeline 百家爭鳴,多半的專案都還會接第三方的 CI 來做自動化測試,例如常聽到的 CirceCI / Travis 等等

現在 Github 自己也推出了 CI 工具,可以直接在專案上整合使用。

之前我在嘗試 Rails 專案跑 Github Actions 的時候,因為沒有像其他第三方的 CI 工具有很多範例,所以初期有點碰壁。

不過後來整理出一個簡單的流程來跑 Rails 專案的自動化測試,這裡會簡單說明專案的設定步驟。

本文可以搭配專案範例 (rails-github-actions-example)一起觀看。

CI pieplne

一般來說 Rails 專案的 CI 步驟大致上如下

  1. 設定 Ruby / Node 或是一些測試要用的基本建設
  2. 設定 Database (PostgreSQL / MySQL)
  3. 安裝專案所需依賴 (bundler, yarn, npm, etc…)(這邊如果可以 cache 是最好不過,節省每次安裝時間)
  4. 建立測試用的 database (migrate / 準備假資料)
  5. 跑測試

我們會從 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)

參考資源

comments powered by Disqus