diff --git a/.github/workflows/deploy-preview.yml b/.github/workflows/deploy-preview.yml new file mode 100644 index 0000000..587125d --- /dev/null +++ b/.github/workflows/deploy-preview.yml @@ -0,0 +1,113 @@ +name: Deploy [Preview] +on: + pull_request: + types: [opened, synchronize, reopened, closed] + +jobs: + deploy: + if: github.event.action != 'closed' + runs-on: ubuntu-latest + permissions: + contents: read + deployments: write + pull-requests: write + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Create GitHub Deployment + id: deployment + uses: actions/github-script@v7 + with: + script: | + const deployment = await github.rest.repos.createDeployment({ + owner: context.repo.owner, + repo: context.repo.repo, + ref: context.payload.pull_request.head.ref, + environment: 'Preview', + required_contexts: [], + auto_merge: false, + description: 'Deploying to Cloudflare Pages' + }); + return deployment.data.id; + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies + run: bun install + + - name: Build + run: bun run build + + - name: Deploy to Cloudflare Pages + id: cloudflare + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: pages deploy dist --project-name=${{ secrets.CLOUDFLARE_PROJECT_NAME }} --branch=${{ github.event.pull_request.head.ref }} + + - name: Update deployment status + if: always() + uses: actions/github-script@v7 + with: + script: | + const isSuccess = '${{ steps.cloudflare.outcome }}' === 'success'; + const state = isSuccess ? 'success' : 'failure'; + const description = isSuccess + ? 'Deployed successfully' + : 'Deployment failed'; + + const data = { + owner: context.repo.owner, + repo: context.repo.repo, + deployment_id: ${{ steps.deployment.outputs.result }}, + state: state, + description, + environment: 'Preview', + environment_url: isSuccess ? '${{ steps.cloudflare.outputs.deployment-alias-url }}' : null + }; + + await github.rest.repos.createDeploymentStatus(data); + + cleanup: + if: github.event.action == 'closed' + runs-on: ubuntu-latest + permissions: + contents: read + deployments: write + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Delete Cloudflare Pages deployment + continue-on-error: true + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: pages deployment delete --project-name=${{ secrets.CLOUDFLARE_PROJECT_NAME }} --branch=${{ github.event.pull_request.head.ref }} + + - name: Mark GitHub deployments as inactive + uses: actions/github-script@v7 + with: + script: | + const deployments = await github.rest.repos.listDeployments({ + owner: context.repo.owner, + repo: context.repo.repo, + ref: context.payload.pull_request.head.ref, + environment: 'Preview' + }); + + for (const deployment of deployments.data) { + await github.rest.repos.createDeploymentStatus({ + owner: context.repo.owner, + repo: context.repo.repo, + deployment_id: deployment.id, + state: 'inactive', + description: 'PR closed, deployment cleaned up' + }); + } diff --git a/.github/workflows/deploy-prod.yml b/.github/workflows/deploy-prod.yml new file mode 100644 index 0000000..52c31af --- /dev/null +++ b/.github/workflows/deploy-prod.yml @@ -0,0 +1,35 @@ +name: Deploy +on: + push: + branches: + - main + +jobs: + deploy: + runs-on: ubuntu-latest + permissions: + contents: read + deployments: write + pull-requests: write + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies + run: bun install + + - name: Build + run: bun run build + + - name: Deploy to Cloudflare Pages + id: cloudflare + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: pages deploy dist --project-name=${{ secrets.CLOUDFLARE_PROJECT_NAME }}