Skip to content

ci: add OSV-Scanner Full Scan reusable workflow - #82

Draft
oqrusk wants to merge 4 commits into
mainfrom
feat/osv-scanner-full-reusable
Draft

ci: add OSV-Scanner Full Scan reusable workflow#82
oqrusk wants to merge 4 commits into
mainfrom
feat/osv-scanner-full-reusable

Conversation

@oqrusk

@oqrusk oqrusk commented May 19, 2026

Copy link
Copy Markdown

概要

各リポジトリで daily の OSV フルスキャンを行うための reusable workflow を追加する。脆弱性検出時に Slack 通知と GitHub Issue 作成の両方を行う。

背景

api-metric-service #107 で daily フルスキャンが導入されたが、現状は各リポジトリが直接 google/osv-scanner-action を参照している。横展開を考えると本リポジトリに集約して reusable workflow として提供し、各リポジトリは薄いラッパーから呼び出す形にしたい。

  • scanner action のバージョン pin (@v2.3.8) を中央で一元管理できる
  • wiring(permissions, オプション, 通知)の社内ポリシーも中央で更新可能
  • Dependabot は既に .github/workflows をカバーしているので追加設定不要

通知設計

buffett-code-dev は GitHub Team プランで GitHub Code Security (GHAS) を契約しておらず、Code Scanning(Security タブ)が private リポジトリで使えない。そのまま upload-sarif: true で動かすと private リポでは失敗する。また cron 失敗メールは「ワークフローファイルを最後にコミットした人」にしか届かないため、チームに気付ける形にする必要がある。

採用した通知経路:

経路 役割
Slack 通知 セキュリティチームへの即時通知(横断把握)
GitHub Issue 自動作成 該当リポジトリの maintainer への通知 + 対応トラッキング

ジョブ構成:

  • scan-full: 既存の google/osv-scanner-action reusable を upload-sarif: false, fail-on-vuln: true で呼ぶ
  • notify-slack: 失敗時に Slack incoming webhook へ通知(slackapi/slack-github-action@v3.0.3
  • create-issue: 失敗時に GitHub Issue を作成 or コメント追記(actions/github-script@v9.0.0

Issue は タイトル prefix [OSV-Scanner] で deduplication

  • 既存の OSV-Scanner Issue がオープン中 → コメント追記(重複防止)
  • なければ新規作成
  • クローズすれば「修正完了」、再検出時は新しい Issue が作られる

各リポジトリでの呼び出し例

# .github/workflows/osv-full-scanner.yml
name: OSV-Scanner Full Scan
on:
  workflow_dispatch:
  schedule:
    - cron: "0 0 * * *"  # 毎日 09:00 JST
permissions:
  actions: read
  security-events: write
  contents: read
  issues: write
jobs:
  scan-full:
    uses: buffett-code-dev/github-actions/.github/workflows/osv-scanner-full.yml@main
    secrets: inherit
  • @main 参照で中央更新を即時に全リポジトリへ反映
  • secrets: inherit で Org Secret の OSV_SCANNER_SLACK_WEBHOOK_URL を引き渡す
  • caller 側にも issues: write 権限が必要

事前準備(マージ前)

  • Slack incoming webhook URL を Organization Secret OSV_SCANNER_SLACK_WEBHOOK_URL として登録
    • 通知先チャンネルは security alert 向けの専用チャンネルを推奨

動作確認方法

マージ後、テストリポジトリで上記ラッパーを workflow_dispatch から手動実行し以下を確認:

  1. 脆弱性がない場合: scan-full 成功 → notify-slack / create-issue スキップ
  2. 脆弱性がある場合: scan-full 失敗 → Slack 通知到着 + Issue 作成
  3. 再実行: 既存 Issue にコメント追記される
  4. Issue クローズ後の再実行: 新しい Issue が作成される

将来の発展

  • GHAS(GitHub Code Security)を契約することになれば、upload-sarif: true に変更して Security タブ運用へ一斉移行可能。中央 reusable workflow を一箇所修正するだけで全リポジトリへ反映される。

ref

🤖 Generated with Claude Code

yusuke okura and others added 4 commits May 19, 2026 18:04
各リポジトリの daily フルスキャンを集約するための reusable workflow を追加する。
caller 側に schedule trigger を持つ薄いラッパーを置く運用にすることで、scanner action のバージョンや wiring を中央で一元管理できる。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
GHAS なし運用前提で以下を追加:
- upload-sarif: false(private リポジトリで Code Scanning upload が失敗するため)
- fail-on-vuln: true(明示)
- 脆弱性検出時に Slack へ通知する notify-slack ジョブを追加

caller 側は SLACK_WEBHOOK_URL を secrets: inherit で渡す前提。Org 共通の Slack webhook を Org Secret として登録しておけば全リポジトリで動作する。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
汎用名 SLACK_WEBHOOK_URL は他用途と衝突するため、OSV-Scanner 専用名にリネーム。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Slack 通知に加えて、検出時に該当リポジトリへ Issue を自動作成する。
既存の OSV-Scanner Issue がオープン中なら新規作成せずコメント追記し、
クローズ後の再検出時に新しい Issue が作られる運用とする。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant