今回は以下で作成したCircleCI上で実行するRuby on Rails × LighthouseをGithub Actionsに移行したので、その辺のハマったところとかのポイントをメモしておきます📝
最終的な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の公式ドキュメントがあるので、一読しておくと参考になるかと思います🐙
以下には実際に移行していて感じたポイントを上記のドキュメントとかぶるところもありますが、
デフォルトでinstallされているもの
Github Actionsの実行環境にはデフォルトでRuby
やChromeDriver
等の言語やツールがinstallされています、詳しくは以下のドキュメントで自身が利用する環境をご確認してみると良さそうです✨
使用する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-ruby
、actions/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するような利用を想定しているようです。
おわりに
今まで割とCircleCIを使うことが多かったのですが、Github Actionでも出来ることも多いですね✨
いい感じに分散させてCIの効率を上げていけると待ち時間も削減できてよさそうです👷♀️👷♂️