GitHub Actionsを使って、定期的にBundle updateのプルリクエストを自動で作成する。
Yarn upgradeの方法も合わせて紹介している。

Bundle updateのワークフロー

.github/workflows ディレクトリに、bundle-update.yml を追加する。

name: Bundle update

on:
  schedule:
    - cron: '0 0 1 * *'

jobs:
  createPullRequest:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Get ruby version
        id: ruby
        run: echo "::set-output name=version::$(cat .ruby-version)"

      - name: Setup Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: ${{ steps.ruby.outputs.version }}

      - name: Update dependencies
        run: bundle update

      - name: Get current date
        id: date
        run: echo "::set-output name=current::$(date +'%Y-%m-%d')"

      - name: Create pull request
        uses: peter-evans/create-pull-request@v3
        with:
          commit-message: Update dependencies
          title: bundle update at ${{ steps.date.outputs.current }}
          branch: bundle-update-${{ steps.date.outputs.current }}
          labels: |
            dependencies
            ruby

……以上。便利!!

ワークフローファイルの説明

ワークフローの設定を、ひとつずつ説明していく。

on:  
  schedule:
    - cron: '0 0 1 * *'

ワークフローを実行するイベント。
クーロン構文で、毎月1日に実行されるようにスケジュールを設定している。

スケジュールしたイベント

https://docs.github.com/ja/actions/using-workflows/events-that-trigger-workflows#schedule

動作確認するときは、on: push にすればPushしたタイミングでBundle updateのプルリクが作成される。
開発環境でアップデートされるGemがあるかは確認しておこう。

- name: Get ruby version
  id: ruby
  run: echo "::set-output name=version::$(cat .ruby-version)"

catコマンドを利用して .ruby-version ファイルの内容を出力パラメータにセットしている。
id: ruby のステップで name=version としているので、steps.ruby.outputs.version で参照できる。

出力パラメータの設定

https://docs.github.com/ja/actions/using-workflows/workflow-commands-for-github-actions#setting-an-output-parameter
- name: Setup Ruby
  uses: ruby/setup-ruby@v1
  with:
    ruby-version: ${{ steps.ruby.outputs.version }}

ruby/setup-ruby@v1 は、ruby-version で指定したRubyのバージョンが使える環境を構築してくれる。
Rubyのバージョンが上がったときに、ruby-version を更新しないで済むように動的に設定している。

setup-ruby

https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
- name: Update dependencies
  run: bundle update

Bundle updateを実行している。

- name: Get current date
  id: date
  run: echo "::set-output name=current::$(date +'%Y-%m-%d')"

プルリクのタイトルとブランチ名に使用するので、現在の日付を出力パラメーターにセットしている。
id: date のステップで name=current としているので、steps.date.outputs.current で参照できる。
セットしている日付のフォーマットは、ターミナルで printf $(date +'%Y-%m-%d') とすれば確認できる。

- name: Create pull request
  uses: peter-evans/create-pull-request@v3
  with:
    commit-message: Update dependencies
    title: bundle update at ${{ steps.date.outputs.current }}
    branch: bundle-update-${{ steps.date.outputs.current }}
    labels: |
      dependencies
      ruby

peter-evans/create-pull-request@v3 は、GitHub APIを使ってプルリクを作成してくれる。
bundle-update-yyyy-mm-ddというブランチ名でプルリクエストが作成される。
プルリクにラベルが不要であれば、labels は削除して良い。

create-pull-request

https://github.com/marketplace/actions/create-pull-request

Yarn upgradeのワークフロー

.github/workflows ディレクトリに、yarn-upgrade.yml を追加する。

name: Yarn upgrade

on:
  schedule:
    - cron: '0 0 1 * *'

jobs:
  createPullRequest:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      
      - name: Upgrade dependencies
        run: yarn upgrade --latest

      - name: Get current date
        id: date
        run: echo "::set-output name=current::$(date +'%Y-%m-%d')"

      - name: Create pull request
        uses: peter-evans/create-pull-request@v3
        with:
          commit-message: Update dependencies
          title: yarn upgrade at ${{ steps.date.outputs.current }}
          branch: yarn-upgrade-${{ steps.date.outputs.current }}
          labels: |
            dependencies
            javascript

ほとんどBundle updateと同じ内容となっている。
yarn-upgrade-yyyy-mm-dd というブランチ名でプルリクエストが作成される。

おわりに

今回はGitHub Actionsだけで完結する一番簡単な方法を紹介したが、https://github.com/masutaka/circleci-bundle-update-pr を使えば、プルリクのコメントにアップデートされたGemのチェックリストが表示されるのでより便利かも。

Dependabotを設定すれば、Gemごとにプルリクを作ってくれますが、さすがに数が多すぎるので、月一回まとめて確認するくらいが丁度いいかと。

これで継続的にGemfileをフレッシュに保てるはず…!