Madogiwa Blog

主に技術系の学習メモに使っていきます。

Ruby on Rails × LighthouseをCircleCIからGithub Actionに移行するときのMEMO

今回は以下で作成したCircleCI上で実行するRuby on Rails × LighthouseをGithub Actionsに移行したので、その辺のハマったところとかのポイントをメモしておきます📝

madogiwa0124.hatenablog.com

最終的なGithub Actionsの定義はこちら

name: lighthouse

on: [pull_request]

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      RAILS_ENV: test
      DATABASE_URL: postgres://postgres:password@127.0.0.1:5432
    services:
      db:
        image: postgres:10.13-alpine
        ports:
          - 5432:5432
        env:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: password
    steps:
    - uses: actions/checkout@v2
    - uses: actions/setup-ruby@v1
      with:
        ruby-version: '2.7.2'
    - uses: actions/setup-node@v1
      with:
        node-version: '12'
    - name: cache ruby deps
      uses: actions/cache@v1
      with:
        path: vendor/bundle
        key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-gem-
    - name: cache node deps
      uses: actions/cache@v1
      with:
        path: node_modules
        key: ${{ runner.os }}-node_modules-${{ hashFiles('**/yarn.lock') }}
        restore-keys: |
          ${{ runner.os }}-node_modules-
    - name: install bundler
      run: gem install bundler -v 2.1.4
    - name: install ruby deps
      run: bundle install --jobs 4 --retry 3 --path vendor/bundle
    - name: install node deps
      run: yarn install
    - name: db migration
      run: |
        bundle exec rake db:create
        bundle exec rake db:schema:load
    - name: build webpack
      run: NODE_ENV=production bundle exec rails webpacker:compile
    - name: run lighthouse
      run: yarn run lighthouse --chrome-flags="--headless"
    - uses: actions/upload-artifact@v2
      with:
        name: lighthouseci_result
        path: .lighthouseci_result

移行する際のポイント

移行する際のポイントはGithubの公式ドキュメントがあるので、一読しておくと参考になるかと思います🐙

docs.github.com

以下には実際に移行していて感じたポイントを上記のドキュメントとかぶるところもありますが、

デフォルトでinstallされているもの

Github Actionsの実行環境にはデフォルトでRubyChromeDriver等の言語やツールがinstallされています、詳しくは以下のドキュメントで自身が利用する環境をご確認してみると良さそうです✨

docs.github.com

使用するImageをcircleci/fooから移行

Github Actionに移行する際にCircleCIで利用していたcircleci/fooといったimageをそのまま使えると楽だなと思ったのですが、公式では非推奨なようです。(実際に今回移行した際にも権限周りでうまくいきませんでした😢)

GitHub Actionsへの移行に際しては、CircleCIの構築済みイメージから離脱することをおすすめします。 多くの場合、必要な追加の依存関係のインストールにアクションを使うことができます。 https://docs.github.com/ja/free-pro-team@latest/actions/learn-github-actions/migrating-from-circleci-to-github-actions#docker%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AE%E5%88%A9%E7%94%A8

今回はもともとcircleci/ruby:2.7.2-node-browsersを使っていたのですが、rubyとnodeの環境をactions/setup-rubyactions/setup-nodeで実行環境であるubuntu-latest上に構築して、circleci/postgres:10.13ではなく、postgres:10.13-alpineを使用するように修正しました。

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      RAILS_ENV: test
      DATABASE_URL: postgres://postgres:password@127.0.0.1:5432
    services:
      db:
        image: postgres:10.13-alpine
        ports:
          - 5432:5432
        env:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: password
    steps:
    - uses: actions/checkout@v2
    - uses: actions/setup-ruby@v1
      with:
        ruby-version: '2.7.2'
    - uses: actions/setup-node@v1
      with:
        node-version: '12'

cacheの利用

もともとorbsの機能を利用してライブラリのcacheを取得していたのですが、

orbs:
  ruby: circleci/ruby@1.1.1
  node: circleci/node@4.0.0

Github Actionsには、それに相当するようなactionsが見つけレレらなかったので以下のような形でchaceを取得するactionとinstallするstepを用意しました。

    - name: cache ruby deps
      uses: actions/cache@v1
      with:
        path: vendor/bundle
        key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-gem-
    - name: cache node deps
      uses: actions/cache@v1
      with:
        path: node_modules
        key: ${{ runner.os }}-node_modules-${{ hashFiles('**/yarn.lock') }}
        restore-keys: |
          ${{ runner.os }}-node_modules-
    - name: install bundler
      run: gem install bundler -v 2.1.4
    - name: install ruby deps
      run: bundle install --jobs 4 --retry 3 --path vendor/bundle
    - name: install node deps
      run: yarn install

(こういったコミュニティ系の機能は、まだCircleCIのほうが豊富で便利な気もしました。)

artifactのアップロードまわり

CircleCIだとstore_artifactsアーティファクトとしてファイルをアップロードしてブラウザ上で参照することができます。

  store_lighthorse_atifacts:
    steps:
      - store_artifacts:
          path: .lighthouseci_result

Github Actionにも同様な機能が提供されていて以下のような形で利用できます。

    - uses: actions/upload-artifact@v2
      with:
        name: lighthouseci_result
        path: .lighthouseci_result

しかしCircleCIのようにブラウザ上で閲覧することはできず、zipファイルとしてダウンロードする必要があるようです・・・!

上記のようなことのやり方としては、htmlの場合はgithub pagesにアップロードしたり、リポジトリとにpushするような利用を想定しているようです。

github.community

おわりに

今まで割とCircleCIを使うことが多かったのですが、Github Actionでも出来ることも多いですね✨

いい感じに分散させてCIの効率を上げていけると待ち時間も削減できてよさそうです👷‍♀️👷‍♂️

参考

qiita.com