こんにちは!こんばんは!エンジニアの大石です。
突然ですが、依存ライブラリのアップデートって大変ですよね。
大きなアプリケーションになればなるほど依存するライブラリが増えがちですが、定期的にアップデートされてないか確認したり、習慣的に小さくアップデートするのって結構大変だったりします。
アップデートされてないか確認するだけでも億劫ですし、フレームワークのバージョンを上げるってタイミングで芋づる式に全部上げることになってしまって辛かったり... などなど。
今回は、Dependabotを用いてGitHub上に自動で各ライブラリをアップデートしたPRを自動的に作る仕組みを導入して実際に運用してみた知見を共有したいとおもいます!
Dependabotって何?
Dependabotとは簡単に言うとGitHub上で自動的にプロジェクトが依存しているライブラリのバージョンを上げたPRを作ってくれるボットです。
npm、Bundler、Composer、Gradleなどなど主要なパッケージマネージャーやビルドツールにしてるので大体のケースにおいては有効化するだけで使えます!
入れておくと定期的に自動でライブラリのアップデートを確認しに行ってくれます(頻度は調整可能)。便利ですね!!
有効化してしばらくすると...
このように自動でPRを作ってくれます!
また、このようにライブラリごとにバージョンごとの差分と変更点をまとめて出してくれるので、PRを見て内容を確認してそのままマージする、もしくは詳細に調査してから慎重にアップデートするかの判断が出来ますね。
とりあえず有効化する
単純なLaravel+JSのプロジェクトであれば、以下のファイルをGitHubのプロジェクト上に配置してあげるだけで有効化できます。
.github/dependabot.yml
に設定を記述したYAMLを置いておきましょう。
(設定ファイルの詳細な記述方法についてはGitHubの公式ドキュメントが非常に分かりやすいのでそちらを参照してください!)
version: 2 updates: - package-ecosystem: "composer" directory: "/" schedule: interval: "weekly" day: "monday" reviewers: - "※ レビュワーのGitHubのIDを指定" labels: - "アップデート対応" - "php" - package-ecosystem: "npm" directory: "/" schedule: interval: "weekly" day: "monday" reviewers: - "※ レビュワーのGitHubのIDを指定" labels: - "アップデート対応" - "javascript"
弊チームでは毎週火曜日に定期的にDependabotで作成されたPRを確認する運用にしているので、毎週月曜日にアップデートの確認が動くように設定して、レビュワーを指定してリマインドするようにしています。
アップデートの運用
アップデートの確認が自動化されて、PRも自動で作られるようになって大満足!!!!ってなりがちですが、ちゃんと運用しないとただPRが放置されて終わってしまうので、弊チームでは以下のような運用にしてアップデートに対処しています。
アップデートのPRが作成されたらやること
(1) 即マージできるか?
テストで動作が担保できると確信できる場合はマージする。
開発時のみに依存しているライブラリの場合はローカルで動かして問題ないと確信できる場合はマージする。
(2)即マージほどではないが開発環境にデプロイしてマージできるか?
開発環境にデプロイして動作に問題ないと確信できる場合はマージする。
デプロイのみに依存するライブラリの場合もこの対応で良い。
(3)メジャーバージョンか?
メジャーバージョンの場合は基本的にどんなライブラリであってもマージしない。
対応IssueをJira上に作成し、どんな変更があったのかを調査してから安全にアップデートする。
(JIRAのIssueを作成するときは、GitHubのコメントに /jira <コメント>
を入力で自動的にIssue作成)
(4)マイナーバージョンか?
1と2で問題ない場合はマージできる。
テストが落ちている等の場合はissue化して別途対応する。
(5)パッチバージョンか?
4と同じ
備考
問題ないと確信できない場合は、懸念点・不安解消ポイントなどをあげてJIRA上にIssue化する。
例えば大きめな動作確認が必要である、などなど。
といった感じに運用しています。
上に書いた運用ルールは実際に社内で使用している開発のドキュメントから引用したものですが、実際にこの運用で週に5〜10個程度のライブラリをアップデートしています。
ちなみに、Jiraに作成したアップデートのIssueの優先度付けは、以前開発者ブログにて投稿した「インフラタスク優先度定量化」の仕組みで付けています!
こちらも併せて読んでみてください!!
JiraのIssue作成の仕組み
JiraのIssueに毎回GitHubのPRのURLを貼り付けて、タイトルを書いて... という作業は結構退屈で辛い作業なので、Zapierと組み合わせて自動化しています。
仕組みとしては、GitHub上に /jira
と書かれたコメントを書くとZapier側で検知して対象のPRから必要な情報を抜き出して、自動的にそれを元にJiraにIssueを作成するようにしています。
さいごに
今回紹介させていただいたライブラリのアップデートの運用は取り組みを始めてばかりですが、より安全に早くバージョンアップが出来るように随時運用の方もアップデートしていきたいとおもいます!
M&Aクラウドではエンジニアを積極採用しています!
完全に余談ですが、最近弊社の社内部活動である #アイドル部 が盛り上がっていて、私が推しているアイドル(Appare!の藍井すず)の名前が広まりつつあって嬉しさを感じています。
Dependabotを使ったライブラリのアップデートの取り組みも社内のSlackに投稿したところから始まったので、些細なことでもシェアできる文化は忘れないようにしたいですね!