コンテンツにスキップ

Codex CLI 自動化ワークフロー3パターン|GitHub Actions・cron・CI統合

Codex CLI 完全ガイド

この記事の対象者

  • CI/CD運用経験があり、Codex CLIの基本操作を理解している中級開発者

この記事のポイント

  1. GitHub ActionsでCodex CLIを自動実行(定期実行・PRトリガー)
  2. cronジョブでの夜間バッチ処理とログ管理
  3. CI/CDパイプラインへの統合と失敗時のリトライ設計

なぜこの問題が今重要か

Codex CLI利用者の多くが「設計原則」を超えた具体的な自動化統合パターンを求めている。本記事は既存の原則解説(codex-cli-best-practices.md)を補完し、実運用で即使えるワークフロー実装に特化。

解決ステップ概要

ステップ内容到達指標
1GitHub Actions統合(定期実行・PRトリガー)ワークフローが実行される
2cronジョブ統合(夜間バッチ・ログ管理)crontabエントリ動作確認
3CI/CDパイプライン統合(失敗時リトライ)ビルドステップ成功

ステップ1: GitHub Actions統合パターン

定期実行(毎日午前6時に自動タスク)

name: Codex Daily Automation
on:
  schedule:
    - cron: '0 21 * * *'  # UTC 21:00 = JST 06:00

jobs:
  auto-update:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install Codex CLI
        run: |
          npm install -g @openai/codex-cli
          codex --version

      - name: Run Automated Task
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
        run: |
          codex --full-auto \
            --log-file ./codex.log \
            "Update dependencies and run tests" || echo "Task failed but continuing"

      - name: Commit Changes
        run: |
          git config user.name "Codex Bot"
          git config user.email "bot@example.com"
          git add -A
          git diff --staged --quiet || git commit -m "🤖 Automated update by Codex CLI"
          git push

ポイント: - --full-autoで全操作を自動承認(セキュアなCI環境前提) - || echo "..." でエラー時もワークフローを継続(失敗通知は別ステップで処理) - コミット前にgit diff --staged --quietで空コミット防止

PRトリガー(レビュー自動化)

name: Codex PR Review
on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Install Codex CLI
        run: npm install -g @openai/codex-cli

      - name: Auto Review PR
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
        run: |
          git diff origin/$GITHUB_BASE_REF...HEAD > diff.txt
          codex --approval never --sandbox workspace-write \
            "Review this PR diff and suggest improvements: $(cat diff.txt)" \
            > review.md

      - name: Post Review Comment
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const review = fs.readFileSync('review.md', 'utf8');
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: review
            });

ステップ2: cronジョブ統合パターン

夜間バッチ処理(ログ管理付き)

# crontab -e
0 3 * * * /home/user/scripts/codex-nightly.sh >> /var/log/codex-nightly.log 2>&1

codex-nightly.sh 実装例:

#!/bin/bash
set -euo pipefail

LOG_DIR="/var/log/codex"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOG_FILE="${LOG_DIR}/codex_${TIMESTAMP}.log"

mkdir -p "$LOG_DIR"

echo "$(date): Starting Codex nightly task" | tee -a "$LOG_FILE"

cd /path/to/project || exit 1

# 自動承認モードで実行(失敗時は3回リトライ)
for i in {1..3}; do
  if codex --full-auto \
      --log-file "$LOG_FILE" \
      "Analyze codebase and update documentation"; then
    echo "$(date): Success on attempt $i" | tee -a "$LOG_FILE"
    break
  else
    echo "$(date): Attempt $i failed, retrying..." | tee -a "$LOG_FILE"
    sleep 30
  fi
done

# 7日以上前のログを削除
find "$LOG_DIR" -name "codex_*.log" -mtime +7 -delete

echo "$(date): Task completed" | tee -a "$LOG_FILE"

失敗時の通知(オプション):

# 失敗時にSlack通知
if ! codex ...; then
  curl -X POST https://hooks.slack.com/services/YOUR/WEBHOOK/URL \
    -d '{"text":"Codex nightly task failed"}' || true
fi

ステップ3: CI/CDパイプライン統合パターン

GitLab CI例(テスト自動修正)

stages:
  - test
  - fix

run_tests:
  stage: test
  script:
    - npm test
  allow_failure: true
  artifacts:
    reports:
      junit: test-results.xml

auto_fix:
  stage: fix
  when: on_failure
  dependencies:
    - run_tests
  script:
    - npm install -g @openai/codex-cli
    - |
      codex --approval never --sandbox workspace-write \
        "Fix failing tests based on test-results.xml" || exit 0
    - git add -A
    - git diff --staged --quiet || git commit -m "🤖 Auto-fix by Codex"
    - git push origin HEAD:$CI_COMMIT_REF_NAME

Jenkins Pipeline例(ビルド失敗時の自動調査)

pipeline {
  agent any
  stages {
    stage('Build') {
      steps {
        sh 'npm run build'
      }
    }
    stage('Auto-Diagnose on Failure') {
      when { expression { currentBuild.result == 'FAILURE' } }
      steps {
        sh '''
          codex --full-auto \
            "Analyze build failure logs and suggest fixes: $(cat build.log)" \
            > diagnosis.txt
          cat diagnosis.txt
        '''
      }
    }
  }
}

ステップ4: ノーコード/ローコードでの自動化(Skills & Automations)

スクリプトやCIを直接組む前段階として、Codex AppやCLIの機能を使った簡易自動化も強力な選択肢になります。

Skills(スキル)による定型作業のパッケージ化

よく繰り返す作業(ログ解析、リリースノート作成、定型レビューなど)は毎回プロンプトを書くのではなく、SKILL.md としてパッケージ化します。

  • $skill-creator を使って対話的に作成
  • 個人のスキルは $HOME/.agents/skills に、チーム共有のスキルはリポジトリの .agents/skills に配置
  • ベストプラクティス: 1つのスキルは1つの仕事に特化させ、具体的な入力・出力・トリガーフレーズを定義する。

Automations(定期実行)

CLIで安定して動くようになったワークフロー(スキル含む)は、Codex Appの「Automations」タブでスケジュール実行できます。

  • 利用例: 毎朝のスタンドアップサマリ作成、最新コミットの要約、定期的なバグ検出
  • 独自のGit worktreeやローカル環境での実行が選択可能で、スクリプトを書かずに手軽なcronジョブとして機能します。

よくある落とし穴と対処

症状原因即時対処
GitHub Actionsで権限エラートークンスコープ不足GITHUB_TOKENcontents: write 権限を追加
cronで実行されない環境変数未設定crontabに OPENAI_API_KEY=/path/to/key を明記 or シェルスクリプトで source ~/.bashrc
CI/CDで無限ループコミットがトリガーを再実行ワークフロー内コミットメッセージに [skip ci] を付与
ログファイルが肥大化古いログ未削除上記シェルスクリプトの find ... -mtime +7 -delete を実装
詳細設定(高度最適化) ### 承認ポリシーの細かい制御
# ファイル書き込みのみ自動承認(ネットワークは手動)
codex --approval never \
      --sandbox workspace-write \
      --allow-file-write \
      "Task description"

# 特定ディレクトリ外へのアクセス禁止
codex --approval never \
      --sandbox custom \
      --allowed-paths ./src,./tests \
      "Task description"
### 複数タスクの連鎖実行
#!/bin/bash
TASKS=(
  "Update package dependencies"
  "Run security audit and fix"
  "Update changelog"
)

for task in "${TASKS[@]}"; do
  echo "Executing: $task"
  codex --full-auto "$task" || {
    echo "Failed: $task"
    exit 1
  }
done
### API利用量の監視
# OpenAI APIの利用状況を定期チェック(要API key)
codex --approval never "Check current API usage" | \
  grep -oP '(?<=tokens: )\d+' > usage.txt

次に読む