統計ロードマップ
2026-04-30·実装·⏱ 約 7

GitHub Actions で ML プロジェクトに CI/CD を ─ 30 分入門

テスト ・ Lint ・ モデル学習 ・ 自動デプロイ を GitHub Actions で自動化する手順。Python ML プロジェクトのテンプレートをそのまま流用できる形で。

GitHub Actions は GitHub リポジトリに付属する CI/CD 基盤。`.github/workflows/*.yml` を置くだけで自動実行され、Pull Request チェック ・ 自動デプロイ ・ 定期実行など何でもできます。MLOps の入口として最適。

Hello World ─ Lint と Test

.github/workflows/ci.yml
name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.12'
          cache: 'pip'

      - name: Install
        run: pip install -r requirements.txt -r requirements-dev.txt

      - name: Lint
        run: ruff check .

      - name: Type check
        run: mypy src

      - name: Test
        run: pytest -v --cov=src

コミット push → 自動で Lint ・ 型チェック ・ テストが走る。失敗すれば PR がブロックされる。

ML 学習パイプライン

.github/workflows/train.yml
name: Train Model

on:
  push:
    paths:
      - 'data/**'
      - 'src/train.py'

jobs:
  train:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.12'

      - name: Install
        run: pip install -r requirements.txt

      - name: Pull data with DVC
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        run: dvc pull

      - name: Train
        run: python src/train.py

      - name: Evaluate
        run: |
          python src/evaluate.py --threshold 0.85

      - name: Upload model
        uses: actions/upload-artifact@v4
        with:
          name: model
          path: model.pkl

シークレット管理

API キー ・ AWS 認証情報 ・ DB パスワードは GitHub Secrets に保管。`Settings → Secrets and variables → Actions` から登録 → `${{ secrets.NAME }}` で参照。

定期実行(Cron)

毎週月曜の朝にモデル再学習
on:
  schedule:
    - cron: '0 9 * * 1'  # UTC 9:00 月曜 = 日本 18:00 月曜

自動デプロイ ─ Vercel と連携

Vercel デプロイ
name: Deploy to Vercel

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: amondnet/vercel-action@v25
        with:
          vercel-token: ${{ secrets.VERCEL_TOKEN }}
          vercel-org-id: ${{ secrets.ORG_ID }}
          vercel-project-id: ${{ secrets.PROJECT_ID }}
          vercel-args: '--prod'

Vercel の方が先に GitHub と連携している場合は、push だけで自動デプロイされるので Action は不要です。詳しくは [Vercel デプロイ](/blog/vercel-deployment-for-ai)。

PR にモデル評価結果をコメント

コメント付き PR
      - name: Comment metrics
        if: github.event_name == 'pull_request'
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const metrics = JSON.parse(fs.readFileSync('metrics.json'));
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: `## 📊 評価結果\n\n- Accuracy: ${metrics.accuracy}\n- F1: ${metrics.f1}`,
            });

Tips

  • キャッシュ活用: pip ・ npm ・ DVC のキャッシュで高速化
  • Matrix ビルド: Python 3.10/3.11/3.12 の並列テスト
  • Self-hosted runner: 大規模学習は GPU マシンを自社運用
  • Concurrency 制御: 同じブランチの古い実行をキャンセル
  • 通知: Slack ・ Discord 連携で失敗時にアラート

学習リソース

  • [MLOps 基礎](/blog/mlops-basics)
  • [Vercel デプロイ](/blog/vercel-deployment-for-ai)
  • [scikit-learn 入門](/blog/sklearn-introduction)
  • [Python 環境構築](/blog/python-setup-for-stats)

まとめ

GitHub Actions は Push したら自動で全部やる を最小コストで実現する魔法。CI/CD の習得は ML エンジニアの基礎体力です。

Related Articles

関連記事