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 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 }} NEXT_PUBLIC_EMAIL_DOMAIN: ${{ secrets.NEXT_PUBLIC_EMAIL_DOMAIN || vars.NEXT_PUBLIC_EMAIL_DOMAIN }} 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