GitHub Action Rerunner
초무 @2chanhaeng@hackers.pub
GitHub Action Rerunner
失敗したGitHub Actionsをチームメンバーが直接再実行できるように権限を委任するウェブアプリケーションです。
🎯 なぜ作ったのか?
GitHub Actionsが失敗した場合、再実行するには対象リポジトリに対するWrite権限が必要です。しかし、セキュリティ上の理由からすべてのチームメンバーにWrite権限を与えることは難しいです。
GitHub Action Rerunnerはこの問題を解決します。リポジトリのオーナーがトークンを登録すれば、チームメンバーは自分に割り当てられたPRの失敗したActionのみを再実行でき、リポジトリに対する直接的な権限なしでもCI/CDを再度実行できます!
✨ 主な機能
リポジトリオーナー (Owner)
- 📦 個人および組織リポジトリの登録
- 🔑 GitHub Personal Access Tokenの登録(暗号化保存)
- 🔗 共有可能な固有リンクの生成
- 👀 すべての失敗したPRの確認と再実行
- ⚙️ リポジトリ設定の管理
チームメンバー (Assignee)
- 📋 自分に割り当てられたPRリストの確認
- 🔄 失敗したGitHub Actionをワンクリックで再実行
- 📊 ワークフローステータスのリアルタイム確認
アカウント管理
- 🔐 GitHub OAuth ログイン
- 👥 複数のGitHubアカウント連携サポート
- 🔀 アカウント間の簡単な切り替え
🛠 技術スタック
- Frontend: Next.js 16 (App Router), React 19, Tailwind CSS 4
- Backend: Next.js API Routes
- Authentication: NextAuth.js v5 (GitHub OAuth)
- Database: PostgreSQL + Prisma ORM
- GitHub API: Octokit
🚀 直接デプロイする方法
現在のプロジェクトは既にデプロイされていますが、機密性の高いトークンを扱うため、直接デプロイしたい場合は以下のガイドを参考にしてください。
1. リポジトリのプル
リポジトリを取得します。
2. 環境変数の設定
.envファイルを作成し、以下の値を設定してください:
# DB (PostgreSQL)
DATABASE_URL="postgresql://..."
DIRECT_URL="postgresql://..."
# NextAuth.js
AUTH_SECRET="use `npx auth secret`"
AUTH_GITHUB_ID="your-github-oauth-app-id"
AUTH_GITHUB_SECRET="your-github-oauth-app-secret"
# Token Encryption (32文字)
ENCRYPTION_KEY="your-32-character-encryption-key"
3. GitHub OAuth Appの作成
- GitHub Developer SettingsでOAuth Appを作成
- Authorization callback URL:
http://localhost:3000/api/auth/callback/github - Client IDとClient Secretを環境変数に設定
4. 開発サーバーの実行
# 依存関係のインストール
pnpm install
# Prismaクライアントの生成
npx prisma generate
# データベースマイグレーション
npx prisma migrate dev
# 開発サーバーの実行
pnpm dev
http://localhost:3000で確認してください。
📖 使用方法
リポジトリの登録(オーナー)
- GitHubでログイン
- ダッシュボード → リポジトリ登録
- 登録するリポジトリを選択
- 設定ページでPersonal Access Tokenを登録
- トークンには
repoおよびactions権限が必要
- トークンには
- 生成されたリンクをチームメンバーと共有
Actionの再実行(チームメンバー)
- 共有されたリンクにアクセス
- GitHubでログイン
- 自分に割り当てられたPRリストを確認
- 失敗したワークフロー横の「Rerun」ボタンをクリック
🔒 セキュリティ
- Personal Access TokenはAES-256-GCMで暗号化して保存されます。
- チームメンバーは自分に割り当てられたPRのActionのみ再実行できます。
- すべてのAPIリクエストはセッションベースの認証を経ます。