社内システムが使うOSSのライブラリのリリースをエージェントが毎週見回り、影響のある変更・サポート終了・必要な対応を開発の担当に届ける
社内システムが依存するOSSのライブラリと実行環境のリリースを、エージェントが毎週見回ります。変更履歴から破壊的変更・非推奨・サポート終了を取り出し、依存の台帳とコードの使用箇所に照らして、影響するリポジトリと対応の候補を開発の担当に届けます。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Make/n8n/Power Automate/Zapier
- 対象業界
- EC/IT・SaaS/小売/金融
- 対象部門
- 情報システム
- 対象業務
- 内容確認・チェック/情報検索
- 主な課題
- 属人化している/情報が見つからない/期限・対応漏れが起きる
- AIで行う処理
- エージェント
- 主な効果
- 属人化解消/工数削減/機会損失防止
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 各チームの当番が毎週月曜に、Dependabot のプルリクエストと、ライブラリの GitHub のリリースの一覧を開く
- 新しいリリースの変更履歴を読み、破壊的変更・非推奨・サポート終了の記載を書き出す
- 書き出した変更について、自社のコードで該当する関数や設定を使っているかを、リポジトリを検索して確かめる
- 実行環境(Node.js、Python など)のサポート終了の日付を、提供元のページで確かめる
- 対応が要るものを課題管理に起票し、担当チームに知らせる
- 自動毎週月曜の朝6時にワークフローが動き、各リポジトリの依存の一覧(SBOM)を取り直して、依存の台帳を作り直す
- 自動台帳に載ったライブラリの GitHub のリリースを取り、前回までに取ったものと比べて新しいリリースだけを拾う
- 自動台帳に載った実行環境について、サポート終了の日付を取る
- 【AI】 エージェントがリリースの本文から変更を種類別に取り出し、依存の台帳とコードの検索を引いて、影響するリポジトリと対応の候補を挙げる
- 自動急ぎの度合いを規則で付け、チームごとに分けて社内チャットへ届ける。影響の無かったリリースは件数と名前だけをまとめる
- 人各チームの当番が候補を確かめ、対応が要るものを課題管理に起票する
- 人更新の時期と方法は、各チームが決める
各工程の詳しい説明を読む
- 各チームの当番が毎週月曜に、Dependabot のプルリクエストと、ライブラリの GitHub のリリースの一覧を開く
- 新しいリリースの変更履歴を読み、破壊的変更・非推奨・サポート終了の記載を書き出す
- 書き出した変更について、自社のコードで該当する関数や設定を使っているかを、リポジトリを検索して確かめる
- 実行環境(Node.js、Python など)のサポート終了の日付を、提供元のページで確かめる
- 対応が要るものを課題管理に起票し、担当チームに知らせる
(a)読める人が偏っている。 変更履歴を読んで「うちに効く」と分かるのは1〜2名です。その2名が休んだ週は、見回りが丸ごと抜けます。
(b)破壊的変更が自動のプルリクエストに埋もれる。 テストが通ったものから順にマージされ、テストで拾えない既定値の変更は、そのまま本番に入ります。
(c)サポート終了に気づくのが遅れる。 実行環境のサポート終了は別の場所に書かれ、気づいたときには計画外の移行作業になります。
(d)同じ変更を複数のチームが別々に調べる。 3チームが同じライブラリを使うと、3人が同じ変更履歴を読みます。
- 【自動】 毎週月曜の朝6時にワークフローが動き、各リポジトリの依存の一覧(SBOM)を取り直して、依存の台帳を作り直す
- 【自動】 台帳に載ったライブラリの GitHub のリリースを取り、前回までに取ったものと比べて新しいリリースだけを拾う
- 【自動】 台帳に載った実行環境について、サポート終了の日付を取る
- 【AI】 エージェントがリリースの本文から変更を種類別に取り出し、依存の台帳とコードの検索を引いて、影響するリポジトリと対応の候補を挙げる
- 【自動】 急ぎの度合いを規則で付け、チームごとに分けて社内チャットへ届ける。影響の無かったリリースは件数と名前だけをまとめる
- 【人】 各チームの当番が候補を確かめ、対応が要るものを課題管理に起票する
- 【人】 更新の時期と方法は、各チームが決める
2番目と3番目をAIにさせないのは、意図してのことです。 新しいかどうかは識別子で、終了の日付は取った値で決まります。AIに読ませるのは、自由な文の変更履歴だけです。
02今回想定するシステム構成
GitHub(社内リポジトリ)── 依存の一覧(SBOM) OSS の GitHub のリリース ── 新しいリリースの本文 endoflife.date の API ── 実行環境のサポート終了の日付 │ ▼【トリガー】Schedule Trigger(毎週月曜 6時、Asia/Tokyo) n8n のワークフロー ├──▶ HTTP Request で SBOM の生成と取得 → 依存の台帳(PostgreSQL) ├──▶ HTTP Request でリリースの一覧 → 前回までの識別子と比べて新しいものを拾う ├──▶ HTTP Request で実行環境のサポートの状態を取る ▼ AI Agent ノード(Tools Agent)+ Claude │ リリース1件ごとに、道具を選んで引く │ ・依存の台帳を引く(どのリポジトリが、どの版を使っているか) │ ・社内のコードを検索する(非推奨の関数・設定の名前) │ ・過去の判断の記録を引く │ Structured Output Parser で決まった形のJSONを返す ▼ 急ぎの度合いを規則で付ける → チームごとに社内チャットへ ▼【人】候補の確認・起票・更新の時期の判断
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| ワークフロー | n8n | Make、Power Automate、Zapier |
| 生成AI | Claude API(n8n の Anthropic Chat Model ノード) | OpenAI API、Gemini API |
| 連携 | PostgreSQL(依存の台帳、取得済みのリリース、判断の記録) | MySQL |
| 通知 | 社内チャット | メール |
新しく足すのは、n8n のワークフローと、依存の台帳を置くデータベースだけです。 リポジトリには書き込みません。
依存の一覧は、GitHub の依存関係グラフから SBOM として取ります。 リポジトリの SBOM は SPDX の JSON 形式で書き出せ、packages にパッケージの名前と版(versionInfo)が入り、読み取りの権限があれば書き出せるとされています。注意が要るのは、これまでの書き出しの操作(GET /repos/{owner}/{repo}/dependency-graph/sbom)が2026年11月13日以降は使えなくなると告知されていることです。 代わりに sbom/generate-report で生成を始め、sbom/fetch-report/{sbom_uuid} で結果を取る2段の手順に移ります。これから組むなら、最初から2段の手順で作ります。
リリースは、GitHub の Releases の API で取ります。 一覧(GET /repos/{owner}/{repo}/releases)は1ページ最大100件で、各リリースに tag_name、body、published_at、prerelease などが入ります。
実行環境のサポート終了は、endoflife.date の API で取ります。 製品ごと(/api/v1/products/{product})に版の系列が並び、系列ごとに 終了の日付(eolFrom)、終了したか(isEol)、何らかのサポートが続いているか(isMaintained)が入ります。2026年10月8日に Node.js を取ったときは、22 の系列の終了日が2027年4月30日でした。endoflife.date は提供元ではなく、提供元の公表をまとめたサイトです。 期日を計画に使う前に、提供元のページで確かめます。
n8n のエージェントを選ぶ理由は、リリース1件ごとに引き方が変わるからです。 非推奨の関数の名前が書かれていればコードを検索し、何も書かれていなければ台帳だけを引きます。Tools Agent は、道具の機能を理解し、タスクに応じてどの道具を使うかを決めるとされています。
03どうやって実装するのか
処理の起点を決める
毎週月曜の朝6時に、Schedule Trigger で動かします。 各チームの週の計画の前に届けるためです。週1回にするのは、毎日届けると当番が読み切れず、まとめて読むことになるからです。ただし、実行環境のサポート終了の日付だけは、終了の90日前・30日前に当たる週に必ず出します。
Schedule Trigger は、ワークフローのタイムゾーンが無ければ n8n のインスタンスのタイムゾーンを使い、セルフホストの既定は America/New York とされています。ワークフローのタイムゾーンを Asia/Tokyo にし、保存して公開します。公開しないと Schedule Trigger は動かないとされています。週の間隔では、曜日と時刻を選べます。
このワークフローが止まったことに、人が気づける仕組みを必ず作ります。 実行が終わったら、新しいリリースがゼロでも「今週の見回り完了(新しいリリース 0件・台帳のリポジトリ 40)」を出します。通知が来ないこと自体が、止まった合図になります。 第3章の(a)は、ここで解きます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 依存の一覧(SBOM) | リポジトリごとのパッケージの名前と版 | GitHub の依存関係グラフ |
| 監視の対象表 | ライブラリ名、リリースを取るリポジトリ(owner/repo)、重さの区分、担当チーム | 基盤の担当が作る表 |
| リリース | tag_name、name、body、published_at、prerelease | ライブラリの GitHub のリリース |
| 実行環境のサポート | 系列、eolFrom、isEol、isEoas、isMaintained、最新の版 | endoflife.date の API |
| 実行環境の使用状況 | リポジトリごとの Node.js・Python の系列 | 各リポジトリの設定から写した台帳の列 |
| 取得済みのリリース | 前回までに取ったリリースの識別子 | 判断の記録 |
| 過去の判断の記録 | 同じライブラリの前回の判断と、起票した課題 | 判断の記録 |
質を決めるのは、監視の対象表です。 SBOM に載るのはパッケージの名前で、そのパッケージのリリースがどの GitHub のリポジトリに出るかは、SBOM からは決まりません。 対象表に「パッケージ名 → リリースを出すリポジトリ」の対応を持たせ、重さの区分(フレームワーク・接続・認証など、必ず中身を見るもの)を付けます。
GitHub の Releases を使っていないライブラリは、対象表に変更履歴のファイルのURLを持たせて取ります。 取り方が決まっていないものは「取得方法なし」と書き、対象外の件数を毎週の完了の通知に出します。
データの取得方法を決める
| 取るもの | どこから | どう取るか |
|---|---|---|
| SBOM | 各リポジトリ | HTTP Request で generate-report を呼び、返った識別子で fetch-report を取る |
| リリースの一覧 | 対象表のリポジトリ | HTTP Request(GET、per_page=100) |
| 実行環境のサポート | endoflife.date | HTTP Request(GET /api/v1/products/{product}) |
| 新しいリリース | 取得済みの識別子との比較 | Postgres ノードで取得済みを引き、含まれないものを残す |
| 台帳・過去の判断 | 写しのデータベース | エージェントの道具(Postgres の Select) |
| コードの使用箇所 | 社内のリポジトリ | エージェントの道具(GitHub のコードの検索) |
GitHub の API の回数に気をつけます。 認証の無い呼び出しは1時間に60回、GitHub App のインストールのトークンでは最低5,000回とされています。認証無しでは足りないので、読み取りだけの権限を持つ GitHub App のトークンで呼びます。
コードの検索は、もっと厳しい制限があります。 公式の説明では、コードの検索は認証が必須で、1分に10回までです。さらに、既定のブランチだけが対象で、384KB より小さいファイルだけが検索できるとされています。HTTP Request の Batching で、1回に送る件数と次の送信までの待ち時間を決め、検索は1分に10回を超えないように間を空けます。
SBOM の生成は、40のリポジトリを順に回します。 generate-report で生成を始め、結果が取れるまで待ってから fetch-report を取ります。取れなかったリポジトリは、前週の台帳を使わず「今週は台帳を作り直せなかった」と通知します。
AIへ渡す前に整形する
- パッケージ名をそろえる … npm のスコープ付きの名前、PyPI の大文字・小文字、区切りの
-と_を同じ規則でそろえ、対象表と SBOM の両方に当てます - 版の幅を出す … 台帳の版と新しいリリースの版を比べ、大きな版・小さな版・修正の版のどれが上がったかを機械で出します。エージェントに版の比較をさせません
- プレリリースを分ける …
prereleaseが true のものは、重さの区分が「必ず見る」のライブラリだけを残し、他は件数だけにします - 飛ばした版を束ねる … 台帳の版から新しい版までの間に複数のリリースがあれば、その間の本文をまとめて渡します。最新の1件だけを読むと、間の版の破壊的変更を落とします
- 本文の長さを確かめる … コミットの一覧だけで長すぎる本文は、見出し(Breaking、Deprecated、Removed など)の付近を先に切り出し、残りは要約の対象にしません
- 実行環境の期日を計算する …
eolFromから今日までの日数を機械で出し、90日以内・30日以内の印を付けます
4番目が、この構成でいちばん効く前処理です。 台帳の版が 4.2 のまま、4.3、4.4、5.0、5.1 と出ていたら、5.0 の本文に書かれた破壊的変更を読まないと、5.1 への更新で何が壊れるかが分かりません。
AIに処理させる
させるのは、リリース1件(または束ねた数件)ごとに、変更を種類別に取り出し、依存の台帳とコードの検索を引いて、影響するリポジトリと対応の候補を挙げることです。
| させること | 使う道具 | 返すもの |
|---|---|---|
| 変更を種類別に取り出す | - | 破壊的変更、非推奨、削除、実行環境の最低版の引き上げ、既定値の変更 |
| 変更の根拠を写す | - | 本文の該当の文をそのまま |
| 検索の言葉を決める | - | 非推奨・削除された関数・設定・オプションの名前 |
| 使っているリポジトリを引く | 依存の台帳を引く | リポジトリ、いまの版、担当チーム |
| 使用箇所を探す | 社内のコードを検索する | 当たったファイルのパスと件数 |
| 前回の判断を添える | 過去の判断を引く | 同じライブラリの前回の判断と課題 |
| 対応の候補を書く | - | 版の固定、置き換え、設定の追加など、本文に書かれた移行の手順 |
検索の言葉をエージェントに決めさせるのが、第4章の③への答えです。 本文に「foo() は次の大きな版で削除」とあれば foo( を検索し、当たったパスを返させます。検索の言葉は本文に書かれた名前に限り、推して作らせません。
| させないこと | 理由 |
|---|---|
| 影響なしの結論 | 検索は既定のブランチと384KB未満のファイルだけ。見つからないことは使っていないことではない |
| 更新の要否・時期の判断 | 各チームが、リリースの予定と試験の範囲を見て決める |
| 版の大小の比較 | 前処理で機械が出す |
| サポート終了の日付の推測 | API が返した値だけを使う |
| 脆弱性の重さの評価 | 別の仕組みで扱う |
| 本文に無い移行の手順の作成 | 書かれた手順だけを写す |
1行目が、この構成でいちばん大事な線です。 コードの検索で当たらなかったとき、エージェントは「使っていない」と書きたくなります。動的に名前を組み立てて呼んでいる箇所、別のブランチで開発中の箇所、大きな生成ファイルの中は、検索に出てきません。
指示内容を固定する
AI Agent ノードの System Message に、次のように書きます。
あなたは社内システムの情報システム部で、依存しているOSSのライブラリの
新しいリリースを読み、社内のリポジトリへの影響を調べる担当です。
入力は、ライブラリ名、台帳の版、新しい版、版の上がり方(major / minor / patch)、
その間のリリースの本文です。
【やること】
1. 本文から変更を取り出し、種類を breaking / deprecation / removal /
runtime_requirement / default_change / other から選ぶ。
2. 各変更について、根拠にした本文の文をそのまま evidence に写す。
3. 非推奨・削除になった関数・設定・オプションの名前が本文にあれば、
それを検索の言葉にして、社内のコードを検索する。
4. 依存の台帳を引き、このライブラリを使っているリポジトリ、いまの版、
担当チームを挙げる。
5. 過去の判断の記録を引き、同じライブラリの前回の判断を添える。
6. 本文に移行の手順が書かれていれば、そのまま migration_note に写す。
【厳守事項】
- 本文に書かれていない変更を書かないでください。
- 検索の言葉は、本文に書かれた名前だけにしてください。推して作らないでください。
- コードの検索で当たらなかったときは、usage を not_found にしてください。
「使っていない」「影響なし」と書かないでください。
- 検索ができなかったとき(回数の上限、エラー)は usage を unknown にしてください。
unknown を not_found にしないでください。
- 更新すべきか、いつ更新すべきかを書かないでください。
- 版の大小を自分で比べないでください。入力の版の上がり方を使ってください。
- 脆弱性の深刻度を評価しないでください。本文に脆弱性の修正があれば、
種類を other にし、check_points に「脆弱性の修正の記載あり」と書いてください。
- 本文が英語なら、summary_ja は日本語で、evidence は原文のまま写してください。
【出力】指定のJSONの形で返してください。
「unknown を not_found にしない」が、この指示の要です。 検索が回数の上限で止まったリポジトリは、使っているかどうかが分かりません。分からないものを「見つからなかった」と書かせると、人が確かめる候補から落ちます。 3つの値を分けておけば、後段の規則で unknown を必ず人の確認に回せます。
出力形式を固定する
Structured Output Parser で、次の形のJSONを返させます。
{
"package": "", "repo": "", "from_version": "", "to_version": "",
"bump": "major | minor | patch",
"release_ids": [""],
"changes": [
{ "type": "breaking | deprecation | removal | runtime_requirement | default_change | other",
"summary_ja": "", "evidence": "", "search_terms": [""] }
],
"affected": [
{ "repository": "", "current_version": "", "team": "",
"usage": "found | not_found | unknown",
"hits": [ { "path": "", "count": 0 } ] }
],
"migration_note": "",
"previous_judgment": "",
"check_points": [""]
}
1つ目の理由は、急ぎの度合いを規則で決められることです。 ワークフローが次の規則で付けます。
| 急ぎ | 条件 |
|---|---|
| 至急 | 本番のリポジトリで使っている実行環境の系列が、30日以内にサポート終了 |
| 今週 | breaking・removal・default_change があり、usage が found か unknown のリポジトリがある |
| 計画 | deprecation か runtime_requirement があるか、実行環境が90日以内にサポート終了 |
| 記録 | 上のどれにも当たらない(件数と名前だけをまとめる) |
2つ目は、affected をチームごとに分けて届けられることです。 各チームのリポジトリと使用箇所だけを付けて届き、第3章の(d)はここで解けます。
3つ目は、evidence で確認が速くなることです。 当番は要約ではなく原文の該当の文を読んで判断できます。要約が原文とずれていたら、evidence を見ればすぐ分かります。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| GitHub(社内リポジトリ) | HTTP Request(GitHub App の読み取りのトークン) | SBOM の生成と取得、コードの検索 |
| GitHub(OSS のリリース) | HTTP Request(GET) | リリースの一覧と本文 |
| endoflife.date | HTTP Request(GET) | 実行環境の系列とサポートの状態 |
| 写しのデータベース | Postgres ノード | 依存の台帳、取得済みのリリース、判断の記録 |
| Claude API | Anthropic Chat Model ノード | 変更の取り出しと影響の整理 |
| 社内チャット | 通知 | 急ぎの順に、チームごとに出す |
GitHub App の権限は、読み取りだけにします。 リポジトリの内容と依存関係グラフの読み取りがあれば、この構成は動きます。プルリクエストや課題を作る権限を持たせると、エージェントの判断が誤ったときに、リポジトリに跡が残ります。
エージェントの道具には、読み取りの操作だけを渡します。 判断の記録への書き込みは、エージェントの出力を受け取ったあとにワークフローの側で行います。Anthropic Chat Model ノードでは、生成の長さの上限や温度などを決められます。取り出しの仕事なので、温度は低くします。
人が確認する
- 至急から見る … 実行環境のサポート終了が30日以内のものは、基盤の担当が移行の計画を確かめます
- 今週の候補を確かめる …
evidenceを読み、foundのパスを開いて使い方を見ます。unknownのリポジトリは、当番が自分で検索し直します - 起票を決める … 対応が要るものを課題管理に起票します。起票は人が行います
- 記録のまとめを流し見る … 名前を見て、中身を確かめたいものがあれば本文を開きます
- 判断を記録する … 対応する・しない・様子を見る、と理由を判断の記録に残します
2番目の unknown を省かないでください。 上限で止まったリポジトリは、調べられなかっただけです。
目標は、1件をならして3分です。 記録のものは名前を見るだけで済み、今週の候補は使用箇所を開いて10分を超えることがあります。
例外に対処する
| 起きること | 対応 |
|---|---|
| SBOM の生成が終わらない・取れない | 前週の台帳を使わず「台帳を作り直せなかった」を通知 |
| GitHub の API の回数の上限に当たる | 残りを翌日の同じ時刻に回し、未処理の件数を通知 |
| コードの検索の上限に当たる | usage を unknown にして人へ回す |
| リリースの本文が空・コミットの一覧だけ | 本文の変更履歴のファイルを取り直し、取れなければ check_points に「本文なし」 |
| リリースが取り下げられた・付け直された | 識別子が同じで中身が変わったら、前回の判断を添えて再度出す |
| endoflife.date に製品が無い | 対象表で提供元のページを持たせ、人が期日を確かめる |
| エージェントの出力がスキーマに合わない | ライブラリ名と版とリンクだけを「今週」の扱いで人に回す |
| 道具の呼び出しがくり返し止まらない | Max Iterations で上限を決め、超えたら人へ |
7行目で、スキーマに合わない出力を「今週」で回すのは意図してのことです。 取り出しができなかったリリースは、影響の有無が分からないという意味で、確かめるまでは重く扱います。Tools Agent の Max Iterations は、モデルが答えを出そうとして回る回数の上限で、既定は10とされています。
記録を残す
- 実行ごとの SBOM の取得の成否と、台帳の差分(増えた依存・消えた依存・版の変化)
- 取ったリリースの識別子と本文
- エージェントのJSON出力と、呼んだ道具の順番(Return Intermediate Steps で残す)
- 人の判断 … 対応する・しない・様子を見る、理由、起票した課題、判断した日時
- リリースの公開日、見回りで拾った日時、起票した日時、更新を終えた日時
最後の行が、この構成の物差しです。 公開から起票までと起票から更新までを分けて並べます。
04実装レベルの3段階
半自動化だけでも、①の見回りの時間はほぼ無くなります。 残るのは、本文を読む②と、使用箇所を探す③です。 本格構成で減るのは、その②と③と④です。 半自動化を1か月回して拾い漏れが無いかを確かめてから、エージェントを足してください。
05工数削減シミュレーション
導入後 160件 × 3分 ÷ 60 = 8 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 社内向けの業務システムを内製していて、リポジトリが数十あり、直接依存しているOSSのライブラリが数百ある情報システム部門。ライブラリの更新は Dependabot などの自動のプルリクエストで届くが、変更履歴を読んで破壊的変更や実行環境のサポート終了を拾う作業が、詳しい1〜2名の担当に偏っている場合。リポジトリが GitHub にあり、依存関係グラフを有効にできる場合。
- リポジトリが数個で、依存しているライブラリが数十に収まり、担当者が変更履歴を毎週読んでも負担にならない場合。依存関係をリポジトリで管理しておらず、どのシステムが何を使っているかを書き出せない場合(先に依存の台帳づくりが要ります)。脆弱性の対応だけが目的の場合(脆弱性の通知の仕組みを先に使います)。なお、更新するかどうか、いつ更新するかの判断と、更新後の動作の確認は、この構成では代替できません。
07最小構成で試す方法
- 過去3か月に出たリリースから、10件を選ぶ(破壊的変更があったもの、非推奨の予告があったもの、版を2つ以上飛ばしたもの、実行環境の最低版を上げたものを入れる)
- 依存の台帳の代わりに、そのライブラリを使っているリポジトリと版を書き出す
- 生成AIの画面に、リリースの本文とリポジトリの一覧を貼り、「本文から破壊的変更・非推奨・削除・実行環境の最低版の引き上げ・既定値の変更を取り出し、根拠の文をそのまま写し、非推奨になった名前を挙げてください。影響の有無の結論は書かないでください」と指示する
- 挙がった名前で、当番が自分でコードを検索する
- 出てきた結果を、当時の当番の判断と比べる
| 出てきた内容 | 判断 |
|---|---|
| 当時の判断と同じ変更が取れた | ワークフローを組む段階に進む |
| 本文に無い変更を書いた・影響なしと書いた | 指示の書き方で直る。usage を3つの値で持たせる |
| 版を飛ばしたときに間の破壊的変更を落とした | 前処理で本文を束ねるのが先 |
3行目が出ることは珍しくありません。 間の版の本文を束ねて渡すことを、最初から前処理に入れてください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 検索で当たらないと「影響なし」と書く | usage を3つの値にし、not_found を結論として扱わない |
検索の上限で止まったものを not_found にする | 上限で止まったら unknown。人が検索し直す |
| 最新の1件だけ読み、間の破壊的変更を落とす | 台帳の版からの間の本文を束ねて渡す |
| SBOM の書き出しが11月で止まる | 生成と取得の2段の手順で作る |
| 認証無しで呼び、1時間60回で止まる | 読み取りだけの GitHub App のトークンで呼ぶ |
| サポート終了の日付を endoflife.date だけで決める | 計画に使う前に、提供元のページで確かめる |
| 脆弱性の重さまで書き始める | 範囲外と明記し、記載の有無だけを知らせる |
| 見回りが止まったことに気づかない | 件数ゼロでも完了の通知を出す |
上の2行が、この構成の失敗のほとんどです。 どちらも、分からないことを「影響しない」に寄せることから起きます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 公開されているOSSのリリースの本文、自社のリポジトリの依存の一覧(どのシステムが何の何版を使っているか)、コードの検索で当たったファイルのパスです。依存の一覧は、自社のシステムの作りそのものです。
- AIに渡す範囲を絞る … 渡すのは、リリースの本文、使っているリポジトリの名前と版、検索で当たったパスと件数だけです。ソースコードの中身は渡しません
- トークンの権限を最小にする … GitHub App は読み取りだけにし、トークンは n8n の資格情報に置きます。ワークフローの定義やログにトークンを書かないでください
- 依存の台帳を社外に出さない … 古い版を使っているシステムの一覧は、攻撃する側にも役立つ情報です。通知は限られたチャンネルに出します
- 更新の判断は人が行う … どの版に、いつ上げるかは、各チームが決めてください
- 「影響なし」を自動の結論にしない … 調べられなかったこと、見つからなかったことは、結論ではなく候補として人に回します
誤りが起きた場合のリスクは、影響する変更を見落とすことと、影響しない変更で当番の時間を使いすぎることの2つです。 前者のほうが重いので、迷ったものは人へ、の側に寄せています。
10まず何から始めるか
1週目:監視の対象表を作る
本番のリポジトリが直接依存するフレームワーク・接続・認証などのライブラリを書き出し、リリースを出すリポジトリと担当チームを表にします。実行環境の系列も書き出します。
2週目:10件で試す
第8章の手順で、過去のリリース10件を試します。影響なしと書いていないかを見ます。
3週目:GitHub App と台帳を用意する
読み取りだけの GitHub App を作り、SBOM の2段の手順で依存の台帳を作ります。
4週目:見回りと台帳の照合を n8n で動かす
リリースとサポート終了の日付の取得、台帳での引き当てまでを組み、件数ゼロでも完了を通知します。エージェントはまだ入れず、拾ったリリースを当番の見回りと1か月比べます。
それ以降: エージェントとコードの検索を足し、公開から起票までの時間を毎月並べます。実行環境のサポート終了が90日前に必ず届き、破壊的変更が各チームのリポジトリに付けて届くようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
リリースの一覧の操作(GET /repos/{owner}/{repo}/releases)で tag_name・body・published_at・prerelease などが返ること。1ページ最大100件であること | GitHub Docs: REST API endpoints for releases | 2026-10-08 |
リポジトリの SBOM を SPDX の JSON 形式で書き出せること。packages に名前と版が入ること。読み取りの権限で書き出せること。これまでの書き出しの操作が2026年11月13日以降使えなくなり、generate-report と fetch-report の2段の手順に移ること | GitHub Docs: REST API endpoints for software bill of materials (SBOM) | 2026-10-08 |
コードの検索(GET /search/code)が認証必須で1分に10回まで。既定のブランチだけが対象で、384KB未満のファイルだけが検索できること | GitHub Docs: REST API endpoints for search | 2026-10-08 |
| 認証の無い呼び出しが1時間60回、GitHub App のインストールのトークンが最低5,000回であること | GitHub Docs: Rate limits for the REST API | 2026-10-08 |
| Dependabot のバージョン更新が依存を最新に保つ自動のプルリクエストであること。プルリクエストごとに変更履歴・リリースノートとテストを確かめてからマージするよう勧めていること | GitHub Docs: About Dependabot version updates | 2026-10-08 |
endoflife.date の API v1 の基点が https://endoflife.date/api/v1 で、/products/{product} が版の系列を返すこと。系列ごとの eolFrom・isEol・isMaintained の意味。2026年10月8日に Node.js の 22 の系列の終了日が2027年4月30日だったこと(原文を取得して確認) | endoflife.date: API v1 の定義 | 2026-10-08 |
| Schedule Trigger が、ワークフローのタイムゾーンかインスタンスのタイムゾーン(セルフホストの既定は America/New York)を使うこと。保存して公開しないと動かないこと。週の間隔で曜日と時刻を選べること | n8n Docs: Schedule Trigger | 2026-10-08 |
| HTTP Request ノードの Batching(1回の件数と待ち時間)、Timeout、Pagination、応答の形式の設定があること | n8n Docs: HTTP Request | 2026-10-08 |
| Tools Agent が道具の機能を理解して使う道具を決めること。System Message、Max Iterations(既定10)、出力パーサーをつなぐ設定、Return Intermediate Steps があること | n8n Docs: Tools Agent | 2026-10-08 |
| Anthropic Chat Model ノードで Claude をエージェントにつなげ、生成の長さの上限や温度を設定できること | n8n Docs: Anthropic Chat Model | 2026-10-08 |
ライブラリの更新の要否と実行環境のサポート終了の期日は、各ライブラリと実行環境の提供元の公表で確かめてください。 本記事は確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1009)についてのご相談はこちらから。
