Deploy #35
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Deploy | |
on: | |
push: | |
tags: | |
- 'v*' | |
workflow_dispatch: | |
inputs: | |
run_migrations: | |
description: 'Run database migrations' | |
type: boolean | |
required: true | |
default: false | |
deploy_email_worker: | |
description: 'Deploy email Worker' | |
type: boolean | |
required: true | |
default: false | |
deploy_cleanup_worker: | |
description: 'Deploy cleanup Worker' | |
type: boolean | |
required: true | |
default: false | |
jobs: | |
deploy: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 # Get full git history for checking file changes | |
- name: Get previous tag | |
id: previoustag | |
if: github.event_name == 'push' | |
run: | | |
echo "tag=$(git describe --tags --abbrev=0 HEAD^)" >> $GITHUB_OUTPUT | |
continue-on-error: true | |
- name: Setup pnpm | |
uses: pnpm/action-setup@v2 | |
with: | |
version: 9 | |
- name: Setup Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: '20' | |
cache: 'pnpm' | |
- name: Install Dependencies | |
run: pnpm install --frozen-lockfile | |
# Check if database migrations have changes | |
- name: Check migrations changes | |
id: check_migrations | |
if: github.event_name == 'push' | |
run: | | |
if [ -z "${{ steps.previoustag.outputs.tag }}" ]; then | |
echo "migrations_changed=true" >> $GITHUB_OUTPUT | |
else | |
if git diff ${{ steps.previoustag.outputs.tag }}..HEAD --name-only | grep -q "^drizzle/"; then | |
echo "migrations_changed=true" >> $GITHUB_OUTPUT | |
else | |
echo "migrations_changed=false" >> $GITHUB_OUTPUT | |
fi | |
fi | |
# Process configuration files | |
- name: Process configuration files | |
run: | | |
# Process wrangler.example.toml | |
if [ -f wrangler.example.toml ]; then | |
cp wrangler.example.toml wrangler.toml | |
sed -i "s/database_name = \".*\"/database_name = \"${{ secrets.DATABASE_NAME }}\"/" wrangler.toml | |
sed -i "s/database_id = \".*\"/database_id = \"${{ secrets.DATABASE_ID }}\"/" wrangler.toml | |
sed -i "s/id = \".*\"/id = \"${{ secrets.KV_NAMESPACE_ID }}\"/" wrangler.toml | |
fi | |
# Process wrangler.email.example.toml | |
if [ -f wrangler.email.example.toml ]; then | |
cp wrangler.email.example.toml wrangler.email.toml | |
sed -i "s/database_name = \".*\"/database_name = \"${{ secrets.DATABASE_NAME }}\"/" wrangler.email.toml | |
sed -i "s/database_id = \".*\"/database_id = \"${{ secrets.DATABASE_ID }}\"/" wrangler.email.toml | |
fi | |
# Process wrangler.cleanup.example.toml | |
if [ -f wrangler.cleanup.example.toml ]; then | |
cp wrangler.cleanup.example.toml wrangler.cleanup.toml | |
sed -i "s/database_name = \".*\"/database_name = \"${{ secrets.DATABASE_NAME }}\"/" wrangler.cleanup.toml | |
sed -i "s/database_id = \".*\"/database_id = \"${{ secrets.DATABASE_ID }}\"/" wrangler.cleanup.toml | |
fi | |
# Run database migrations if needed | |
- name: Run database migrations | |
if: | | |
github.event_name == 'push' && steps.check_migrations.outputs.migrations_changed == 'true' || | |
github.event_name == 'workflow_dispatch' && github.event.inputs.run_migrations == 'true' | |
env: | |
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} | |
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} | |
run: pnpm db:migrate-remote | |
# Check if workers have changes | |
- name: Check workers changes | |
id: check_changes | |
if: github.event_name == 'push' | |
run: | | |
if [ -z "${{ steps.previoustag.outputs.tag }}" ]; then | |
# Check email worker and its dependencies | |
if git ls-files | grep -q -E "workers/email-receiver.ts|app/lib/schema.ts|app/lib/webhook.ts|app/config/webhook.ts"; then | |
echo "email_worker_changed=true" >> $GITHUB_OUTPUT | |
else | |
echo "email_worker_changed=false" >> $GITHUB_OUTPUT | |
fi | |
# Check cleanup worker | |
if git ls-files | grep -q "workers/cleanup.ts"; then | |
echo "cleanup_worker_changed=true" >> $GITHUB_OUTPUT | |
else | |
echo "cleanup_worker_changed=false" >> $GITHUB_OUTPUT | |
fi | |
else | |
# Check email worker and its dependencies changes | |
if git diff ${{ steps.previoustag.outputs.tag }}..HEAD --name-only | grep -q -E "workers/email-receiver.ts|app/lib/schema.ts|app/lib/webhook.ts|app/config/webhook.ts"; then | |
echo "email_worker_changed=true" >> $GITHUB_OUTPUT | |
else | |
echo "email_worker_changed=false" >> $GITHUB_OUTPUT | |
fi | |
# Check cleanup worker changes | |
if git diff ${{ steps.previoustag.outputs.tag }}..HEAD --name-only | grep -q "workers/cleanup.ts"; then | |
echo "cleanup_worker_changed=true" >> $GITHUB_OUTPUT | |
else | |
echo "cleanup_worker_changed=false" >> $GITHUB_OUTPUT | |
fi | |
fi | |
# Deploy Pages application | |
- name: Deploy Pages | |
env: | |
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} | |
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} | |
run: pnpm run deploy:pages | |
# Deploy email worker if changed or manually triggered | |
- name: Deploy Email Worker | |
if: | | |
github.event_name == 'push' && steps.check_changes.outputs.email_worker_changed == 'true' || | |
github.event_name == 'workflow_dispatch' && github.event.inputs.deploy_email_worker == 'true' | |
env: | |
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} | |
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} | |
run: pnpm run deploy:email | |
# Deploy cleanup worker if changed or manually triggered | |
- name: Deploy Cleanup Worker | |
if: | | |
github.event_name == 'push' && steps.check_changes.outputs.cleanup_worker_changed == 'true' || | |
github.event_name == 'workflow_dispatch' && github.event.inputs.deploy_cleanup_worker == 'true' | |
env: | |
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} | |
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} | |
run: pnpm run deploy:cleanup |