Shogo's Blog

Sep 11, 2026 - 2 minute read - github github-actions

Dependabotの設定リンター dependalint を作った

背景・目的

Dependabot はレポジトリーが依存しているライブラリーの更新をチェックしてくれるツールです。 GitHub の公式ツールとして提供されており、導入も .github/dependabot.yml を設置するだけ、と簡単なのでよく使ってます。

.github/dependabot.yml を設置するだけなんですが、それでも設定内容をミスってしまうのが人間というもの。 main ブランチへの .github/dependabot.yml のコミットで設定ファイルのバリデーションが走るのですが、そこではじめてミスに気がつくということが多々ありました。 プルリクエストの時点で気がつけるといいのですが、なぜかプルリクエストでは .github/dependabot.yml のバリデーションは走りません。

僕と同じ悩みを持つ人は他にもいるらしく、Issueも起票されているのですが、あまり動きはありません。

今の時代AIでなんとでもなるだろと、 Codex先生に「ドキュメントを読んでリンターを実装して」とお願いしたらものの5分で作ってくれました。

使い方

Goで実装してあるので go install でインストールできます。

go install github.com/shogo82148/dependalint/cmd/dependalint@latest

コマンドを叩くと dependabot.yml の内容をバリデーションしてくれます。

dependalint

何も出力がなければOKです。 問題があるとエラーのあった場所を教えてくれます。

たとえば以下のような問題だらけの設定ファイルを渡すと、

# Test configuration for dependalint

version: 2
updates:
  - package-ecosystem: "unknown" # そんな名前のエコシステムは存在しない
    directory: "/not-found" # 対象となるディレクトリーが存在しない
    schedule:
      interval: "invalid" # 不正なインターバル

以下のような出力が得られます。

testdata/dependabot.yaml:5:24: updates[0].package-ecosystem: unsupported ecosystem "unknown"
testdata/dependabot.yaml:6:16: updates[0].directory: directory does not exist
testdata/dependabot.yaml:8:17: updates[0].schedule.interval: must be one of cron, daily, monthly, quarterly, semiannually, weekly, yearly

GitHub Action

CIに簡単に組み込めるよう GitHub Action も用意しました。

.github/workflows/dependalint.yml に以下のワークフローを追加するだけで使えます。

# .github/workflows/dependalint.yml

name: dependalint
on:
  push:
    paths:
      - .github/dependabot.yml
      - .github/workflows/dependalint.yml
  pull_request:
    paths:
      - .github/dependabot.yml
      - .github/workflows/dependalint.yml

permissions:
  contents: read
  checks: write

jobs:
  dependalint:
    name: runner / dependalint
    runs-on: ubuntu-slim
    steps:
      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
      - uses: shogo82148/actions-dependalint@5a2eeef8cd5d8354b4e8446822649e9b37c177c1 # v0.1.0
        with:
          reporter: github-check

余談

dependabot.yml ではDependabotが何時に更新チェックするかを指定できます。 たとえば「毎朝9時」のような設定が可能です。 どんな記法が使えるかドキュメントを見てみましょう。

Supported values: Valid cron expression in cron syntax or natural expression.

https://docs.github.com/en/code-security/reference/supply-chain-security/dependabot-options-reference#cronjob

cron expression は知ってるが・・・natural expression???

そう、自然言語で指定ができるのです! 「毎朝9時」なら every day at 9am みたいな感じで指定できます。

裏では floraison/fugit というライブラリーを使っているらしく、他にも以下のような記法が使えます(Codex先生調べ)。

  • 定型スケジュール: @daily, @weekly, @monthly, @yearly, @midnight, @noon
  • 毎月末: 0 0 L * *, 0 0 last * *
  • 月末7日前から月末: 0 0 -7-L * *
  • 第1月曜日: 0 5 * * mon#1
  • 最終金曜日: 0 7 * * fri#L, 0 7 * * fri#-1
  • 隔週日曜日: 0 9 * * sun%2
  • 隔週日曜日(オフセット): 0 9 * * sun%2+1
  • 毎日12時台のランダムな分: ~ 12 * * *
  • 毎日5時: every day at five
  • 毎週水曜日17時: every wed at 5 pm
  • 月・火曜日17時: every tuesday and monday at 5pm

(もちろん実際に dependabot.yml に指定してみて裏は取った。) 仕事で使っているレポジトリーだと、第1月曜日(0 5 * * mon#1)とか最終金曜日(0 7 * * fri#L)とかの指定は便利かもしれないですね。

undocumentedな挙動なので拒否しようかとも思いましたが、拡張cron記法をすでに使っている人もいるそうだしサポートすることにしました。 おかげでバリデーションのための正規表現がすごいことになったけど、AIと一緒ならへっちゃらです。たぶん。

まとめ

Dependabotの設定ファイルのリンターを作りました。

dependabot.yml の設定ミスでお悩みの方はぜひご利用ください。

うさぎは設定を静かに確認する
dependalintが誤りを見つける
Actionsが手順を走る
cronは月夜の予定を刻む
安心の設定が巣を守る
ぴょんと記事が完成する

by CodeRabbit

参考