🔃

Claude Code GitHub Actionsで開発を次のステージへ!AI自動コードレビューと脆弱性診断で開発生産性を爆上げしよう

に公開

はじめに

こんにちは!株式会社OCT-PATHでCTOをしている黛 政隆(Xはこちら)です。

日々の開発業務、本当にお疲れ様です!素晴らしいプロダクトを世に送り出すため、チーム一丸となってコードを書き、レビューし、改善を重ねる…そのサイクルは、ものづくりの醍醐味ですよね。

さて、最近のAI技術の進化には目を見張るものがあります。特にコーディング支援AIは驚くほど賢くなり、私たちの開発スタイルを大きく変えるポテンシャルを秘めています。

「AIを使えばもっと効率的に、もっと高品質な開発ができるはず!」

私たちはそう考え、AIをチーム開発のプロセスに組み込む方法を模索してきました。そして今回、最近話題のClaude Clde GitHub Actionsを連携させた自動化の仕組みが、チームに想像以上の良い変化をもたらしてくれたので、その知見を皆さんに共有したいと思います。

この記事が、皆さんのチーム開発をより良くするためのヒントになれば嬉しいです。

チームが抱えていた2つの「もったいない」

私たちのチームでも、多くの開発現場と同じような課題に直面していました。

課題1:コードレビューの属人化と心理的ハードル

AIコーディングツールの精度が上がり、個々人が書くコードの品質は確実に向上しています。しかし、チームで開発する以上、コードレビューは依然として欠かせません。

ただ、こんな「もったいない」状況、ありませんか?

  • レビュー待ちで開発がストップしてしまう。
  • レビュアーによって指摘の観点がバラバラ。
  • 「この人のレビューは厳しいから、プルリクを出しにくいな…」という心理的なハードルが生まれる。

AI活用を推奨しても、それを全員に強制するのは難しいのが現実です。そこで私たちは、「誰がプルリクエストを出しても、必ず公平なAIによるレビューが自動で行われる仕組み」があれば、これらの課題を解決できると考えました。

この仕組みには、個人のスキルを可視化するという副次的な効果も期待できます。「AさんのプルリクはいつもAIからの指摘が少ないな。すごい!」「自分も次は指摘ゼロを目指そう!」というように、健全な競争意識やスキルアップへのモチベーションにも繋がるはずです。

課題2:高コストで形骸化しがちな脆弱性診断

セキュリティは、プロダクトの信頼性を支える上で最も重要な要素の一つです。しかし、従来の脆弱性診断は専門家による手動でのチェックが中心で、どうしても高コストになりがちでした。結果として、頻繁には実施できず、リリース直前や年に数回といった限られたタイミングでのチェックに留まってしまうケースも少なくありません。

しかし、最近のAIは非常に広範なコンテキストを理解できます。ソースコード全体を読み込み、人間が見落としがちな脆弱性のパターンを検出する能力が飛躍的に向上しました。

そこで、「AIの力を借りて、低コストで定期的にソースコード全体の脆弱性診断を行えないか?」と考えました。これにより、セキュリティリスクを開発の早い段階で発見し、手戻りを少なくすることができます。

Claude Code GitHub Actionsで実現すること

今回私たちが構築した仕組みは、これらの課題を解決するために、オープンソースで公開されている「Claude Code Action」を活用します。具体的には、以下の2つを実現します。

  1. プルリクエストのAI自動コードレビュー
    • プルリクエストが作成・更新されるたびに、AI(Claude)が自動でレビューコメントを投稿します。
  2. 月次ソースコード脆弱性診断とSlack通知
    • 毎月1回、ソースコード全体を対象とした脆弱性診断をAIが実行し、結果をまとめたIssueを自動作成。さらに、その結果をSlackに通知します。

この仕組みによって、コード品質の標準化とセキュリティレベルの向上を、自動で、継続的に実現することを目指します。

まず知っておきたい前提知識

「なんだか便利そうだけど、そもそもClaudeって?GitHub Actionsって?」という方のために、簡単に解説しますね。

そもそも Claude Code とは?

Claudeは、Anthropic社が開発した非常に高性能なAIです。特に長い文章の読解や生成、そしてコーディング能力に優れています。そのClaudeをコーディングアシスタントとして特化させたものが「Claude Code」だと考えてください。コードのレビューやリファクタリング、脆弱性の指摘など、開発者の頼れる相棒になってくれます。

そもそも GitHub Actions とは?

GitHub Actionsは、GitHubに組み込まれているCI/CD(継続的インテグレーション/継続的デプロイ)ツールです。git pushやプルリクエストの作成といったGitHub上でのイベントをきっかけに、テストやビルド、デプロイといった一連の作業を自動化できます。まさに、開発の「面倒な手作業」をなくしてくれる縁の下の力持ちです。

Claude Code Github Actions は何が嬉しいの?

このツールの基本は、GitHub上で「@claude」とメンションするだけで、コードレビューや修正を対話形式で依頼できる手軽さにあります。

今回の記事ではその機能を応用し、プルリクエスト作成などをきっかけに、その「@claude」メンション自体を自動で実行します。

これにより、開発者が意識せずともAIチェックが必ず行われる、堅牢な「仕組み」を構築するのがゴールです。

とても大事な「CLAUDE.md」とは?

これが今回の仕組みの「キモ」です。リポジトリのルートや.githubディレクトリにCLAUDE.mdというファイルを作成しておくと、Claudeはこのファイルに書かれた指示やルールを読んで、それに従ってレビューや診断を行ってくれます。

設定方法:2つのファイルで自動化を実現しよう!

さて、いよいよ本題の設定方法です。ここからは少しコードが出てきますが、一つ一つ丁寧に解説するので安心してくださいね。コピー&ペーストで使えるようにしてあります!

リポジトリに以下の2つのYAMLファイルを追加するだけで、魔法のような自動化が始まります。

  1. .github/workflows/claude.yml (Claudeを動かすためのメインファイル)
  2. .github/workflows/slack-notification.yml (脆弱性診断の結果をSlackに通知するためのファイル)

そして、AIへの指示書である CLAUDE.md も一緒に作成することを強く推奨します。

CLAUDE.md の準備と重要なお約束

まずは、AIへの指示書 CLAUDE.md を作りましょう。ここにレビューや脆弱性診断のルールを書いておくと、AIがそのルールを忠実に守ってくれます。

そして、後ほど設定するSlack通知を正しく機能させるために、脆弱性診断に関するルールには、必ず以下のように必須キーワードを含めるようにしてください。 これは、AIの診断結果から「脆弱性があったのか、なかったのか」を機械的に判断するための大切なお約束です。(指針についてはあくまでもサンプルですので、各自プロジェクト単位で自由に設定をしてください)

CLAUDE.md
# Claude への指示書

## Code Review Guidelines (コードレビューの指針)

- **可読性:** 変数名や関数名は分かりやすいですか?コメントは適切ですか?
- **パフォーマンス:** 無駄なループや非効率な処理はありませんか?
- **セキュリティ:** SQLインジェクションやクロスサイトスクリプティングのリスクはありませんか?
- **独自ルール:** 定数はすべて大文字のスネークケースで定義してください。

---

## Vulnerability Scan Guidelines (脆弱性診断の指針)

OWASP Top 10の観点を中心に、ソースコード全体に潜む脆弱性を診断してください。
診断結果は、この後説明するフォーマットに従って出力してください。

### 必須キーワード
脆弱性診断の結果には必ず以下のキーワードを含めてください:

**診断完了時:**
- 脆弱性発見: `VULNERABILITY_SCAN_RESULT: ISSUES_FOUND`
- 問題なし: `VULNERABILITY_SCAN_RESULT: CLEAN`

**重要度表記:**
- `SEVERITY: CRITICAL` (Critical脆弱性がある場合)
- `SEVERITY: HIGH` (High脆弱性がある場合)

### 診断レポート形式の例
VULNERABILITY_SCAN_RESULT: ISSUES_FOUND
SEVERITY: CRITICAL

1. Claudeを動かすメイン設定 (claude.yml)

.github/workflows/claude.yml というファイルを作成し、以下の内容を貼り付けてください。

.github/workflows/claude.yml
name: Claude PR Assistant

on:
  # @claude メンションに反応するためのトリガー
  issue_comment:
    types: [created]
  pull_request_review_comment:
    types: [created]
  issues:
    types: [opened, assigned]
  pull_request_review:
    types: [submitted]

  # プルリクエストの自動レビュー用トリガー
  pull_request:
    types: [opened, synchronize, reopened]

  # 月次脆弱性診断用トリガー (cron形式)
  schedule:
    # 毎月1日のUTC 0:00 (JST 9:00)に実行
    - cron: "0 0 1 * *"

jobs:
  # --- Job 1: プルリクエストの自動レビュー用Job ---
  auto-pr-review:
    # このJobはプルリクエストが作られたり更新された時にだけ動く
    if: github.event_name == 'pull_request'
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
      id-token: write # Claude Code ActionがOIDC認証する場合に備えて追加
    steps:
      - name: Add auto review comment as user
        uses: actions/github-script@v7
        with:
          # ここでユーザーのPATを使い、ボットではなく人間としてコメントする
          github-token: ${{ secrets.USER_PAT }}
          script: |
            await github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: '@claude このプルリクエストをレビューしてください。'
            });

  # --- Job 2: 脆弱性診断用のIssueを自動作成するJob ---
  auto-vulnerability-scan:
    # このJobはスケジュール実行の時だけ動く
    if: github.event_name == 'schedule'
    runs-on: ubuntu-latest
    permissions:
      contents: read
      issues: write
      id-token: write
    steps:
      - name: Create vulnerability scan issue as user
        uses: actions/github-script@v7
        with:
          # こちらもユーザーのPATを使い、人間としてIssueを作成する
          github-token: ${{ secrets.USER_PAT }}
          script: |
            const now = new Date();
            const jstTime = now.toLocaleString('ja-JP', { timeZone: 'Asia/Tokyo' });
            
            await github.rest.issues.create({
              owner: context.repo.owner,
              repo: context.repo.repo,
              title: `【自動実行】月次脆弱性診断レポート (${now.getFullYear()}/${now.getMonth() + 1})`,
              body: `@claude 定期脆弱性診断を実行してください。\n\n## 実行日時\n${jstTime}\n\n診断の詳細な観点と出力形式については、CLAUDE.mdの「Vulnerability Scan Guidelines」に従ってください。\n診断結果はこのIssueにコメントで追記してください。`,
              labels: ['security', 'vulnerability-scan', 'automated']
            });

  # --- Job 3: @claude メンションに反応してClaudeを起動するJob ---
  claude-code-action:
    # @claudeという文字が含まれるコメントやIssueが作られた時に動く
    if: |
      (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
      (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
      (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
      (github.event_name == 'issues' && contains(github.event.issue.body, '@claude'))
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
      issues: write
      id-token: write
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          # 全ての履歴ではなく、最新のコードだけを取得して高速化
          fetch-depth: 1

      - name: Run Claude PR Action
        uses: anthropics/claude-code-action@beta # 素晴らしいActionに感謝!
        with:
          # AnthropicのAPIキーをsecretsから読み込む
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          # 長いコードベースでもタイムアウトしにくいように長めに設定
          timeout_minutes: "60"
        id: claude-action

2. Slack通知用の設定 (slack-notification.yml)

次に、脆弱性診断の結果をSlackに通知するための設定です。.github/workflows/slack-notification.yml というファイルを作成し、以下の内容を貼り付けてください。

.github/workflows/slack-notification.yml
name: Slack Vulnerability Monitor

on:
  issue_comment:
    # Issueにコメントが作成または編集された時にトリガー
    types: [created, edited]

# 同時実行の制御
concurrency:
  # 同じIssueに対する通知ワークフローが同時に動かないようにする
  group: ${{ github.workflow }}-${{ github.event.issue.number }}
  # 実行中に新しいトリガーがあった場合、古いものをキャンセルして新しい方を実行
  cancel-in-progress: true

jobs:
  vulnerability-notify:
    # CLAUDE.mdで指定した「診断完了キーワード」と'vulnerability-scan'ラベルが含まれ、
    # かつ、まだSlack通知されていない('slack-notified'ラベルがない)場合に実行
    if: >
      contains(github.event.comment.body, 'VULNERABILITY_SCAN_RESULT:') &&
      !contains(github.event.issue.labels.*.name, 'slack-notified') &&
      contains(github.event.issue.labels.*.name, 'vulnerability-scan')
    runs-on: ubuntu-latest
    permissions:
      contents: read
      issues: write # 通知後にラベルを付けるために'write'権限が必要
    steps:
      - name: Notify Slack
        uses: slackapi/slack-github-action@v1.25.0
        with:
          payload: |
            {
              "text": "🔒 `${{ github.repository }}` の脆弱性診断が完了しました。結果はこちらのIssueを確認してください。\n<${{ github.event.comment.html_url }}|${{ github.event.issue.title }}>"
            }
        env:
          # SlackのWebhook URLをsecretsから読み込む
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}

      - name: Add 'slack-notified' label to issue
        # Slack通知後にラベルを付与して、二重通知を防ぐ
        uses: actions/github-script@v7
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            await github.rest.issues.addLabels({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.issue.number,
              labels: ['slack-notified']
            });

3. 環境変数の設定(Secrets)

上記の設定ファイルで利用したAPIキーなどを、GitHubリポジトリのSecretsに登録します。リポジトリの Settings > Secrets and variables > Actions から登録してください。

  • ANTHROPIC_API_KEY: AnthropicのAPIキー。
  • USER_PAT: GitHubのPersonal Access Token(PAT)。
  • SLACK_WEBHOOK_URL: Slack通知用のIncoming Webhook URL。
    • 取得方法は、こちらのZenn記事などがとても参考になります。インフラ担当の方にお願いするか、プロジェクトのチャンネルに投稿するのが良いでしょう。

【🪏ちょっと深掘り】なぜ USER_PAT が必要なの?

ここは少し大事なポイントなので解説しますね。

GitHub Actionsがプルリクエストにコメントを投稿すると、そのコメントは github-actions というBotによる投稿として扱われます。しかし、Claude Code Actionは、セキュリティ上の理由からBotによるメンションには反応しないように作られています。

そこで、USER_PAT を使って、あたかも人間(あなた)がコメントしたかのように見せることで、Claudeを起動させているのです。ちょっとした工夫ですが、これで自動化がスムーズに動きます。

USER_PAT を発行する際は、必要最小限の権限に留めるのがセキュリティの鉄則です。今回は以下の権限があれば十分です。

  • repoclaude.ymlの実行に必要)
  • issues:write (Issueへのコメント、ラベル付与に必要)
  • pull_requests:write (プルリクエストへのコメントに必要)

設定後の未来:開発プロセスはどう変わる?

これらの設定が完了すると、あなたのチームの開発はこんな風に変わります。

シナリオ1:プルリクエストの自動コードレビュー

  1. メンバーがプルリクエストを作成します。
  2. 即座にGitHub Actionsが起動し、あなたの代理として「@claude このプルリクエストをレビューしてください。」というコメントが自動で投稿されます。
  3. そのコメントをトリガーに、Claudeが起動! CLAUDE.md のルールとソースコード全体を読み込んで、レビューを開始します。
  4. 数分後、Claudeがレビュー結果をプルリクエストにコメントしてくれます。
    • (指摘ありの場合) 改善点を具体的に指摘してくれます。メンバーはそれを読んで修正し、再度コミットをプッシュします。すると、再び自動レビューが走り、修正が正しいかを確認できます。
    • (指摘なしの場合) 「素晴らしいコードです!」といったポジティブなフィードバックが返ってきます。
  5. 人間による最終確認を経て、マージ!

シナリオ2:月次ソースコード脆弱性診断

  1. 毎月1日の朝9時になると、GitHub Actionsが自動で起動します。
  2. 「【自動実行】月次脆弱性診断レポート」というタイトルのIssueが自動で作成されます。Issueの本文には「@claude 定期脆弱性診断を実行してください。」と書かれています。
  3. そのメンションをトリガーに、Claudeが起動!リポジトリ全体のソースコードを対象に、CLAUDE.md の診断ルールに従って脆弱性診断を開始します。
  4. 診断が完了すると、ClaudeがIssueに結果をコメントとして追記します。
  5. そのコメントを検知して、Slack通知用のワークフローが起動します。
  6. 指定したSlackチャンネルに「脆弱性診断が完了しました」という通知が届きます。
  7. チームメンバーは通知を見てIssueを確認し、もし重大な脆弱性が見つかっていれば、すぐに対応計画を立てることができます。

おわりに

いかがだったでしょうか?
AIによる自動化でここまでチーム開発が進歩するとは、私自身も設定しながらワクワクが止まりませんでした。特に、最近のAIモデルの文脈理解能力の高さには、きっと皆さんも驚くはずです。

「AIに仕事を奪われる」のではなく、「AIを最高の相棒にして、人間はより創造的な仕事に集中する」。これからの時代のエンジニアリングは、そういうステージに進んでいくのだと確信しています。

このようなAI活用に積極的に取り組んでいかないと、気づかぬうちに世界の開発スピードから取り残されてしまうかもしれません。それは、企業としても個人としても、非常にもったいないことです。

私たちのチームでは、これからもAIと共に成長し、最高のプロダクトを最速でユーザーに届ける挑戦を続けていきます。この記事が、皆さんのチームがその一歩を踏み出すきっかけになれたら、CTOとしてこれほど嬉しいことはありません。

ぜひ、皆さんのチームでも試してみてください!そして、もしもっと良いアイデアや活用方法があれば、ぜひ教えてくださいね。

Happy Hacking!!🐙


最後に、企業向けサービスのご案内をさせてください🙏

AI・Web3開発サービス

弊社は最先端のAI技術を活用し、高品質かつ短納期での開発サービスを提供しております。特にAI・Web3領域において豊富な実績と専門性を有しており、お客様のデジタルトランスフォーメーションを強力にサポートいたします。

サービスにご関心をお持ちの企業様は、ぜひ弊社ホームページよりお気軽にお問い合わせください。

NeoTechParkコミュニティ連携

弊社が運営するエンジニアコミュニティ「NeoTechPark」には、優秀なインドネシアの若手エンジニアが多数参加しており、活発な技術交流が行われております。

現在、企業様との共同ハッカソン開催による人材発掘・技術交流の取り組みを積極的に推進しております。特に昨今注目を集めているAIエージェントの構築をはじめ、最新のAI技術を活用したソリューション開発に焦点を当てたイベントの企画・運営が可能です。

グローバル人材との協業や次世代AI技術の実用化にご興味のある企業様は、ぜひお声がけいただければ幸いです。


お問い合わせ・ご相談は弊社ホームページよりお待ちしております。

Discussion