毎月の依存パッケージの更新で、変更履歴を自社のコードでの使い方と照らし、破壊的変更・非推奨に当たるかを判定して、更新の可否と直す箇所の一覧を作る
毎月の依存パッケージの更新で、Dependabot のプルリクエストごとに、更新の範囲の変更履歴とリリースノートを読ませます。破壊的変更・非推奨が自社のコードでの使い方に当たるかを判定し、更新の可否と直す箇所の一覧をプルリクエストに書き込みます。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Python
- 対象業界
- EC/IT・SaaS/金融
- 対象部門
- 情報システム
- 対象業務
- 内容確認・チェック/比較検討
- 主な課題
- 判断に時間がかかる/属人化している/確認ミスが多い
- AIで行う処理
- 判定
- 主な効果
- 判断支援/属人化解消/工数削減
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 月初に Dependabot が更新のプルリクエストを作る。自動テストが走る
- 担当者がプルリクエストを開き、どのパッケージがどの版からどの版へ上がるかを確かめる
- プルリクエストの本文のリリースノートと変更履歴を読む。足りなければパッケージのリポジトリを開いて CHANGELOG を読む
- 更新の範囲(例:4.2.1 から 4.6.0)に含まれる版の変更から、破壊的変更・非推奨・既定の動作の変更を拾う
- 拾った変更に関係する関数・オプションを、自社のコードで検索する
- 当たる箇所があれば直すかどうかを決め、プルリクエストにコメントを書く
- 取り込むか、保留にするかを決める
- 自動月初に Dependabot が更新のプルリクエストを作り、自動テストと並んで判定のワークフローが動く
- 自動プルリクエストから、パッケージの名前・更新前と更新後の版・更新の種類(メジャー・マイナー・パッチ)を取り出す
- 自動パッケージのリポジトリから変更履歴とリリースノートを取り、更新の範囲の版だけを切り出す
- 自動自社のコードから、そのパッケージを読み込んでいる箇所と、使っている関数・オプションの一覧を作る
- 自動Claude API が、範囲内の変更ごとに、自社の使い方に当たるかを `affects`/`no_usage_found`/`unknown` で判定し、根拠の文と行を付ける
- 自動ワークフローが、判定とテストの結果から、更新の可否の区分を規則で決める
- 自動判定の一覧と直す箇所をプルリクエストにコメントで書き、区分のラベルを付ける
- 人担当者が `affects` と `unknown` の行を確かめ、取り込むか、直してから取り込むか、保留にするかを決める
各工程の詳しい説明を読む
- 月初に Dependabot が更新のプルリクエストを作る。自動テストが走る
- 担当者がプルリクエストを開き、どのパッケージがどの版からどの版へ上がるかを確かめる
- プルリクエストの本文のリリースノートと変更履歴を読む。足りなければパッケージのリポジトリを開いて CHANGELOG を読む
- 更新の範囲(例:4.2.1 から 4.6.0)に含まれる版の変更から、破壊的変更・非推奨・既定の動作の変更を拾う
- 拾った変更に関係する関数・オプションを、自社のコードで検索する
- 当たる箇所があれば直すかどうかを決め、プルリクエストにコメントを書く
- 取り込むか、保留にするかを決める
(a)範囲を読み違える。 変更履歴は新しい版から順に書かれ、どこからどこまでが今回の範囲かを自分で区切る必要があります。 間の版の変更を読み飛ばすと、4.3.0 で入った既定の動作の変更を見落とします。
(b)テストが通ると安心してしまう。 自動テストは、テストを書いた箇所しか確かめません。非推奨の警告はテストを落とさず、次のメジャーで消えるまで気づかれません。
(c)検索が担当者の勘に頼る。 変更履歴の「timeout オプションの単位をミリ秒に変えた」から、自社のコードの何を検索すればよいかは、パッケージに詳しい人にしか分かりません。検索しなかったことと、検索して見つからなかったことが、記録の上で区別されません。
(d)グループのプルリクエストが重い。 マイナーとパッチをまとめたプルリクエストには十数のパッケージが入ります。1つずつ変更履歴を読むと1時間を超え、後回しにされます。
- 【自動】 月初に Dependabot が更新のプルリクエストを作り、自動テストと並んで判定のワークフローが動く
- 【自動】 プルリクエストから、パッケージの名前・更新前と更新後の版・更新の種類(メジャー・マイナー・パッチ)を取り出す
- 【自動】 パッケージのリポジトリから変更履歴とリリースノートを取り、更新の範囲の版だけを切り出す
- 【自動】 自社のコードから、そのパッケージを読み込んでいる箇所と、使っている関数・オプションの一覧を作る
- 【自動】 Claude API が、範囲内の変更ごとに、自社の使い方に当たるかを
affects/no_usage_found/unknownで判定し、根拠の文と行を付ける - 【自動】 ワークフローが、判定とテストの結果から、更新の可否の区分を規則で決める
- 【自動】 判定の一覧と直す箇所をプルリクエストにコメントで書き、区分のラベルを付ける
- 【人】 担当者が
affectsとunknownの行を確かめ、取り込むか、直してから取り込むか、保留にするかを決める
4番目が、この設計の分かれ目です。 自社のコードの使い方の一覧は、生成AIに探させず、プログラムで作ります。 読み込みの文と呼び出しの箇所を機械的に集めた一覧を渡すので、AIが判定に使う「使っている箇所」は、どれも実在する行です。
6番目を規則で決めているのも、意図してのことです。 AIが出すのは変更ごとの判定までで、取り込めるかどうかの区分は「affects が1つでもあれば要修正」のような規則で決めます。 規則なら、チームごとの方針の違いを設定で表せます。
02今回想定するシステム構成
Dependabot の更新のプルリクエスト(毎月) ▼【トリガー】pull_request GitHub Actions ├── dependabot/fetch-metadata(パッケージ名・版・更新の種類) ├── 変更履歴とリリースノートの取得(GitHub の REST API) ├── Python ── 範囲の切り出し/自社のコードの使い方の一覧 ▼ Claude API ── 変更ごとに自社の使い方に当たるかを判定(構造化出力) ▼ Python ── 判定とテストの結果から更新の可否の区分を規則で決める ▼ プルリクエストへのコメントとラベル ▼ 【人】担当者が affects と unknown を確かめて決める
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理 | Claude API(変更ごとの判定と、直す箇所の説明) | OpenAI API、Gemini API |
| 連携 | GitHub Actions(プルリクエストを起点に動かし、コメントとラベルを付ける) | GitLab CI/CD |
| 集計 | Python(範囲の切り出し、使い方の一覧、可否の区分の規則) | Node.js のスクリプト |
| 保管 | ワークフローの成果物(判定のJSON) | 社内のオブジェクトストレージ |
プルリクエストを自動で取り込む設定にはしません。 この構成が書き込むのはコメントとラベルだけです。判定が誤っていても、取り込む前に人の目を通ります。
起点は Dependabot のバージョン更新です。 更新の頻度は daily から yearly まで選べ、本記事では monthly にします。groups でマイナーとパッチをまとめ、メジャーを別のプルリクエストにできます。 GitHub の説明では、取り込む前にプルリクエストの本文に含まれる変更履歴とリリースノートを確かめるよう案内されています。この構成は、その確認の手順を機械に寄せたものです。
更新の情報は dependabot/fetch-metadata で取ります。 更新されたパッケージの名前、更新前と更新後の版、最も大きい更新の種類(version-update:semver-major など)、依存の種類(本番か開発用か)、グループの名前などを、後の手順で使える出力として返します。
一つ注意があります。 Dependabot が起点のワークフローでは、使える秘密情報は Dependabot のシークレットだけで、GitHub Actions のシークレットは使えません。 トークンも既定では読み取り専用です。Claude API のキーは Dependabot のシークレットに置き、コメントを書くために permissions で書き込みの権限を足します。
03どうやって実装するのか
処理の起点を決める
Dependabot がプルリクエストを作ったときの pull_request を起点にします。 ワークフローの条件で、作成者が Dependabot のときだけ動かします。自動テストと同じタイミングで並んで動き、テストの結果が出た後に可否の区分を決めます。
pull_request_target は使いません。 公式の説明では、Dependabot の制限を避ける方法として pull_request_target を使う二段階の手順も挙げられていますが、秘密情報のある環境でプルリクエストの中身を扱う形になるので、この構成では避けます。 判定に要るのは変更履歴と自社のコードの読み取りだけで、書き込みはコメントとラベルに限られるため、pull_request で足ります。
Dependabot が既存のプルリクエストを新しい版で作り直したときも、同じ起点で動きます。前回の判定のコメントは消さずに「古い判定」と印を付け、新しい判定を足します。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 更新の情報 | パッケージの名前、更新前と更新後の版、更新の種類、依存の種類、グループ名 | dependabot/fetch-metadata の出力 |
| 変更履歴 | パッケージのリポジトリの CHANGELOG(Markdown) | GitHub の REST API(リポジトリの内容の取得) |
| リリースノート | 範囲内の各版のリリースの本文 | GitHub の REST API(タグ名でリリースを取得) |
| 自社のコードの使い方 | そのパッケージを読み込んでいるファイル、使っている関数・クラス・オプション、行番号と前後数行 | プルリクエストのブランチを読んで Python で作る |
| テストの結果 | 自動テストの成否、新しく出た非推奨の警告 | 同じプルリクエストのテストのジョブ |
質を決めるのは、4行目の使い方の一覧です。 変更履歴の判定は、照らす相手が正確でなければ意味がありません。一覧はプログラムで機械的に作り、AIに探させません。
5行目の非推奨の警告は、テストのログから拾います。 テストは通っていても、更新後に新しい警告が出ていれば、それは変更履歴の非推奨と対応しているはずです。判定のときに、警告の文も一緒に渡します。
データの取得方法を決める
| 取るもの | 方法 | 注意 |
|---|---|---|
| パッケージのリポジトリ | パッケージの登録情報からリポジトリの場所を引く | 場所が登録されていないパッケージは unknown |
| CHANGELOG | GET /repos/{owner}/{repo}/contents/{path}、ref に更新後の版のタグ | 1MBを超えるファイルは raw の形式でだけ取れる |
| リリースノート | GET /repos/{owner}/{repo}/releases/tags/{tag} | 範囲内の版ごとに取る |
| 使い方の一覧 | Python で読み込みの文と呼び出しを集める | 下の表 |
CHANGELOG を取るときは、application/vnd.github.raw+json を指定して本文をそのまま受け取ります。 大きな CHANGELOG を持つパッケージは珍しくなく、1MBを超えるとこの形式でしか取れません。
使い方の一覧は、言語ごとに次のように作ります。
| 言語 | 集めるもの | 方法 |
|---|---|---|
| Python | import・from ... import の文と、読み込んだ名前の呼び出し | 標準の ast で構文木を読む |
| TypeScript | import の文と、読み込んだ名前の呼び出し・オプションのキー | 構文の解析器で読む。読めないファイルは文字列の検索に落とす |
| 設定ファイル | パッケージ名やオプション名が書かれた行 | 文字列の検索 |
構文木で読むのは、文字列の検索だと同じ名前の別物を拾うからです。 parse という名前は、どのパッケージにもあります。読み込んだ名前から呼び出しをたどれば、そのパッケージの parse だけを拾えます。 構文木で読めなかったファイルと、文字列の検索で拾った行は、source: "text_search" と印を付けて区別します。
AIへ渡す前に整形する
- 範囲の切り出し … CHANGELOG の見出しから版の番号を読み、更新前より新しく更新後以下の版の節だけを残します
- 版の並びの確認 … 見出しの版が飛んでいないか、リリースの一覧と照らします。範囲内の版の節が見つからなければ、そのことを記録します
- 変更の分割 … 節の中の箇条を1つずつに分け、版番号を付けます
- 使い方の一覧の圧縮 … 同じ呼び出しが多数あるときは、ファイルごとの代表の行と件数にまとめます
- 秘密情報の除去 … 前後数行に鍵やパスワードらしい文字列があれば伏せます
- 0.y.z の印 … 更新前か更新後の版が 0 から始まるときは、印を付けます
1番目と2番目を、AIに任せずにプログラムで行うのが要点です。 範囲の読み違い(第3章の(a))は、人でもAIでも起きます。版の番号の比較は機械で確実にでき、どの節を渡したかが記録に残ります。
6番目は、SemVer の取り決めによるものです。 メジャーの版は互換性の無い変更で上げることになっていますが、0.y.z は初期の開発のための版で、いつ何が変わってもよいとされています。 0 から始まる版はマイナーの更新でも破壊的変更がありうるので、更新の種類にかかわらずメジャーと同じ扱いにします。
AIに処理させる
させるのは、範囲内の変更1つずつについて、自社の使い方に当たるかを判定し、根拠を組で示すことです。
| 判定 | 意味 | 根拠に付けるもの |
|---|---|---|
affects | 変更の対象を、自社のコードで使っている | 変更の文と、使っている行(ファイルと行番号) |
no_usage_found | 変更の対象が、使い方の一覧に見つからない | 変更の文と、照らした名前 |
unknown | 判定できない(動的な読み込み、設定での指定、変更の文があいまい) | 判定できない理由 |
not_breaking | 変更が機能の追加や不具合の修正で、使い方を変えない | 変更の文 |
| させないこと | 理由 |
|---|---|
| 更新の可否の決定 | 規則とテストの結果で決め、人が確かめる |
| 使い方の一覧に無い箇所の指摘 | 実在しない行を根拠にしない |
| 「影響なし」という結論 | 見つからなかったことと、使っていないことは違う |
| 修正のコードの作成 | 直し方の方針までにとどめる。コードは担当者が書く |
| 範囲外の版の変更の判定 | 範囲はプログラムが切り出したものだけ |
3行目が、この構成でいちばん大事な線引きです。 no_usage_found は「一覧に見つからなかった」という事実で、「影響なし」とは書かせません。 一覧は静的な解析なので、文字列から組み立てた読み込みや、設定ファイルで名前を指定する使い方は漏れます。
指示内容を固定する
あなたは社内の開発チームで、依存パッケージの更新を取り込めるかを
判断する担当者を手伝う立場です。
渡された変更履歴の変更1つずつについて、自社のコードの使い方に
当たるかを判定してください。更新を取り込むかどうかは書かないでください。
【判定の選び方】
- affects ........ 変更の対象(関数・クラス・オプション・既定の動作)を、
使い方の一覧の行で使っている
- no_usage_found . 変更の対象が、使い方の一覧に見つからない
- unknown ........ 判定できない。変更の文があいまい、動的な読み込み、
設定ファイルでの指定などで一覧から判断できない
- not_breaking ... 機能の追加や不具合の修正で、既存の使い方を変えない
迷ったときは unknown を選んでください。
【厳守事項】
- usage_refs には、使い方の一覧に載っている file と line だけを書いてください。
一覧に無い箇所を挙げないでください。
- no_usage_found を「影響なし」と言い換えないでください。
- change_quote には、変更履歴の文を一字一句そのまま写してください。
- 既定の動作の変更(default を変えた、挙動を変えた)は、その関数を
使っていれば、引数を指定していても affects にしてください。
指定の内容で影響が無いと言えるときだけ、理由を書いたうえで no_usage_found にしてください。
- テストのログに出た非推奨の警告と対応する変更があれば、warning_match に警告の文を写してください。
- fix_hint には、直し方の方針を1〜2文で書いてください。コードは書かないでください。
- 渡された範囲の外の版について書かないでください。
【パッケージ】{name} {previous_version} → {new_version}({update_type})
【範囲内の変更(版番号付き)】{changes}
【自社のコードの使い方の一覧(file、line、名前、前後の行、source)】{usages}
【テストのログの非推奨の警告】{warnings}
「既定の動作の変更は、使っていれば affects」を明記しないと、引数を渡している箇所を外します。 既定の値が変わっても、明示的に値を渡していれば影響はありません。しかし、渡しているのが別の引数なら影響を受けます。 その見分けを人に回すために、まず affects に寄せます。
change_quote を一字一句で写させるのは、後で照らすためです。 プログラムで変更履歴の原文と照らし、一致しない行は判定から外します。
出力形式を固定する
Claude API の構造化出力で、次の形のJSONを受け取ります。
{
"package": "",
"previous_version": "",
"new_version": "",
"findings": [
{
"version": "",
"change_quote": "",
"kind": "breaking | deprecation | default_change | other",
"verdict": "affects | no_usage_found | unknown | not_breaking",
"usage_refs": [ { "file": "", "line": 0 } ],
"warning_match": "",
"fix_hint": "",
"reason": ""
}
]
}
1つ目の理由は、usage_refs をプログラムで照らせることです。 書かれた file と line が使い方の一覧にあるかを確かめ、無いものは判定ごと unknown に落とします。
ワークフローは、判定とテストの結果から、次の規則で可否の区分を決めます。
| 区分 | 条件 | ラベル |
|---|---|---|
| 要修正 | affects が1つ以上 | deps:needs-fix |
| 要確認 | affects が無く、unknown が1つ以上、または範囲の切り出しができなかった | deps:needs-review |
| 取り込み候補 | 判定がすべて no_usage_found か not_breaking で、テストが成功 | deps:candidate |
| 保留 | テストが失敗 | deps:tests-failed |
deps:candidate でも、自動では取り込みません。 担当者がコメントを流し見て取り込みます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| Dependabot | dependabot.yml の schedule・groups | 毎月の更新のプルリクエスト |
| GitHub Actions | pull_request のワークフロー | 判定の処理を動かす |
dependabot/fetch-metadata | ワークフローの手順 | 更新の情報 |
| GitHub の REST API | リポジトリの内容とリリースの取得 | 変更履歴とリリースノート |
| Claude API | Messages API の構造化出力 | 変更ごとの判定 |
| プルリクエスト | コメントとラベル | 判定の一覧と可否の区分 |
dependabot.yml とワークフローの骨組みは、次のようになります。
# .github/dependabot.yml(抜粋)
updates:
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "monthly"
groups:
minor-and-patch:
update-types: ["minor", "patch"]
# .github/workflows/deps-impact.yml(抜粋)
on: pull_request
permissions:
contents: read
pull-requests: write
jobs:
impact:
if: github.event.pull_request.user.login == 'dependabot[bot]'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- id: meta
uses: dependabot/fetch-metadata@v3
- run: python tools/deps_impact.py
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} # Dependabot のシークレット
UPDATED: ${{ steps.meta.outputs.updated-dependencies-json }}
deps_impact.py が範囲の切り出し、使い方の一覧、判定の呼び出し、照合、区分の決定までを行い、最後にコメントとラベルを付けます。 テストの結果を待つ場合は、テストのジョブの後に動くよう needs でつなぎます。
コメントには、affects と unknown の行を先頭に置き、変更の文・使っている行へのリンク・直し方の方針を表で並べます。no_usage_found と not_breaking は折りたたんで後ろに置きます。
人が確認する
affectsの行を開く … 使っている行と変更の文を見比べ、本当に直す必要があるかを決めますunknownの理由を読む … 動的な読み込みや設定での指定なら、該当の箇所を自分で探します- 範囲の切り出しができなかったパッケージを読む … 変更履歴が無い、版の節が見つからないものは、人が読みます
- 取り込むか、直してから取り込むか、保留にするかを決める … 保留にするときは、理由をコメントに残します
- 判定を覆したら記録する …
no_usage_foundだったのに影響があった場合は、使い方の一覧の作り方を見直す材料にします
5番目を省かないでください。 判定の漏れの多くは、AIではなく使い方の一覧の漏れから起きます。どんな使い方が一覧から漏れたかを集めると、集め方を直せます。
目標は、120件をならして1件6分です。 deps:candidate は数十秒で流し見て、affects と unknown に時間を使います。
例外に対処する
| 起きること | 対応 |
|---|---|
| パッケージのリポジトリが分からない | deps:needs-review。人がリポジトリを探して登録する |
| CHANGELOG が無い・版の節が見つからない | リリースノートだけで判定し、範囲の切り出しの失敗を記録する |
| 範囲内の版が多すぎて長い | 版ごとに分けて判定し、結果をまとめる |
usage_refs が一覧に無い | 判定を unknown に落とし、ログに残す |
change_quote が原文と一致しない | その判定を外し、ログに残す |
構造化出力が refusal や max_tokens で終わる | 受け付けず、版ごとに分けて再実行 |
| Dependabot のシークレットが設定されていない | 判定を出さず、設定の不備としてコメントする |
| 0.y.z の版のマイナーの更新 | メジャーと同じ扱いで判定する |
記録を残す
- プルリクエストの番号、パッケージ、更新前と更新後の版、更新の種類
- 切り出した変更の範囲と、取得した変更履歴の場所
- 使い方の一覧(集めた方法の印を含む)
- Claude API の出力と、そのとき使った指示の版
- 照合で外した判定と、その理由
- 可否の区分と、担当者の最終の決定、覆した判定
最後の行が、仕組みを育てる材料です。 覆した判定が多いパッケージは、使い方が特殊か、変更履歴の書き方が独特です。 パッケージごとの注意書きを足していきます。
04実装レベルの3段階
半自動化で、1件20分が10分程度になります。 スクリプトを手で動かし、結果をプルリクエストに貼る作業が残ります。本格構成で6分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化の1か月で、範囲を切り出せないパッケージと、使い方の一覧から漏れる書き方が分かります。それを直してからワークフローに組み込むほうが、unknown だらけのコメントで担当者に見放されずに済みます。
05工数削減シミュレーション
導入後 120件 × 6分 ÷ 60 = 12 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 社内システムや自社サービスを内製し、GitHub のリポジトリが十数ある開発組織で、Dependabot の更新のプルリクエストを月に1回まとめて処理している場合。テストは通るが、変更履歴を読んで自社のコードに当たる変更かを確かめる作業が詳しい数名に偏り、更新が後回しになって溜まっている場合。GitHub Actions を使える場合。
- 依存パッケージが数十に収まり、担当者が変更履歴を読んでも負担にならない場合。自動テストがほとんど無く、更新後の動作をテストで確かめられない場合(先にテストの整備が要ります)。ソースコードの一部であっても外部の生成AIのAPIに送ることが社内の規程で認められていない場合。なお、更新を取り込むかどうかの決定と、更新後の動作の確認は、この構成では代替できません。
07最小構成で試す方法
- 過去3か月の更新のプルリクエストから、メジャーの更新を5件、まとめたマイナーの更新を5件選ぶ(取り込んだ後に不具合が出たものを含める)
- 1件ずつ、更新の範囲の変更履歴を手で切り出し、自社のコードの該当パッケージの読み込みと呼び出しを検索して一覧にする
- 手元のAIサービスに変更履歴と一覧を渡し、「変更1つずつについて、一覧の行で使っているかを判定し、使っている行を挙げてください。一覧に無い行は挙げないでください。見つからないことを影響なしと書かないでください」と指示する
- 出てきた判定を、当時の担当者の判断と、取り込んだ後に起きたことと比べる
| 出てきた内容 | 判断 |
|---|---|
後で不具合になった変更が affects に出た | ワークフローに組み込む |
| 一覧に無い行を挙げた | 指示と後段の照合で直る。構成は有効 |
| 一覧の漏れで当たる箇所が拾えなかった | 使い方の一覧の作り方を先に直す |
3行目が出たときは、AIより先に一覧の作り方を見直します。 第7章で一覧をプログラムで作るのは、ここを確かめながら直せるようにするためです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 見つからないことを「影響なし」と書く | 判定の値を no_usage_found に限り、言い換えを禁じる |
| 使い方の一覧に無い行を挙げる | usage_refs を一覧と照らし、無いものは unknown に落とす |
| 範囲を読み違える | 版の比較をプログラムで行い、切り出した範囲を記録する |
| ワークフローで API のキーが使えない | Dependabot のシークレットに置く。GitHub Actions のシークレットは使えない |
| コメントが書けない | 既定のトークンは読み取り専用。permissions で書き込みを足す |
| 0.y.z の更新を軽く見る | 更新の種類にかかわらずメジャーと同じ扱いにする |
| 大きな CHANGELOG が取れない | raw の形式で取る |
| 同じ名前の別物を拾う | 構文木で読み込みからたどる |
上の2行が、この構成の失敗のほとんどです。 どちらも、判定の根拠を「実在する行」に縛れているかの問題です。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 自社のソースコードのうち、依存パッケージを使っている行と前後数行、テストのログです。顧客の情報は扱いませんが、ソースコードは会社の資産です。
- 外部に送る範囲を、使い方の一覧に限る … ソースコード全体ではなく、該当の行と前後数行だけを送ります。送ってよい範囲を社内の規程と照らして決めます
- 秘密情報を伏せてから送る … 前後の行に鍵やパスワードらしい文字列があれば伏せます
- シークレットの置き場所を分ける … Claude API のキーは Dependabot のシークレットに置き、使えるワークフローを限ります
pull_request_targetで中身を動かさない … 秘密情報のある環境で、プルリクエストのコードを実行しない形にします- 取り込みの決定は人が行う … 自動で取り込む設定にしません。判定の誤りは、取り込んだ後の障害につながります
誤りが起きた場合のリスクは、影響のある更新を取り込むことと、ソースコードの一部が外に出ることの2つです。 前者は根拠の照合と人の確認で、後者は送る範囲の限定で防ぎます。
10まず何から始めるか
1週目:使い方の一覧を作る
主な言語1つ(例:Python)について、パッケージの読み込みと呼び出しを集めるスクリプトを書きます。リポジトリ1つで動かし、担当者が「この一覧なら漏れが無い」と言えるかを見ます。
2週目:10件で試す
過去の更新のプルリクエストから10件を選び、範囲を切り出して手元のAIで判定させます。取り込んだ後に不具合が出た更新が affects に出るかを最優先で見ます。
3週目:範囲の切り出しを作る
CHANGELOG とリリースノートを取り、版の範囲を切り出すスクリプトを作ります。切り出せなかったパッケージを一覧にし、見出しの書き方の例外を足します。
4週目:ワークフローにつなぐ
Dependabot のプルリクエストを起点に、判定とコメントまでを動かします。この時点では可否の区分のラベルを付けず、判定の一覧だけを出します。
2か月目: 可否の区分の規則とラベルを足し、2つ目の言語に広げます。3か月目以降: 覆した判定を集めて使い方の一覧の作り方を直し、1件20分が何分になったかを実測します。翌月へ回る更新が無くなった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 取り込む前にプルリクエストの本文に含まれる変更履歴とリリースノートを確かめるよう案内されていること、バージョン更新に既定で3日のクールダウンがあること | GitHub Docs: About Dependabot version updates | 2026-10-13 |
schedule.interval に daily〜yearly と cron があること、groups の update-types(major・minor・patch)と patterns、open-pull-requests-limit の既定が5であること | GitHub Docs: Dependabot options reference | 2026-10-13 |
dependabot/fetch-metadata が更新されたパッケージの名前・更新前と更新後の版・更新の種類・依存の種類・グループ名を出力すること、Dependabot が起点の pull_request のワークフローは読み取り専用のトークンで動くこと | dependabot/fetch-metadata README | 2026-10-13 |
Dependabot が起点のワークフローで使える秘密情報は Dependabot のシークレットだけであること、トークンが既定で読み取り専用で permissions で広げられること、pull_request_target を使う二段階の手順があること | GitHub Docs: Troubleshooting Dependabot on GitHub Actions | 2026-10-13 |
リポジトリの内容の取得の ref、raw の形式、1MBを超えるファイルは raw か object の形式でだけ取れること | GitHub Docs: Repository contents | 2026-10-13 |
| タグ名でリリースを取得する API と、リリースの一覧の API | GitHub Docs: Releases | 2026-10-13 |
| メジャーは互換性の無い変更、マイナーは後方互換の機能追加、パッチは後方互換の不具合修正であること、0.y.z は初期の開発のためでいつ何が変わってもよいこと | Semantic Versioning 2.0.0 | 2026-10-13 |
構造化出力を output_config.format で指定すること、refusal・max_tokens で終わるとスキーマに合わないことがあること | Claude: Structured outputs | 2026-10-13 |
更新を取り込むかどうかと、更新後の動作の確認は、各リポジトリの担当者が行ってください。 本記事は上の公開情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1421)についてのご相談はこちらから。
