リンクアンドモチベーションでストレッチクラウドの開発をしている岡田です。
前提
1年ほど前になりますが、僕たちのチームでVueのアップデートをしました。(参考記事) Vueは2系から3系の間で破壊的変更が多く、移行作業自体がとても大変なものでした。
このようなプロジェクトにして対応するような大きなライブラリのアップデートもあれば、普段からこつこつあげるような非破壊的なライブラリの更新が結構増えてきて、対応する工数が膨れている状況でした。
もっともっと新規機能開発や、仮説の検証に時間を使っていきたいと思い、これまで手で結構時間をかけていたライブラリのアップデートを自動化しようと思いました。
当時の状況
ストレッチクラウドは複数のSPAで動いています。 ライブラリの管理もそれぞれで行っているのでdependabot の設定も下記の様にそれぞれのディレクトリごとに行っていました。
- package-ecosystem: "npm" # See documentation for possible values directory: "hoge" # Location of package manifests schedule: interval: "daily" timezone: "Asia/Tokyo" target-branch: develop open-pull-requests-limit: 1 - package-ecosystem: "npm" # See documentation for possible values directory: "fuga" # Location of package manifests schedule: interval: "daily" timezone: "Asia/Tokyo" target-branch: develop open-pull-requests-limit: 1
そうすると、毎日それぞれのディレクトリに対してdependabotがPRを作成してくれます。 そうして作られた差分をみて、毎日僕が変更が必要であれば変更を追加し、必要なければそのままマージしていました。 稀に破壊的変更が大きいmajor バージョンのアップデートも来るので、それはcloseするか、バックログに積み直して対応するようにしていました。
自動でマージする仕組み
今はCIでVRTや、リリース前にはE2Eテストを行っています。 そのため小さなpatch バージョンや minor バージョンの変更は勝手にapproveをつけて、CIを回して良さそうならマージする。という仕組みを作成しました。
実際のコードは下記の様になります。
- name: Approve & enable auto-merge for Dependabot PR if: | steps.metadata.outputs.update-type == 'version-update:semver-patch' || (steps.metadata.outputs.update-type == 'version-update:semver-minor' && steps.metadata.outputs.dependency-type == 'direct:development') run: | gh pr review --approve "$PR_URL" gh pr merge --auto --squash "$PR_URL" env: PR_URL: ${{ github.event.pull_request.html_url }} PR_TITLE: ${{ github.event.pull_request.title }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
内容は
package.jsonのdependencies
に含まれるものならpatch バージョンまで、devdependencies
に含まれるものならminor バージョンまでを変更対象として、approveし、auto mergeにする
というものになります。
最後に
今はdependatbotの設定を変更して、朝起きたらCIも終わり、マージされている状態になっています。 大きな変更やCIで落ちるような修正が入っているものは実際に確認し、必要な修正を加えてからアップデートするようになりました。 注力するものが明確になって、日々の更新は勝手にされるようになったので、作ってとても楽になった感覚があります。 毎日何かしらのアップデートが来るので、しばらくはこれに頼って色々更新していこうと思っています!