コンテンツにスキップ

Claude Codeスケジュール実行完全ガイド - GitHub Actions Scheduledで自動化

この記事の対象者

  • Claude Codeを定期実行したい中級者開発者

この記事のポイント

  1. GitHub Actions scheduledの基本設定方法
  2. Claude Code APIを使った自動化スクリプトの実装
  3. 実際に動作するワークフローファイルのコード

問題の核心

cronでClaude Codeを定期実行しようとすると、認証管理やエラーハンドリングが複雑になり、メンテナンスが困難になります。GitHub Actions scheduledなら、シークレット管理、ログ管理、エラー通知が統合され、現代的なCI/CDパイプラインで安全に自動化できます。

解決方法

ステップ1: GitHub Actionsワークフローファイルを作成

.github/workflows/claude-scheduled.ymlを作成し、以下のコードを追加:

name: Claude Code Scheduled
on:
  schedule:
    - cron: '0 9 * * 1-5'  # 平日午前9時
jobs:
  claude-automation:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run Claude automation
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: python scripts/claude_automation.py

ステップ2: 自動化スクリプトの実装

scripts/claude_automation.pyを作成し、基本的なClaude API呼び出しを設定:

import os
import anthropic

client = anthropic.Anthropic(api_key=os.getenv('ANTHROPIC_API_KEY'))

def run_daily_analysis():
    response = client.messages.create(
        model="claude-3-sonnet-20240229",
        max_tokens=1000,
        messages=[{"role": "user", "content": "今日のタスクを分析してください"}]
    )
    return response.content

if __name__ == "__main__":
    result = run_daily_analysis()
    print(result)

ステップ3: シークレット設定とテスト実行

GitHubリポジトリ設定でANTHROPICAPIKEYを登録し、手動トリガーで動作確認:

on:
  schedule:
    - cron: '0 9 * * 1-5'
  workflow_dispatch:  # 手動実行用

よくあるトラブルと対処法

症状原因解決策
API認証エラーシークレット設定不備Settings > Secrets > ActionsでAPIキー確認
実行されないcronタイムゾーン問題UTC時間で設定(JST-9時間)
ログが見えないprint文が出力されないprint(result, flush=True)を使用
詳細設定(上級者向け・クリックで展開) ## 高度なスケジュール設定
on:
  schedule:
    # 毎週月曜9時にレポート生成
    - cron: '0 0 * * 1'
    # 毎日12時にチェック
    - cron: '0 3 * * *'
  workflow_dispatch:
    inputs:
      task_type:
        description: 'Task type to run'
        required: true
        default: 'analysis'
        type: choice
        options:
        - analysis
        - report
        - cleanup
## エラー通知設定
- name: Notify on failure
  if: failure()
  uses: 8398a7/action-slack@v3
  with:
    status: failure
    webhook_url: ${{ secrets.SLACK_WEBHOOK }}

次のステップ