こんにちは、ギフティでエンジニアをしている @megane42 といいます。社内では Rails アプリの開発と運用を行っています。昨日ウマ娘をインストールしました。
概要
皆様、Dependabot は使っていますか?リポジトリに設定するだけで、依存パッケージ (gem や node module) の更新があるたびに自動で PR を作ってくれる、非常に便利な bot ですね。その Dependabot ですが、現在稼働中のものは
- Github による買収前から動いているバージョン (= Dependabot Preview)
- 買収後に Github の一機能として動いているバージョン (= Github-native Dependabot)
の 2 バージョンが存在します。そして、前者は 2021 年 8 月 3 日にクローズされる予定となっています。前者から後者に移行するには、設定ファイルの修正や Github 上でのセットアップなど、いくつかの作業が必要になります。
今回、担当プロダクトの Dependabot を Preview 版から Github-Native 版に移行したので、その手順の一部始終を共有しようと思います。
設定ファイルを作り直す
Preview 版と Github-Native 版とでは、設定ファイルの構文や配置場所が変わっています。逆に言うと、この設定ファイルの修正さえ終われば移行作業は完了です。
といっても、設定ファイルの修正 PR も Dependabot 自身が作ってくれます。皆様のリポジトリにも、すでに Upgrade to GitHub-native Dependabot
という PR が作られているかもしれません。もし作られていなかったら、https://dependabot.com/ からログインして Upgrade to Github-native Dependabot
ボタンを押してみましょう。
基本的には Dependabot が現状をよしなに汲み取って、環境に合わせた設定ファイルを自動的に作ってくれますが、一部追加で手作業が必要です。どんな作業が必要になるかはアプリの環境によって異なってくるので、ここでは自分たちのプロダクトで必要になった作業についてのみ説明します。
作業 1: ignore 設定の削除
Dependabot が自動作成した新設定ファイルを見ると、身に覚えのない量の ignore 設定が含まれていました。
target-branch: develop versioning-strategy: lockfile-only ignore: - dependency-name: rubocop-rails_config versions: - 1.2.2 - 1.3.0 - 1.3.1 - 1.3.2 - 1.4.0 - 1.4.1 - 1.5.1 - dependency-name: chartkick versions: - 4.0.0 - 4.0.1 - 4.0.2 ...
よくよく調べてみると、Dependabot が過去に作ってくれた PR のうち、何らかの理由でマージせずにクローズしたものに対応するバージョンが列挙されているようでした。例えば、Dependabot が作った PR を取り込む前にさらに新しいバージョンがリリースされると、Dependabot は古い PR を勝手にクローズしてくれるのですが、そういった理由でクローズされたバージョンが、なぜか全て ignore リストに載ってしまっていました。
おそらく互換性のための挙動なのだと思いますが、これらの gem を無視したい強い意図があるわけではなかったので、今回は全ての ignore 設定を手動削除しました。
作業 2 : insecure-external-code-execution: allow の追加
この時点で Github 上から Dependabot の稼働状況を確認すると、下記のようなエラーが出ていました。
Dependabot blocked external code required for this update. Please set insecure-external-code-execution: allow in the config if you trust all dependencies' supply chain.
ドキュメント を読む限り、どうやら bundler / mix / pip を使う場合は設定ファイルに insecure-external-code-execution: allow
を追記しなければいけないようでした。設定項目名がやや禍々しいのでできれば避けたかったのですが、他に方法が見つからなかったため一旦有効にしました。
作業 3 : プライベート Git リポジトリを参照できるようにする
社内の別チームが作った gem にアクセスできるように、Dependabot にプライベート Git リポジトリへのアクセス権限を与える必要がありました。基本的にはドキュメントの通りに設定すればよいのですが (参考1, 参考2)、下記の 2 点だけ少し注意が必要です。
username
はx-access-token
で固定ですpassword
も"${{secrets.MY_GITHUB_PERSONAL_TOKEN}}"
で固定です- secrets 名の部分は自由に決められそうな雰囲気が漂っていますが、これも固定です
- 別の名前で secret を保存しようとするとなぜかバリデーションエラーで弾かれます
- secrets 名の部分は自由に決められそうな雰囲気が漂っていますが、これも固定です
Github パーソナルトークンは、個人の Github アカウントで作成してしまうと属人化してしまうので、bot 用に作った Github アカウント等の下で発行するのがよいかと思います。
作業 4 : Secrets を Github に登録する
Preview 版の頃からありましたが、上述したパーソナルトークン等の秘匿情報を設定ファイルに直接書かなくて済むように、Secrets という仕組みが存在します。Preview 版の頃は https://dependabot.com/ から設定していましたが、Github-native 版では Github 上から設定し直す必要があります。Organization 単位とリポジトリ単位のいずれかで設定可能ですが、何かと小回りが効くので基本的にはリポジトリ単位で設定するのがよいかなと思います。
確認
ここまで終わったら作業は完了です。Preview 版時代に作られた PR がまだ残っている場合は、手動でクローズしておくと次回更新時に Github-native 版が改めて作り直してくれます。Github-native 版が作った PR にはアイコンにバッジが付くのでひと目でわかるようになっています。
おわりに
以上が Dependabot 移行作業のポイントでした。前述したとおり、実際の移行作業は環境ごとに変わってくるので、基本的には公式を参照するのがよいと思いますが (参考1, 参考2)、Rails アプリの場合の移行作業例として参考になれば幸いです。プロダクト開発において、依存ライブラリを最新に保つことは重要な要素のひとつなので、2021 年 8 月までにしっかりと移行を済ませておきたいところです。
余談ですが、Dependabot は細かい部分のユーザー体験が非常に優れているプロダクトだなと思っています。今回の新設定ファイルへの移行 PR を自動で作ってくれる機能もそうですし、@dependabot rebase
で簡単に PR の rebase ができる等、細部の完成度がとても高い印象です。自分も Dependabot を見習って、ユーザー目線で良い体験を作っていかないとなあ・・・と思う今日このごろでした。