Skip to content

feat: Heroku Scheduler から GitHub Actions への定期タスク移行#1803

Merged
yasulab merged 3 commits intomainfrom
migrate-scheduler-to-github-actions
Feb 16, 2026
Merged

feat: Heroku Scheduler から GitHub Actions への定期タスク移行#1803
yasulab merged 3 commits intomainfrom
migrate-scheduler-to-github-actions

Conversation

@yasulab
Copy link
Copy Markdown
Member

@yasulab yasulab commented Feb 16, 2026

概要

Heroku Scheduler から GitHub Actions への定期タスク移行を実施しました。

変更内容

追加

  • .github/workflows/daily.yml - upcoming_events:aggregation タスクを追加(毎日 0:00 UTC / 9:00 JST)
  • .github/workflows/weekly.yml - statistics:aggregation タスクを追加(毎週月曜 1:00 AM UTC / 10:00 AM JST)

更新

  • README.md - Heroku Scheduler から GitHub Actions への移行を反映

採用したアプローチ

✅ アプローチ A: Heroku CLI 経由で本番環境のタスクを実行

- name: 📅 Run upcoming_events:aggregation on Heroku
  run: |
    heroku run rails upcoming_events:aggregation --app $HEROKU_APP_NAME
  env:
    HEROKU_API_KEY:  ${{ secrets.HEROKU_API_KEY  }}
    HEROKU_APP_NAME: ${{ secrets.HEROKU_APP_NAME }}

メリット

  • DATABASE_URL を GitHub Secrets に保存不要
  • ✅ API トークン(Connpass/Doorkeeper)を GitHub Secrets に保存不要
  • ✅ Heroku の環境変数がそのまま使える
  • ✅ ログは Heroku に記録される(アクセス制限あり)
  • ✅ 既存の HEROKU_API_KEYHEROKU_APP_NAME を再利用
  • ✅ より明示的な記述(run:env: より先に配置、--app オプション使用)

検討したが今回は選択しなかったアプローチ

❌ アプローチ B: GitHub Actions 内で直接実行(完全移行)

多くの Rails OSS プロジェクトが採用しているパターン:

name: Scheduled Tasks

on:
  schedule:
    - cron: '5 2 * * *'  # オフセット推奨(高負荷時間を避ける)
  workflow_dispatch:

jobs:
  rake-tasks:
    runs-on: ubuntu-latest
    env:
      RAILS_ENV: production
      DATABASE_URL: ${{ secrets.DATABASE_URL }}
      DOORKEEPER_API_TOKEN: ${{ secrets.DOORKEEPER_API_TOKEN }}
      CONNPASS_API_KEY: ${{ secrets.CONNPASS_API_KEY }}
      SLACK_HOOK_URL: ${{ secrets.SLACK_HOOK_URL }}

    services:
      postgres:
        image: postgres:10.4
        env:
          POSTGRES_PASSWORD: postgres
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    steps:
      - uses: actions/checkout@v4

      - name: Setup Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: '3.3'
          bundler-cache: true

      - name: Run database migrations
        run: bundle exec rails db:migrate

      - name: Run scheduled tasks
        run: |
          bundle exec rails upcoming_events:aggregation
          bundle exec rails statistics:aggregation

メリット

  • ✅ Heroku 不要(将来的な移行が容易)
  • ✅ GitHub Actions で一元管理
  • ✅ ローカル環境と同じ構成でテスト可能

デメリット

  • DATABASE_URL(本番 DB 接続情報)を GitHub Secrets に保存必要
  • ❌ すべての環境変数(API トークンなど)を GitHub Secrets に複製必要
  • ❌ セキュリティリスク:本番 DB への直接接続
  • ❌ GitHub Actions のログがパブリックリポジトリでは公開される可能性

将来的な完全移行の可能性

Heroku からの完全移行を検討する場合、以下のオプションがあります:

  1. Render / Fly.io などへの移行

    • アプローチ B を採用し、新しいホスティングプラットフォームの DB に接続
  2. Sidekiq Cron / SolidQueue の採用

    • Rails アプリ内でスケジューリングを完結
    • GitHub Actions は CI/health-check のみに使用
  3. Docker 化

    • アプリケーションを完全にコンテナ化
    • どのプラットフォームでも動作可能

参考資料

テスト方法

ローカル環境でのテスト

# イベント取得タスクを実行
bundle exec rails upcoming_events:aggregation

# 結果を確認
curl http://localhost:3000/events.json | jq '.[] | select(.name | contains("新居浜") or contains("西条"))'

テスト結果:

  • ✅ タスクは正常に実行完了
  • ✅ 新居浜のイベントを取得: CoderDojo愛媛新居浜 #1 (2026年4月5日)
  • ✅ 西条のイベントを取得: 第2回 CoderDojo 西条 @広島大学 (2026年3月28日)
  • 🔧 西条の Doorkeeper URL を修正(saijo.doorkeeper.jpcoderdojo-saijo.doorkeeper.jp

手動実行テスト

GitHub Actions の UI から手動実行可能:

  1. Actions タブを開く
  2. Daily Workflow または Weekly Workflow を選択
  3. Run workflow ボタンをクリック

期待される動作

  • daily.yml: 毎日 0:00 UTC(日本時間 9:00 AM)に自動実行
  • weekly.yml: 毎週月曜 1:00 AM UTC(日本時間 10:00 AM)に自動実行
  • Heroku の本番環境で rake タスクが実行される
  • エラーが発生した場合、Slack に通知される

チェックリスト

  • GitHub Secrets に HEROKU_API_KEY が設定されている(既存)

  • GitHub Secrets に HEROKU_APP_NAME が設定されている(既存)

  • ローカル環境でタスク実行をテスト

  • PR マージ後、手動実行でテスト

    # Actions タブから手動実行、または
    gh workflow run daily.yml
    gh workflow run weekly.yml
    image
  • 1週間後、自動実行が正常に動作していることを確認 → エラーが出たら随時対応

    # 最近の実行履歴を確認(成功しているか)
    gh run list --workflow=daily.yml --limit 5
    gh run list --workflow=weekly.yml --limit 5
    
    # 最新の実行ログを確認
    gh run view --log
  • Heroku Scheduler の設定を削除 (復元用にメモ)

    • image
    • [ $(date +%u) = 1 ] && bundle exec rails statistics:aggregation (Every day at 1am UTC)
    • bundle exec rails upcoming_events:aggregation (Every dat at 9pm UTC)

- daily.yml に upcoming_events:aggregation タスクを追加(毎日 0:00 UTC / 9:00 JST)
- weekly.yml を新規作成し statistics:aggregation タスクを追加(毎週月曜 1:00 AM UTC / 10:00 AM JST)
- README.md を更新し、Heroku Scheduler から GitHub Actions への移行を反映
- レビュー時に実行内容が最初に見えるように run を先に配置
- -a オプションを --app に変更(より明示的)
- 1行で収まるコマンドは行継続を削除
- saijo.doorkeeper.jp → coderdojo-saijo.doorkeeper.jp
- 正しい URL に修正してイベント取得を可能にする
@yasulab yasulab merged commit 971e46a into main Feb 16, 2026
5 checks passed
@yasulab yasulab deleted the migrate-scheduler-to-github-actions branch February 16, 2026 03:52
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