ライブラリは定期的かつこまめにアップデートすることで辛さを減らしていく、というのは最近の開発現場では定説ではないかと思います。Railsプロジェクトの場合、Gemfileの定期更新を実施している現場も多いのではないでしょうか*1。
最近のRailsアプリケーションはjsライブラリの管理にyarnを使っているところが多いかと思いますが、これもGemfileと同じように定期的にアップデートしたいところです。
商用のものもいくつかありますが、僕は普段使っているCiecleCIを活用して定期的にyarn updateしています。
使っているツールはこちら。CiecleCIに限定されているわけではないので、定期実行できる環境さえあればどこでも活用できると思います。
設定の仕方
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ができます。
定期実行のやり方
定期実行のやり方はいろいろありますね。常時使える、かつ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以外でもいろいろやり方はあると思うので、自分なりのやり方でライブラリを最新に保っていくと良いのではないでしょうか。