背景
普段利用しているGoogle Cloud の各種サービスのrelease noteの確認とOSSの最新情報取得、既存利用Versionへの影響確認を全て実施するのがかなり手間だなと感じた次第。
そのため、下記のサービスに対してどうにかして手間を減らしつつ、ある程度早めに情報をキャッチアップできないか方針を考えてみる。
方針
Release Noteの情報取得
Releasae Noteの情報取得には一般的なRSSフィードでの情報取得を行う。
GoogleCloudはBigQueryでReleaseNoteの情報が提供されているようだが、確認したところBigQueryの最終更新が2024年で止まっているように見えるため、RSSフィードを採用する。
また、Cloud FunctionsとCloud Schedulerを活用してバッチ処理で定期実行することや、実装の容易性からPythonスクリプトでのRSS情報取得を行う。
Release Noteの情報精査
情報精査にはGoogleAIStudioを活用しつつ、最終的な判断を人の目で行うこととする。
下記の天秤が難しい。
- 確認結果の正確性
- 運用のコスト
本来は、自身のシステム構成を踏まえた影響確認も自動化できると嬉しい。
しかし構成情報をAIに取り込む費用などのかけるコストに対して、削減できる工数や正確性を考慮すると、全てをAIにするのは難しいため、下記のみをAIにて行うものとする。その意図は「影響や新機能の要点抽出」である。
- ReleaseNoteの内容の要約
- 利用バージョンへの影響確認
※OSSのReleaseNoteには脆弱性への対応が含まれるが、それはTrivyなどの脆弱性スキャンツールによって適切に管理できている前提とする。
手順
必要ライブラリのインストール
pip install feedparser google-generativeai markdownify
Pythonスクリプト作成
今回はArgoCDのrelease note 確認の自動化スクリプトを作成
RSS_URLを変更すれば、他のOSSやサービスにも活用可能。
import os
import feedparser
from datetime import datetime, timedelta
import google.generativeai as genai
from markdownify import markdownify as md
# ========= 設定 =========
GEMINI_API_KEY = "××××××××××××××××××" # GoogleAIStudioから取得したAPIKeyを記載
RSS_URL = "https://github.com/argoproj/argo-cd/releases.atom"
MAX_DAYS_BACK = 30 # この日数以内のリリースノートだけ対象にする
TARGET_VERSION = "v2.4.4" # 自身が現在利用しているArgoCDのバージョンを記載
# ========= 初期化 =========
os.environ["GEMINI_API_KEY"] = GEMINI_API_KEY
genai.configure(api_key=GEMINI_API_KEY)
model = genai.GenerativeModel("gemini-2.0-flash")
# ========= RSS 取得 =========
feed = feedparser.parse(RSS_URL)
if not feed.entries:
print("RSSフィードが取得できませんでした。URLを確認してください。")
exit()
# ========= フィルタリング =========
threshold_date = datetime.utcnow() - timedelta(days=MAX_DAYS_BACK)
def get_entry_date(entry):
return getattr(entry, 'published_parsed', getattr(entry, 'updated_parsed', None))
filtered_entries = []
for entry in feed.entries:
entry_date_struct = get_entry_date(entry)
if entry_date_struct:
entry_datetime = datetime(*entry_date_struct[:6])
if entry_datetime > threshold_date:
filtered_entries.append(entry)
# ========= 要約処理 =========
for entry in filtered_entries:
title = entry.title
link = entry.link
content_html = entry.content[0].value if "content" in entry else entry.summary
markdown_content = md(content_html)
prompt = f"""
以下は GitHub のリリースノート(Markdown形式)です。
これを人間が読みやすいように、日本語で簡潔に要約してください。
また、我々が利用しているのは {TARGET_VERSION} です。このバージョンに影響のある個所があれば教えてください。
出力形式:
---
タイトル: {title}
URL: {link}
新機能・変更点:
(簡潔なリスト)
主なバグ修正:
(既存バージョン使用者が気にすべきもの)
備考:
(Quick Startやマイグレーション注意点など)
影響({TARGET_VERSION} に対して):
(今の利用バージョンに影響のある内容など)
---
以下がリリースノートの内容です:
{markdown_content}
"""
print(f"\n Gemini API に要約を依頼中...({title})\n")
response = model.generate_content(prompt)
print(response.text)
print("\n 要約完了\n")
実行
$ python3 main.py
Gemini API に要約を依頼中...(v3.1.0-rc3)
---
タイトル: v3.1.0-rc3
URL: https://github.com/argoproj/argo-cd/releases/tag/v3.1.0-rc3
新機能・変更点:
* Helm が 3.18.4 にアップグレードされました。
主なバグ修正:
* CRD のヘルスチェックメッセージが修正されました。
備考:
* インストール手順(非HA/HA)が記載されています。
* コンテナイメージと CLI バイナリの署名と Provenance が利用可能です。
* アップグレードの際はドキュメントを確認してください。
影響(v2.4.4 に対して):
* v3.1.0-rc3 はリリース候補版であるため、本番環境での利用は推奨されません。
* v2.4.4 から v3.1.0-rc3 へ直接アップグレードする場合は、アップグレードガイドをよく確認してください。特に、破壊的な変更や移行手順がないか確認が必要です。
* Helm のバージョンアップに伴う設定変更が必要になる可能性があります。
* CRDヘルスチェック修正の影響は軽微と考えられます。
---
要約完了
参考
| 対象サービス・OSS | RSS URL |
|---|---|
| Google Cloud | https://cloud.google.com/feeds/gcp-release-notes.xml |
| ArgoCD | https://github.com/argoproj/argo-cd/releases.atom |
| Reloader | https://github.com/stakater/Reloader/releases.atom |
| Sealed Secret | https://github.com/bitnami-labs/sealed-secrets/releases.atom |
| External DNS | https://github.com/kubernetes-sigs/external-dns/releases.atom |
| DataDog Agent | https://github.com/DataDog/datadog-agent/releases.atom |
| Kustomize | https://github.com/kubernetes-sigs/kustomize/releases.atom |
今後
上記の内容をCluudScheduler+CloudFunctionsでバッチ処理を構成し、
1週間に1回程度でスクリプト実行をして結果をSlack通知する方法を検証します。