おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

定期的にyarn updateするには

ライブラリは定期的かつこまめにアップデートすることで辛さを減らしていく、というのは最近の開発現場では定説ではないかと思います。Railsプロジェクトの場合、Gemfileの定期更新を実施している現場も多いのではないでしょうか*1

最近のRailsアプリケーションはjsライブラリの管理にyarnを使っているところが多いかと思いますが、これもGemfileと同じように定期的にアップデートしたいところです。

商用のものもいくつかありますが、僕は普段使っているCiecleCIを活用して定期的にyarn updateしています。

使っているツールはこちら。CiecleCIに限定されているわけではないので、定期実行できる環境さえあればどこでも活用できると思います。

taichi/ci-yarn-upgrade: Keep NPM dependencies up-to-date with CI, providing version-to-version diff for each library

設定の仕方

CiecleCIの設定は次のような感じでやっておきます*2

version: 2
jobs:
  yarn-update:
    docker:
      - image: circleci/ruby:2.5.0-node-browsers
    steps:
      - checkout
      - run: sudo sh -c 'echo "deb http://ftp.us.debian.org/debian testing main contrib non-free" >> /etc/apt/sources.list'
      - run: sudo apt-get update
      - run: sudo apt-get install -y git
      - run: yarn global add ci-yarn-upgrade
      - run: GIT_USER_NAME=your_github_user_name GIT_USER_EMAIL=your_email@example.com `yarn global bin`/ci-yarn-upgrade --execute

これとは別に、GitHubのpersonal tokenを取得して、GITHUB_ACCESS_TOKENをCircleCIの設定画面で設定する必要があります。

設定のあと、yarn-updateジョブを実行するとこんな感じのPRができます。

image.png (258.0 kB)

定期実行のやり方

定期実行のやり方はいろいろありますね。常時使える、かつcronが使えるマシンがあればそこからCircleCIのAPIをたたいてもよいです。

Running Jobs With the API - CircleCI

herokuを使って定期実行する

僕はつい最近までherokuのschedulerを使っていました。

herobu という、拙作のシェルスクリプトをherokuにデプロイしておくと、heroku schedulerでCircleCIのAPIを定期実行できます。

毎日PRがくるとちょっと頻度が高すぎるので、週に一回だけPRを作るようにしたいのですが、heroku schedulerは週一回の実行をサポートしていません。

そこでシェルスクリプト側で工夫しています。次のように登録しておいて、土曜日に実行されたときだけAPIを叩くようにしていました。

DAY=6 JOB=yarn-update PROJECT=willnet/savanna ./fire2.sh

詳細はソースを見てください(大したことはしてません)。

circle ciで定期実行する

CircleCIのv2からはWorkflowという仕組みができたので、サーバレスでジョブを定期実行できるようになりました。workflowの仕組自体はジョブを組み合わせて一つのワークフローを定義できるというものですが、一緒に定期実行の機能も追加されています。先程のyarn-updateというジョブを定期実行するworkflowは次のようにして定義できます。

workflows:
  version: 2
  yarn-update-scheculed:
    triggers:
      - schedule:
          cron: "5 0 * * 0"
          filters:
            branches:
              only:
                - master
    jobs:
      - yarn-update

これで毎週日曜日の9時5分にジョブが実行され、定期的にyarn updateできるようになりました。やりましたね。

まとめ

CircleCIを利用してyarnを定期的にアップデートするやり方を紹介しました。CircleCI以外でもいろいろやり方はあると思うので、自分なりのやり方でライブラリを最新に保っていくと良いのではないでしょうか。

*1:Gemfile更新用のツールは商用、OSSでそれなりの数あり、情報も多いので適当にググってください

*2:jobの中でgitをインストールしているのは、たしかCircleCIのイメージ内にあるgitのバージョンが古くてうまく動かなかったからのはず