【Github】Dependabotの設定と停止方法

post-hero-image

日々タスクに追われるエンジニアにとって、最新化の必要なパッケージがあるかどうか、ひとつひとつ確認するのは骨の折れる作業です😵‍💫

そんなエンジニアの救世主として、依存パッケージの更新を提案するサービスが存在します。
代表的なのはRenovateと、今回紹介するDependabotですね。
エンジニアどうしの宗教戦争に発展するため、これら二つのサービスの比較は他の記事に委ねます...。

本記事ではDependabotの概要と導入・設定方法、一時停止の方法を解説します。

先日わたしはDependabotの停止設定をしたつもりだったのですが、実際にはできておらず、プルリクエストが生成されてしまいました。
その教訓を記事にしておきたいと思います。

対象読者

  • Dependabot をこれから使うエンジニアさん
  • Dependabot をすでに運用中で、設定に関してお困りのエンジニアさん


Dependabotとは

Dependabot(ディペンダボット)は依存パッケージの更新を自動化する GitHub 公式ツールです
npmだけでなく、Yarn, Maven, Gradle, Pipなどのパッケージ管理ツールにも対応しています。

Dependabotが自動的にパッケージのバージョンをチェック、更新が必要であればプルリクエストを作成してくれます。
開発者はプルリクをマージするだけでパッケージのアップデートが完了。この仕組みなら、忙しい開発者やわたしのような不器用さんでも、こまめにパッケージをアップデートできるというわけです🙆‍♀️

Dependabotをリポジトリに設定すると、GitHub Actions 上に"Dependabot Updates"という専用のワークフローが表示されるようになります。Dependabot は、このワークフローを通して 依存パッケージの自動更新やプルリクエストの生成を行っています。週1実行、自動マージなどの細かい設定は、リポジトリの .github/dependabot.yml(設定ファイル)で実装します。

他にも、ソースコードに含まれる依存パッケージに既知の脆弱性があった場合、GitHub のリポジトリ上で通知する"Dependabot Alert"という機能があります。
有効にすることで、SecurityタブにDependabotの項目が追加され、Dependabot alertsをまとめて確認することができるようになります。
詳細情報も確認できますし、重大度を10点満点中何点程度のなのか示してくれます。
アラートを検知すればメール等で通知してくれますし、Dependabot alertsに関する通知の受け取り方法もカスタマイズできます。

もちろんDependabotによる更新提案の一時停止も可能です。
依存パッケージの管理はDependabotにおまかせして、エンジニアは開発に集中できます。

Dependabot の基本設定

それではリポジトリでDependabotを有効にする設定をご紹介します。
Dependabotはどのリポジトリでも利用可能です。Githubアカウントも、無料のもので大丈夫です。

設定したいリポジトリで、Settingsタブを選択、"Code security"から"Dependabot"へ移動してください。
"Dependabot version updates"の"Enable”を押すことで、Dependabot によるバージョン更新機能が有効になります。

"Dependency graph"と"Dependabot alerts"も同時に有効にする旨がダイアログで案内されます。ダイアログに従い"Enable"を選択しましょう。



すぐ下のDependabot security updatesも併せてEnableにしておくのがおすすめです。脆弱性検出と修正プルリクを作成してくれます。
わざわざversion updatesとは個別に設定できるようにしてあります。親切ですが、わたしと同様に英語苦手な方は要注意です⚠️


続いてリポジトリに.github/dependabot.ymlを作成します。Dependabot version updatesの横に"Configure"と表示されますので、ここから作成できます。
このワークフローファイルには以下の内容を記載します。

# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.

version: 2
updates:
- package-ecosystem: "npm" # See documentation for possible values
  directory: "/" # Location of package manifests
  schedule:
    interval: "weekly"


これらはいずれも必須の設定項目です。

package-ecosystemnpmpipmaven など、Dependabot でサポートされているパッケージ管理ツールを指定できます。
"directory: "/" と指定することで、リポジトリのルートディレクトリ(/)からパッケージ定義を探しに行きます。

schedule.intervalはDependabotによるパッケージ更新チェックを定期実行頻度を設定します。dailyweeklymonthlyが指定可能です。

平日の月曜日から金曜日まで毎日実行するには daily、週に一度(デフォルトは標準時の月曜)に実行するには weeklymonthlyは毎月1日に実行します。

とくにスケジュール設定をしない場合(デフォルト)は Dependabot が実行タイミングを自動(ほぼランダム)で選択します。特定の時刻を設定したい場合は timetimezone を指定することで、Dependabotの実行時間を制御できます。

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
      time: "09:00"
      timezone: "Asia/Tokyo"



月に2000本とかパッケージの更新が走ってしまう方は、さすがにGitHubアカウントの課金が必要するかも...?心配な方はプルリクエストの上限数open-pull-requests-limitを設定して調整しましょう。(参照: GitHub Actions の課金について - Github

version: 2
updates:
- package-ecosystem: "npm"
  directory: "/"
  schedule:
    interval: "weekly"
  open-pull-requests-limit: 5 # Dependabotが同時に作成するPull Requestの上限を5件に制限


プルリク生成の流れ

schedule.intervalで設定したスケジュールでDependabotが更新の必要なパッケージを判定。
更新対象があれば、Dependabot が自動で専用のブランチを作り、package.jsonpackage-lock.jsonを更新したコミットを作成します。
作成したブランチで、リポジトリに対して新規のプルリクをオープンします。

Dependabot が生成したプルリクは通常のプルリクと同じ扱いです。(承認とマージに関しては、デフォルトブランチに設定されたルールに従います。)



問題なければ開発者が承認・マージを実施するだけで、パッケージの最新化は完了です🎉

ワークフローファイルでopen-pull-requests-limit による制限を設定しており、すでにプルリクが上限に達している場合は、新しいプルリクを作らずにスキップ(待機)します。
既存のプルリクがマージもしくはクローズされるまで新しいプルリクは生成されません。


とくに確認が必要ない場合、自動でマージする設定にもできます。
このページに従ってワークフローファイルに追記してみてください。
GitHub ActionsでのDependabotの自動化 - GitHub Docs
Renovateのデフォルトは自動マージだったような。お好みでどうぞ。

一時停止の方法

リポジトリの依存パッケージの更新が多かったり、開発者が忙しく、対応しきれない期間もあるかもしれません。
完全にDependabotの設定を無効にしてもいいですし、Dependabotによる更新を一時停止しておくこともできます。

さきほど紹介したopen-pull-requests-limitを0に設定すると、自動でプルリクを作成しないようにできます。

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    open-pull-requests-limit: 0


余談ですが、わたしがDependabotを一時停止した理由について。
ホスティングサービスでプルリクブランチを自動デプロイするように設定しており、課金が発生してしまいそうだったからです。

このブログ(trog)はNetlifyというホスティングサービスから公開しているのですが、プルリクを出すと自動でプルリクブランチがNetlifyにデプロイされ、Github上にデプロイ結果が表示されます。
またビルド成功した場合は、できあがったプレビューサイトのリンクを案内するようにしています。
このプレビューサイトはリンクを知っている人なら誰でもアクセス可能です。


Dependabotとこの自動デプロイ機能のどちらも設定しているリポジトリの場合、毎週Dependabotがプルリクを生成するたび、自動デプロイが走ります。
そのため都度、Netlifyのビルド時間の無料使用枠を消費していきます。
無料枠に余裕のない月であれば、Dependabotを一時停止するか、Netlifyの自動デプロイを一時的に無効にしておくのがおすすめです。

Netlifyさんは優秀ですので、課金が発生しそうになると通知メールを出してくれます。
その様子は【微課金】Netlifyから請求がきた | trog で紹介してますので、ご興味のある方はぜひご覧ください。(宣伝)

Dependabotを無効にする

停止したいリポジトリの.github/dependabot.yml を削除してください。該当部分をコメントアウトしてもOKです。

実質的にはこれで停止できるのですが、あとから見返してもわかるように、Settingsタブを選択、Code securityからDependabotへ移動して、Dependabot配下の設定をすべて"Disable"にしておくのがおすすめです。

...というのも、先日SettingsタブからDependabot配下の設定をすべて"Disable"にしたものの、実際にはDependabotは無効になっておらず、ワークフロー定義で Dependabot が呼ばれ、翌週月曜にはいつもどおりに更新が実行されていました。
.github/dependabot.yml をどうにかしないかぎり、プルリクが生成され続けるようです。

おわりに

Dependabotは、エンジニアの開発時間の確保に役立つ強力なツールです🦾
勝手に動いているのでわりと忘れがちなのですが、停止・再開を行う際は GitHub Actions のワークフローにも注意が必要になります。

また依存パッケージが多いリポジトリでは、Dependabotからの通知が頻繁に来ることになります。
プロジェクトを安全に保つためにも、不要なパッケージを削除するなど、依存パッケージを定期的に見直すきっかけになるかと思います。
セキュリティリスクやメンテナンスコストも減らせますので、パッケージを整理して、さらに開発効率を向上させていきましょう🙌


* * *


<参照サイト>


    この記事を共有する
とろ(microayatron)
profile-icon

Webアプリケーションのプログラマ(フロントエンドエンジニア) Angular(TypeScript) / Next.js / Cypress を主に使用。
前職はピアノ技術者(調律師)。2017年からブログ「trog」を運営。
あざらしと音楽が好き。

trogではプッシュ通知機能を提供しています。

新しい記事が投稿されたタイミングで、お使いの端末にお知らせが届きます。

よければ通知設定ページから通知の許可をお願いします。