Skip to content

PR作成完了時に振り返りを促すPostToolUseフックを追加 #621

PR作成完了時に振り返りを促すPostToolUseフックを追加

PR作成完了時に振り返りを促すPostToolUseフックを追加 #621

Workflow file for this run

name: Setup Preview
on:
pull_request:
types: [opened, reopened, synchronize, labeled]
jobs:
setup-and-deploy:
name: Setup Database and Deploy to Vercel
runs-on: ubuntu-latest
timeout-minutes: 15
# with-previewラベルがある場合のみ実行
if: contains(github.event.pull_request.labels.*.name, 'with-preview')
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Setup workspace
uses: ./.github/actions/setup-workspace
- name: Pull Vercel Environment
env:
VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
run: |
npx vercel pull --yes --environment=preview --token=$VERCEL_TOKEN
- name: Set APP_ENV
id: app-env
env:
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
APP_ENV="preview-pr${PR_NUMBER}"
echo "app_env=${APP_ENV}" >> $GITHUB_OUTPUT
echo "APP_ENV=${APP_ENV}" >> $GITHUB_ENV
- name: Cleanup Existing Preview Databases
env:
TURSO_PLATFORM_API_TOKEN: ${{ secrets.TURSO_PLATFORM_API_TOKEN }}
TURSO_ORGANIZATION: ${{ secrets.TURSO_ORG_SLUG }}
run: |
set -a
source .vercel/.env.preview.local
set +a
CURRENT_PR_PREFIX="next-lift-${APP_ENV}-"
echo "::group::Listing all preview databases"
echo "Current PR prefix (to keep): ${CURRENT_PR_PREFIX}"
if ! DATABASES=$(pnpm --silent --filter @next-lift/turso run db:list --prefix="next-lift-preview-pr"); then
echo "::warning::Failed to list databases, skipping cleanup"
exit 0
fi
echo "Found databases:"
echo "${DATABASES:- (none)}"
echo "::endgroup::"
if [ -z "$DATABASES" ]; then
echo "No preview databases found"
exit 0
fi
KEEP_COUNT=0
DELETE_COUNT=0
echo "::group::Processing databases"
for DB_NAME in $DATABASES; do
if [[ "$DB_NAME" == ${CURRENT_PR_PREFIX}* ]]; then
echo " ⏭ Keeping: ${DB_NAME}"
KEEP_COUNT=$((KEEP_COUNT + 1))
continue
fi
echo " 🗑 Deleting: ${DB_NAME}"
if pnpm --silent --filter @next-lift/turso run db:delete --name="${DB_NAME}"; then
echo " ✓ Deleted"
DELETE_COUNT=$((DELETE_COUNT + 1))
else
echo " ✗ Failed to delete"
fi
done
echo "::endgroup::"
echo ""
echo "=== Summary ==="
echo "Kept (current PR): ${KEEP_COUNT}"
echo "Deleted (old PRs): ${DELETE_COUNT}"
- name: Create Preview Database
id: create-db
env:
TURSO_PLATFORM_API_TOKEN: ${{ secrets.TURSO_PLATFORM_API_TOKEN }}
TURSO_ORGANIZATION: ${{ secrets.TURSO_ORG_SLUG }}
run: |
set -a
source .vercel/.env.preview.local
set +a
DB_NAME="next-lift-${APP_ENV}-auth"
# データベースを作成
CREATE_OUTPUT=$(pnpm --filter @next-lift/turso run db:create --name="${DB_NAME}" 2>&1) || {
# 既に存在する場合はエラーになるが続行
echo "Database creation output: ${CREATE_OUTPUT}"
echo "Database may already exist, continuing..."
}
echo "Database creation output: ${CREATE_OUTPUT}"
# Hostnameを取得(出力から抽出)
DB_HOSTNAME=$(echo "${CREATE_OUTPUT}" | grep "Hostname:" | sed 's/.*Hostname: //')
# 既に存在する場合は、データベース情報を取得
if [ -z "${DB_HOSTNAME}" ]; then
echo "Fetching existing database info..."
GET_RESPONSE=$(curl -s \
-H "Authorization: Bearer ${TURSO_PLATFORM_API_TOKEN}" \
"https://api.turso.tech/v1/organizations/${TURSO_ORGANIZATION}/databases/${DB_NAME}")
echo "Database get response: ${GET_RESPONSE}"
DB_HOSTNAME=$(echo "${GET_RESPONSE}" | jq -r '.database.Hostname')
fi
DB_URL="libsql://${DB_HOSTNAME}"
echo "Database URL: ${DB_URL}"
echo "db_name=${DB_NAME}" >> $GITHUB_OUTPUT
echo "db_url=${DB_URL}" >> $GITHUB_ENV
- name: Create Database Token
id: create-token
env:
TURSO_PLATFORM_API_TOKEN: ${{ secrets.TURSO_PLATFORM_API_TOKEN }}
TURSO_ORGANIZATION: ${{ secrets.TURSO_ORG_SLUG }}
DB_NAME: ${{ steps.create-db.outputs.db_name }}
run: |
set -a
source .vercel/.env.preview.local
set +a
# データベースアクセス用のトークンを作成(期限なし)
TOKEN_OUTPUT=$(pnpm --filter @next-lift/turso run db:issue-token --name="${DB_NAME}" 2>&1)
echo "Token creation completed (hidden for security)"
# トークンを取得(出力から抽出)
DB_AUTH_TOKEN=$(echo "${TOKEN_OUTPUT}" | grep "JWT:" | sed 's/.*JWT: //')
echo "db_auth_token=${DB_AUTH_TOKEN}" >> $GITHUB_ENV
- name: Check Environment Variables
env:
PREVIEW_URL: https://preview-next-lift.vercel.app
run: |
set -a
source .vercel/.env.preview.local
set +a
export BETTER_AUTH_URL="${PREVIEW_URL}"
export TURSO_AUTH_DATABASE_URL="${db_url}"
export TURSO_AUTH_DATABASE_AUTH_TOKEN="${db_auth_token}"
pnpm --filter @next-lift/env check || {
echo "::error::環境変数の検証に失敗しました。Vercelの環境変数設定を確認してください。"
exit 1
}
- name: Run Database Migration
run: |
# 認証データベースのマイグレーションを実行
cd packages/authentication
TURSO_AUTH_DATABASE_URL="${db_url}" \
TURSO_AUTH_DATABASE_AUTH_TOKEN="${db_auth_token}" \
pnpm migration:apply
echo "Migration completed successfully"
- name: Deploy to Vercel
env:
VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
PREVIEW_URL: https://preview-next-lift.vercel.app
run: |
echo "" >> .vercel/.env.preview.local
echo "APP_ENV=\"${APP_ENV}\"" >> .vercel/.env.preview.local
echo "BETTER_AUTH_URL=\"${PREVIEW_URL}\"" >> .vercel/.env.preview.local
echo "TURSO_AUTH_DATABASE_URL=\"${db_url}\"" >> .vercel/.env.preview.local
echo "TURSO_AUTH_DATABASE_AUTH_TOKEN=\"${db_auth_token}\"" >> .vercel/.env.preview.local
set -a
source .vercel/.env.preview.local
set +a
npx vercel build --token=$VERCEL_TOKEN
npx vercel deploy --prebuilt --archive=tgz --token=$VERCEL_TOKEN \
--env APP_ENV="${APP_ENV}" \
--env BETTER_AUTH_URL="${PREVIEW_URL}" \
--env TURSO_AUTH_DATABASE_URL="${db_url}" \
--env TURSO_AUTH_DATABASE_AUTH_TOKEN="${db_auth_token}" \
> deployment-url.txt
npx vercel alias $(cat deployment-url.txt) preview-next-lift.vercel.app --token=$VERCEL_TOKEN
echo "DEPLOYMENT_URL=${PREVIEW_URL}" >> $GITHUB_ENV
- name: Comment PR with Preview Info
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
script: |
const dbName = '${{ steps.create-db.outputs.db_name }}';
const dbUrl = process.env.db_url;
const deploymentUrl = process.env.DEPLOYMENT_URL;
const body = [
'## 🚀 Preview Environment Ready',
'',
'✅ プレビュー環境のセットアップが完了しました!',
'',
'### 🗄️ Database',
`**Name**: ${dbName}`,
`**URL**: ${dbUrl}`,
'',
'### 🌐 Deployment',
`**Preview URL**: ${deploymentUrl}`,
'',
'> ⚠️ このデータベースとデプロイメントはPRがクローズされると自動的に削除されます。'
].join('\n');
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: body
});