Media > AI活用ユースケース > 情報システム > 毎月の依存パッケージの更新で、変更履歴を自社のコードでの使い方と照らし、破壊的変更・非推奨に当たるかを判定して、更新の可否と直す箇所の一覧を作る

毎月の依存パッケージの更新で、変更履歴を自社のコードでの使い方と照らし、破壊的変更・非推奨に当たるかを判定して、更新の可否と直す箇所の一覧を作る

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

毎月の依存パッケージの更新で、Dependabot のプルリクエストごとに、更新の範囲の変更履歴とリリースノートを読ませます。破壊的変更・非推奨が自社のコードでの使い方に当たるかを判定し、更新の可否と直す箇所の一覧をプルリクエストに書き込みます。

サマリー
生成AI
ChatGPT/Claude/Gemini
連携・自動化
Python
対象業界
EC/IT・SaaS/金融
対象部門
情報システム
対象業務
内容確認・チェック/比較検討
主な課題
判断に時間がかかる/属人化している/確認ミスが多い
AIで行う処理
判定
主な効果
判断支援/属人化解消/工数削減
導入難易度
★★★★☆
実装レベル
本格構成
費用感
API連携(中)
人間の確認
条件付き
現在工数
40h/月
AI導入後
12h/月
想定削減
70%
年間削減
336h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. 月初に Dependabot が更新のプルリクエストを作る。自動テストが走る
  2. 担当者がプルリクエストを開き、どのパッケージがどの版からどの版へ上がるかを確かめる
  3. プルリクエストの本文のリリースノートと変更履歴を読む。足りなければパッケージのリポジトリを開いて CHANGELOG を読む
  4. 更新の範囲(例:4.2.1 から 4.6.0)に含まれる版の変更から、破壊的変更・非推奨・既定の動作の変更を拾う
  5. 拾った変更に関係する関数・オプションを、自社のコードで検索する
  6. 当たる箇所があれば直すかどうかを決め、プルリクエストにコメントを書く
  7. 取り込むか、保留にするかを決める
導入後(After)
  1. 自動月初に Dependabot が更新のプルリクエストを作り、自動テストと並んで判定のワークフローが動く
  2. 自動プルリクエストから、パッケージの名前・更新前と更新後の版・更新の種類(メジャー・マイナー・パッチ)を取り出す
  3. 自動パッケージのリポジトリから変更履歴とリリースノートを取り、更新の範囲の版だけを切り出す
  4. 自動自社のコードから、そのパッケージを読み込んでいる箇所と、使っている関数・オプションの一覧を作る
  5. 自動Claude API が、範囲内の変更ごとに、自社の使い方に当たるかを `affects`/`no_usage_found`/`unknown` で判定し、根拠の文と行を付ける
  6. 自動ワークフローが、判定とテストの結果から、更新の可否の区分を規則で決める
  7. 自動判定の一覧と直す箇所をプルリクエストにコメントで書き、区分のラベルを付ける
  8. 人担当者が `affects` と `unknown` の行を確かめ、取り込むか、直してから取り込むか、保留にするかを決める
各工程の詳しい説明を読む
  1. 月初に Dependabot が更新のプルリクエストを作る。自動テストが走る
  2. 担当者がプルリクエストを開き、どのパッケージがどの版からどの版へ上がるかを確かめる
  3. プルリクエストの本文のリリースノートと変更履歴を読む。足りなければパッケージのリポジトリを開いて CHANGELOG を読む
  4. 更新の範囲(例:4.2.1 から 4.6.0)に含まれる版の変更から、破壊的変更・非推奨・既定の動作の変更を拾う
  5. 拾った変更に関係する関数・オプションを、自社のコードで検索する
  6. 当たる箇所があれば直すかどうかを決め、プルリクエストにコメントを書く
  7. 取り込むか、保留にするかを決める

(a)範囲を読み違える。 変更履歴は新しい版から順に書かれ、どこからどこまでが今回の範囲かを自分で区切る必要があります。 間の版の変更を読み飛ばすと、4.3.0 で入った既定の動作の変更を見落とします。

(b)テストが通ると安心してしまう。 自動テストは、テストを書いた箇所しか確かめません。非推奨の警告はテストを落とさず、次のメジャーで消えるまで気づかれません。

(c)検索が担当者の勘に頼る。 変更履歴の「timeout オプションの単位をミリ秒に変えた」から、自社のコードの何を検索すればよいかは、パッケージに詳しい人にしか分かりません。検索しなかったことと、検索して見つからなかったことが、記録の上で区別されません。

(d)グループのプルリクエストが重い。 マイナーとパッチをまとめたプルリクエストには十数のパッケージが入ります。1つずつ変更履歴を読むと1時間を超え、後回しにされます。

  1. 【自動】 月初に Dependabot が更新のプルリクエストを作り、自動テストと並んで判定のワークフローが動く
  2. 【自動】 プルリクエストから、パッケージの名前・更新前と更新後の版・更新の種類(メジャー・マイナー・パッチ)を取り出す
  3. 【自動】 パッケージのリポジトリから変更履歴とリリースノートを取り、更新の範囲の版だけを切り出す
  4. 【自動】 自社のコードから、そのパッケージを読み込んでいる箇所と、使っている関数・オプションの一覧を作る
  5. 【自動】 Claude API が、範囲内の変更ごとに、自社の使い方に当たるかを affects/no_usage_found/unknown で判定し、根拠の文と行を付ける
  6. 【自動】 ワークフローが、判定とテストの結果から、更新の可否の区分を規則で決める
  7. 【自動】 判定の一覧と直す箇所をプルリクエストにコメントで書き、区分のラベルを付ける
  8. 【人】 担当者が 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どうやって実装するのか

Step1

処理の起点を決める

Dependabot がプルリクエストを作ったときの pull_request を起点にします。 ワークフローの条件で、作成者が Dependabot のときだけ動かします。自動テストと同じタイミングで並んで動き、テストの結果が出た後に可否の区分を決めます。

pull_request_target は使いません。 公式の説明では、Dependabot の制限を避ける方法として pull_request_target を使う二段階の手順も挙げられていますが、秘密情報のある環境でプルリクエストの中身を扱う形になるので、この構成では避けます。 判定に要るのは変更履歴と自社のコードの読み取りだけで、書き込みはコメントとラベルに限られるため、pull_request で足ります。

Dependabot が既存のプルリクエストを新しい版で作り直したときも、同じ起点で動きます。前回の判定のコメントは消さずに「古い判定」と印を付け、新しい判定を足します。

Step2

入力データを集める

データ中身取得元
更新の情報パッケージの名前、更新前と更新後の版、更新の種類、依存の種類、グループ名dependabot/fetch-metadata の出力
変更履歴パッケージのリポジトリの CHANGELOG(Markdown)GitHub の REST API(リポジトリの内容の取得)
リリースノート範囲内の各版のリリースの本文GitHub の REST API(タグ名でリリースを取得)
自社のコードの使い方そのパッケージを読み込んでいるファイル、使っている関数・クラス・オプション、行番号と前後数行プルリクエストのブランチを読んで Python で作る
テストの結果自動テストの成否、新しく出た非推奨の警告同じプルリクエストのテストのジョブ

質を決めるのは、4行目の使い方の一覧です。 変更履歴の判定は、照らす相手が正確でなければ意味がありません。一覧はプログラムで機械的に作り、AIに探させません。

5行目の非推奨の警告は、テストのログから拾います。 テストは通っていても、更新後に新しい警告が出ていれば、それは変更履歴の非推奨と対応しているはずです。判定のときに、警告の文も一緒に渡します。

Step3

データの取得方法を決める

取るもの方法注意
パッケージのリポジトリパッケージの登録情報からリポジトリの場所を引く場所が登録されていないパッケージは unknown
CHANGELOGGET /repos/{owner}/{repo}/contents/{path}、ref に更新後の版のタグ1MBを超えるファイルは raw の形式でだけ取れる
リリースノートGET /repos/{owner}/{repo}/releases/tags/{tag}範囲内の版ごとに取る
使い方の一覧Python で読み込みの文と呼び出しを集める下の表

CHANGELOG を取るときは、application/vnd.github.raw+json を指定して本文をそのまま受け取ります。 大きな CHANGELOG を持つパッケージは珍しくなく、1MBを超えるとこの形式でしか取れません。

使い方の一覧は、言語ごとに次のように作ります。

言語集めるもの方法
Pythonimport・from ... import の文と、読み込んだ名前の呼び出し標準の ast で構文木を読む
TypeScriptimport の文と、読み込んだ名前の呼び出し・オプションのキー構文の解析器で読む。読めないファイルは文字列の検索に落とす
設定ファイルパッケージ名やオプション名が書かれた行文字列の検索

構文木で読むのは、文字列の検索だと同じ名前の別物を拾うからです。 parse という名前は、どのパッケージにもあります。読み込んだ名前から呼び出しをたどれば、そのパッケージの parse だけを拾えます。 構文木で読めなかったファイルと、文字列の検索で拾った行は、source: "text_search" と印を付けて区別します。

Step4

AIへ渡す前に整形する

  1. 範囲の切り出し … CHANGELOG の見出しから版の番号を読み、更新前より新しく更新後以下の版の節だけを残します
  2. 版の並びの確認 … 見出しの版が飛んでいないか、リリースの一覧と照らします。範囲内の版の節が見つからなければ、そのことを記録します
  3. 変更の分割 … 節の中の箇条を1つずつに分け、版番号を付けます
  4. 使い方の一覧の圧縮 … 同じ呼び出しが多数あるときは、ファイルごとの代表の行と件数にまとめます
  5. 秘密情報の除去 … 前後数行に鍵やパスワードらしい文字列があれば伏せます
  6. 0.y.z の印 … 更新前か更新後の版が 0 から始まるときは、印を付けます

1番目と2番目を、AIに任せずにプログラムで行うのが要点です。 範囲の読み違い(第3章の(a))は、人でもAIでも起きます。版の番号の比較は機械で確実にでき、どの節を渡したかが記録に残ります。

6番目は、SemVer の取り決めによるものです。 メジャーの版は互換性の無い変更で上げることになっていますが、0.y.z は初期の開発のための版で、いつ何が変わってもよいとされています。 0 から始まる版はマイナーの更新でも破壊的変更がありうるので、更新の種類にかかわらずメジャーと同じ扱いにします。

Step5

AIに処理させる

させるのは、範囲内の変更1つずつについて、自社の使い方に当たるかを判定し、根拠を組で示すことです。

判定意味根拠に付けるもの
affects変更の対象を、自社のコードで使っている変更の文と、使っている行(ファイルと行番号)
no_usage_found変更の対象が、使い方の一覧に見つからない変更の文と、照らした名前
unknown判定できない(動的な読み込み、設定での指定、変更の文があいまい)判定できない理由
not_breaking変更が機能の追加や不具合の修正で、使い方を変えない変更の文
させないこと理由
更新の可否の決定規則とテストの結果で決め、人が確かめる
使い方の一覧に無い箇所の指摘実在しない行を根拠にしない
「影響なし」という結論見つからなかったことと、使っていないことは違う
修正のコードの作成直し方の方針までにとどめる。コードは担当者が書く
範囲外の版の変更の判定範囲はプログラムが切り出したものだけ

3行目が、この構成でいちばん大事な線引きです。 no_usage_found は「一覧に見つからなかった」という事実で、「影響なし」とは書かせません。 一覧は静的な解析なので、文字列から組み立てた読み込みや、設定ファイルで名前を指定する使い方は漏れます。

Step6

指示内容を固定する

あなたは社内の開発チームで、依存パッケージの更新を取り込めるかを
判断する担当者を手伝う立場です。
渡された変更履歴の変更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 を一字一句で写させるのは、後で照らすためです。 プログラムで変更履歴の原文と照らし、一致しない行は判定から外します。

Step7

出力形式を固定する

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 でも、自動では取り込みません。 担当者がコメントを流し見て取り込みます。

Step8

システムへ連携する

つなぎ先方式内容
Dependabotdependabot.yml の schedule・groups毎月の更新のプルリクエスト
GitHub Actionspull_request のワークフロー判定の処理を動かす
dependabot/fetch-metadataワークフローの手順更新の情報
GitHub の REST APIリポジトリの内容とリリースの取得変更履歴とリリースノート
Claude APIMessages 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 は折りたたんで後ろに置きます。

Step9

人が確認する

  1. affects の行を開く … 使っている行と変更の文を見比べ、本当に直す必要があるかを決めます
  2. unknown の理由を読む … 動的な読み込みや設定での指定なら、該当の箇所を自分で探します
  3. 範囲の切り出しができなかったパッケージを読む … 変更履歴が無い、版の節が見つからないものは、人が読みます
  4. 取り込むか、直してから取り込むか、保留にするかを決める … 保留にするときは、理由をコメントに残します
  5. 判定を覆したら記録する … no_usage_found だったのに影響があった場合は、使い方の一覧の作り方を見直す材料にします

5番目を省かないでください。 判定の漏れの多くは、AIではなく使い方の一覧の漏れから起きます。どんな使い方が一覧から漏れたかを集めると、集め方を直せます。

目標は、120件をならして1件6分です。 deps:candidate は数十秒で流し見て、affects と unknown に時間を使います。

Step10

例外に対処する

起きること対応
パッケージのリポジトリが分からないdeps:needs-review。人がリポジトリを探して登録する
CHANGELOG が無い・版の節が見つからないリリースノートだけで判定し、範囲の切り出しの失敗を記録する
範囲内の版が多すぎて長い版ごとに分けて判定し、結果をまとめる
usage_refs が一覧に無い判定を unknown に落とし、ログに残す
change_quote が原文と一致しないその判定を外し、ログに残す
構造化出力が refusal や max_tokens で終わる受け付けず、版ごとに分けて再実行
Dependabot のシークレットが設定されていない判定を出さず、設定の不備としてコメントする
0.y.z の版のマイナーの更新メジャーと同じ扱いで判定する
Step11

記録を残す

  • プルリクエストの番号、パッケージ、更新前と更新後の版、更新の種類
  • 切り出した変更の範囲と、取得した変更履歴の場所
  • 使い方の一覧(集めた方法の印を含む)
  • Claude API の出力と、そのとき使った指示の版
  • 照合で外した判定と、その理由
  • 可否の区分と、担当者の最終の決定、覆した判定

最後の行が、仕組みを育てる材料です。 覆した判定が多いパッケージは、使い方が特殊か、変更履歴の書き方が独特です。 パッケージごとの注意書きを足していきます。

04実装レベルの3段階

最小構成:変更履歴と使い方の一覧を手で作り、手元のAIで判定させる / 1件ごとの判定
半自動化:上記+範囲の切り出しと使い方の一覧をスクリプトで作り、判定を API で呼ぶ / 読む・探す・照らすの大半
本格構成:上記+Dependabot のプルリクエストを起点に自動で動かし、可否の区分とコメント・ラベルまで付ける / 判定から担当者への提示まで

半自動化で、1件20分が10分程度になります。 スクリプトを手で動かし、結果をプルリクエストに貼る作業が残ります。本格構成で6分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化の1か月で、範囲を切り出せないパッケージと、使い方の一覧から漏れる書き方が分かります。それを直してからワークフローに組み込むほうが、unknown だらけのコメントで担当者に見放されずに済みます。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
6 名
月間件数
120 件
1件あたり現在時間
20 分
1件あたり導入後時間
6 分
現在  120件 × 20分 ÷ 60 = 40 時間/月
導入後 120件 × 6分 ÷ 60 = 12 時間/月
月間削減時間
28h
削減率
70%
年間削減時間
336h
年間金額換算(時間単価4,500円)
151万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. 社内システムや自社サービスを内製し、GitHub のリポジトリが十数ある開発組織で、Dependabot の更新のプルリクエストを月に1回まとめて処理している場合。テストは通るが、変更履歴を読んで自社のコードに当たる変更かを確かめる作業が詳しい数名に偏り、更新が後回しになって溜まっている場合。GitHub Actions を使える場合。
向いていない
  1. 依存パッケージが数十に収まり、担当者が変更履歴を読んでも負担にならない場合。自動テストがほとんど無く、更新後の動作をテストで確かめられない場合(先にテストの整備が要ります)。ソースコードの一部であっても外部の生成AIのAPIに送ることが社内の規程で認められていない場合。なお、更新を取り込むかどうかの決定と、更新後の動作の確認は、この構成では代替できません。

07最小構成で試す方法

  1. 過去3か月の更新のプルリクエストから、メジャーの更新を5件、まとめたマイナーの更新を5件選ぶ(取り込んだ後に不具合が出たものを含める)
  2. 1件ずつ、更新の範囲の変更履歴を手で切り出し、自社のコードの該当パッケージの読み込みと呼び出しを検索して一覧にする
  3. 手元のAIサービスに変更履歴と一覧を渡し、「変更1つずつについて、一覧の行で使っているかを判定し、使っている行を挙げてください。一覧に無い行は挙げないでください。見つからないことを影響なしと書かないでください」と指示する
  4. 出てきた判定を、当時の担当者の判断と、取り込んだ後に起きたことと比べる
出てきた内容判断
後で不具合になった変更が affects に出たワークフローに組み込む
一覧に無い行を挙げた指示と後段の照合で直る。構成は有効
一覧の漏れで当たる箇所が拾えなかった使い方の一覧の作り方を先に直す

3行目が出たときは、AIより先に一覧の作り方を見直します。 第7章で一覧をプログラムで作るのは、ここを確かめながら直せるようにするためです。

08実装時につまずきやすいポイント

問題対策
見つからないことを「影響なし」と書く判定の値を no_usage_found に限り、言い換えを禁じる
使い方の一覧に無い行を挙げるusage_refs を一覧と照らし、無いものは unknown に落とす
範囲を読み違える版の比較をプログラムで行い、切り出した範囲を記録する
ワークフローで API のキーが使えないDependabot のシークレットに置く。GitHub Actions のシークレットは使えない
コメントが書けない既定のトークンは読み取り専用。permissions で書き込みを足す
0.y.z の更新を軽く見る更新の種類にかかわらずメジャーと同じ扱いにする
大きな CHANGELOG が取れないraw の形式で取る
同じ名前の別物を拾う構文木で読み込みからたどる

上の2行が、この構成の失敗のほとんどです。 どちらも、判定の根拠を「実在する行」に縛れているかの問題です。

09セキュリティ・AIガバナンス上の注意点

この構成で扱うデータ: 自社のソースコードのうち、依存パッケージを使っている行と前後数行、テストのログです。顧客の情報は扱いませんが、ソースコードは会社の資産です。

  1. 外部に送る範囲を、使い方の一覧に限る … ソースコード全体ではなく、該当の行と前後数行だけを送ります。送ってよい範囲を社内の規程と照らして決めます
  2. 秘密情報を伏せてから送る … 前後の行に鍵やパスワードらしい文字列があれば伏せます
  3. シークレットの置き場所を分ける … Claude API のキーは Dependabot のシークレットに置き、使えるワークフローを限ります
  4. pull_request_target で中身を動かさない … 秘密情報のある環境で、プルリクエストのコードを実行しない形にします
  5. 取り込みの決定は人が行う … 自動で取り込む設定にしません。判定の誤りは、取り込んだ後の障害につながります

誤りが起きた場合のリスクは、影響のある更新を取り込むことと、ソースコードの一部が外に出ることの2つです。 前者は根拠の照合と人の確認で、後者は送る範囲の限定で防ぎます。

10まず何から始めるか

1週目:使い方の一覧を作る

主な言語1つ(例:Python)について、パッケージの読み込みと呼び出しを集めるスクリプトを書きます。リポジトリ1つで動かし、担当者が「この一覧なら漏れが無い」と言えるかを見ます。

2週目:10件で試す

過去の更新のプルリクエストから10件を選び、範囲を切り出して手元のAIで判定させます。取り込んだ後に不具合が出た更新が affects に出るかを最優先で見ます。

3週目:範囲の切り出しを作る

CHANGELOG とリリースノートを取り、版の範囲を切り出すスクリプトを作ります。切り出せなかったパッケージを一覧にし、見出しの書き方の例外を足します。

4週目:ワークフローにつなぐ

Dependabot のプルリクエストを起点に、判定とコメントまでを動かします。この時点では可否の区分のラベルを付けず、判定の一覧だけを出します。

2か月目: 可否の区分の規則とラベルを足し、2つ目の言語に広げます。3か月目以降: 覆した判定を集めて使い方の一覧の作り方を直し、1件20分が何分になったかを実測します。翌月へ回る更新が無くなった時点で、この構成は完成です。


11関連ユースケース

12この仕組みを理解するための記事

13技術仕様の確認日・参考情報

技術仕様確認日:2026-10-13/最終更新:2026-10-14
確認した内容情報源確認日
取り込む前にプルリクエストの本文に含まれる変更履歴とリリースノートを確かめるよう案内されていること、バージョン更新に既定で3日のクールダウンがあることGitHub Docs: About Dependabot version updates2026-10-13
schedule.interval に daily〜yearly と cron があること、groups の update-types(major・minor・patch)と patterns、open-pull-requests-limit の既定が5であることGitHub Docs: Dependabot options reference2026-10-13
dependabot/fetch-metadata が更新されたパッケージの名前・更新前と更新後の版・更新の種類・依存の種類・グループ名を出力すること、Dependabot が起点の pull_request のワークフローは読み取り専用のトークンで動くことdependabot/fetch-metadata README2026-10-13
Dependabot が起点のワークフローで使える秘密情報は Dependabot のシークレットだけであること、トークンが既定で読み取り専用で permissions で広げられること、pull_request_target を使う二段階の手順があることGitHub Docs: Troubleshooting Dependabot on GitHub Actions2026-10-13
リポジトリの内容の取得の ref、raw の形式、1MBを超えるファイルは raw か object の形式でだけ取れることGitHub Docs: Repository contents2026-10-13
タグ名でリリースを取得する API と、リリースの一覧の APIGitHub Docs: Releases2026-10-13
メジャーは互換性の無い変更、マイナーは後方互換の機能追加、パッチは後方互換の不具合修正であること、0.y.z は初期の開発のためでいつ何が変わってもよいことSemantic Versioning 2.0.02026-10-13
構造化出力を output_config.format で指定すること、refusal・max_tokens で終わるとスキーマに合わないことがあることClaude: Structured outputs2026-10-13

更新を取り込むかどうかと、更新後の動作の確認は、各リポジトリの担当者が行ってください。 本記事は上の公開情報で確認できた範囲だけを扱っています。

実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-1421)についてのご相談はこちらから。

AI活用について相談する
目次