diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml deleted file mode 100644 index 64a86b9..0000000 --- a/.github/workflows/pages.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: Deploy Pages - -on: - push: - branches: [main] - workflow_dispatch: - -permissions: - contents: read - pages: write - id-token: write - -concurrency: - group: pages - cancel-in-progress: false - -jobs: - build: - name: Build site - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v5 - - - name: Setup Node.js - uses: actions/setup-node@v6 - with: - node-version: "24" - cache: "npm" - - - name: Install dependencies - run: npm ci - - - name: Build GAP website - run: npm run build - - - name: Configure Pages - uses: actions/configure-pages@v6 - - - name: Upload Pages artifact - uses: actions/upload-pages-artifact@v5 - with: - path: _site - - deploy: - name: Deploy site - needs: build - runs-on: ubuntu-latest - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v5 diff --git a/.github/workflows/preview-build.yml b/.github/workflows/preview-build.yml new file mode 100644 index 0000000..6410bd9 --- /dev/null +++ b/.github/workflows/preview-build.yml @@ -0,0 +1,44 @@ +name: Build Preview + +on: + pull_request: + branches: [main] + +permissions: + contents: read + +concurrency: + group: preview-build-${{ github.event.pull_request.number }} + cancel-in-progress: true + +jobs: + build: + name: Build site + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: "24" + cache: "npm" + + - name: Install dependencies + run: npm ci + + - name: Build GAP website + run: npm run build + + - name: Save PR metadata + run: echo "${{ github.event.pull_request.number }}" > _site/pr-number + + - name: Upload build artifact + uses: actions/upload-artifact@v7 + with: + name: preview-build + path: _site + include-hidden-files: true + retention-days: 3 diff --git a/.github/workflows/preview-deploy.yml b/.github/workflows/preview-deploy.yml new file mode 100644 index 0000000..0d5927b --- /dev/null +++ b/.github/workflows/preview-deploy.yml @@ -0,0 +1,101 @@ +name: Deploy Preview + +on: + workflow_run: + workflows: ["Build Preview"] + types: [completed] + +permissions: + contents: read + actions: read + pull-requests: write + +jobs: + deploy: + name: Deploy preview to Cloudflare + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event == 'pull_request' }} + + steps: + - name: Checkout wrangler config + uses: actions/checkout@v6 + with: + sparse-checkout: | + wrangler.jsonc + + - name: Download build artifact + uses: actions/download-artifact@v8 + with: + name: preview-build + run-id: ${{ github.event.workflow_run.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + path: _site + + - name: Read PR number + id: pr + run: | + PR_NUM=$(cat _site/pr-number 2>/dev/null) + # Guard against injection (this value flows into API calls and shell commands) + if ! [[ "$PR_NUM" =~ ^[0-9]+$ ]]; then + echo "::error::Invalid or missing .pr-number from artifact" + exit 1 + fi + echo "number=$PR_NUM" >> "$GITHUB_OUTPUT" + + - name: Deploy preview to Cloudflare Workers + id: deploy + uses: cloudflare/wrangler-action@v4 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: versions upload --preview-alias "pr-${{ steps.pr.outputs.number }}" --message "PR #${{ steps.pr.outputs.number }} preview" + + - name: Hide old deploy preview comments + uses: actions/github-script@v7 + with: + script: | + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: ${{ steps.pr.outputs.number }} + }); + await Promise.all( + comments + .filter(c => c.body.includes('')) + .map(c => github.graphql(` + mutation($id: ID!) { + minimizeComment(input: { subjectId: $id, classifier: OUTDATED }) { + minimizedComment { isMinimized } + } + } + `, { id: c.node_id })) + ); + + - name: Comment on PR (success) + uses: actions/github-script@v7 + with: + script: | + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: ${{ steps.pr.outputs.number }}, + body: [ + '', + '### 🚀 Deploy Preview', + '', + '- **This commit:** ${{ steps.deploy.outputs.deployment-url }}', + '- **This PR** (kept up to date): https://pr-${{ steps.pr.outputs.number }}-gaps.graphql-foundation.workers.dev' + ].join('\n') + }); + + - name: Comment on PR (failure) + if: failure() + uses: actions/github-script@v7 + with: + script: | + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: ${{ steps.pr.outputs.number }}, + body: 'Deploy preview failed.\n\n```\ngh run view ${{ github.run_id }} --repo ${{ github.repository }} --log-failed\n```' + }); diff --git a/wrangler.jsonc b/wrangler.jsonc new file mode 100644 index 0000000..7ffd0bb --- /dev/null +++ b/wrangler.jsonc @@ -0,0 +1,8 @@ +{ + "$schema": "node_modules/wrangler/config-schema.json", + "name": "gaps", + "compatibility_date": "2026-05-23", + "assets": { + "directory": "./_site" + } +}