ソフトウェアって継続的なメンテナンスが必要なものであり、依存関係のこまめな更新は「基本的にはやっておくべきもの」な立ち位置のタスクだと思います。
現実では、中の人のリソース等々の事情によりアクティブにメンテできないプロジェクトもありますよね。 プロジェクトの(ビジネスにおける重要性、という意味での)位置付けによって、塩漬け判断の塩梅が変わってくるかと思います。
...しかしながら、ハイレベルな CVE に関してはそうそう放置しておくわけにはいきません。 普段複数のプロジェクトの機能追加や障害対応に追われて、ついつい保守観点やセキュリティ方面の備えをおざなりにしがちなんよね、、、という方も(まあ望ましくはないのですが)少なからずいらっしゃると思います(私もです)
能動的にソフトウェアのアプデ情報を確認しに行くのはそれなりに脳のカロリーを消費するので、最小限の労力で最低限効能のあるなにかしらの手を打ちたいところです。まずは「気付ける」状態になること、それをできるだけ低カロリーで実現できること、というのを目指したいですね。
ということで、この記事では GitHub の Dependabot と Slack の GitHub Apps を用いて「Slack チャンネルに依存関係の Security Update を Pull Request として通知させる」という仕組みを入れてみようと思います。
作業手順を書いていきます。
GitHub
Dependabot を有効化します。レポジトリの "Settings" -> "Code security and analysis" に遷移してください。
以下の2つを有効化します。
- Dependabot alerts
- Dependabot security updates
以上の作業を行うことで、「Security update に関係する依存関係のバージョンアップを行う Pull Request」を Dependabot が自動で作成してくれるようになります。
ここまでの手順で、セキュリティ上の問題のある依存関係は Pull Request として可視化できるようになりました。 次は Pull Request の作成を Slack 通知する仕組みを入れることで、普段の居住空間 (?) にこの情報が流れるようにします。
Slack
まず、GitHub App については /github help
や公式が出しているレポジトリから仕様を確認できます。詳しい仕様はこれらをご確認ください。
最初に、通知用のチャンネルを適宜作成しておきましょう。 また、お使いの Slack workspace で GitHub Apps を有効化しておきつつ、App から連携して良い対象レポジトリを追加する作業が必要です。このへんは GitHub Organizations の管理者による承認が必要です。
残念ながらスクショを取りそびれたので画像を提示できないのですが、Slack 上で slash command /github
を使って表示されるインストラクションに従うことで App のインストールとレポジトリへの読み取り権限をリクエストすることができます。
管理者から承認をもらったら、通知を流したいチャンネルで GitHub の slash command を用いて目的の通知を行わせるように設定します。
通知設定と、受け取れる通知の種類・デフォルトの設定値について、 /github help
で確認できるメッセージから引用します。
Configure subscriptions You can customize your notifications by subscribing to activity that is relevant to your Slack channel.
/github subscribe owner/repo [feature]
/github unsubscribe owner/repo [feature]
Disabled by default and can be enabled
reviews
comments
branches
discussions
workflows
Enabled by default and can be disabled
issues
pulls
commits
releases
deployments
私の場合は Dependabot による Pull Request が最低限必要だったので、他の通知イベントに関しては「あったら良さそう」かつ「通知が煩わしくならなさそう」なラインでざっくり選定しました。今回は pulls, reviews, branches, releases の4つを subscribe するように設定しています。
※ issue くらいはあっても良いかもしれませんが、私の所属課でのタスク管理は別でメイン利用しているものがあるので今回は外しました。以下のような slash command を Slack 上で実行します。 owner
repo
は適宜読み替えてください。
// Slack 上で以下の2つの Slash command を実行
/github subscribe owner/repo reviews branches
/github unsubscribe owner/repo issues commits deployments
これにて作業完了です。こんな↓感じの通知が出るようになるはずです。
ちなみに、Dependabot は依存関係となるパッケージ1個ずつで Pull Request を作成します。これらを個別に承認しても良いですし、別途 package.json なり requirements.txt なりをまとめて最新化するような Pull Request を自前で作成してそれをメインにマージするような対応でもOKです。Dependabot は賢いので、メインブランチに反映された依存関係の定義が最新化されて問題なくなれば自分自身で bump の Pull Request を閉じてくれます。そのへんどうやって運用するのかはチーム内のブランチ運用やデプロイ方針との調整になると思います。各々のチームで相談すると良いでしょう。
まとめ
以上の手順で次回から Dependabot による Pull Requests が slack 通知されるようになります。CVE への対応がやりやすくなることでしょう。きっと。
開発者としての責務とオーナーシップをできるだけ楽しながら果たしていきたいですね。やっていきましょう。