Skip to content

ci: add Cloudflare Pages deployment#33

Merged
jamestelfer merged 14 commits intomainfrom
claude/cf-pages-deploy-7yn.2
Mar 28, 2026
Merged

ci: add Cloudflare Pages deployment#33
jamestelfer merged 14 commits intomainfrom
claude/cf-pages-deploy-7yn.2

Conversation

@jamestelfer
Copy link
Copy Markdown
Contributor

@jamestelfer jamestelfer commented Mar 27, 2026

Purpose

Implements Cloudflare Pages deployment as a second hosting target alongside GitHub Pages, enabling the site to be served at chinmina.pages.dev (and eventually docs.chinmina.dev).

Context

Part of the hosting migration epic (chinmina-docs-7yn). Task 7yn.1 (build pipeline restructure) already merged. This PR covers tasks 7yn.2.1 and 7yn.2.3 — the wrangler.toml project identity file and the CI deploy job.

Task 7yn.2.2 (creating the CF Pages project and configuring CLOUDFLARE_API_TOKEN / CLOUDFLARE_ACCOUNT_ID secrets) is a manual step that must be completed before this workflow can succeed.

Changes

  • wrangler.toml — declares name = "chinmina" and pages_build_output_dir = "dist" for project identity
  • .github/workflows/deploy.yaml — adds deploy-cloudflare job that downloads the shared dist/ artifact and deploys via cloudflare/wrangler-action@v3; runs on all branches (preview on PRs, production on main); writes deployment URL to workflow summary with PR preview URL support

Manual prerequisite

Before merging: create the chinmina Cloudflare Pages project and add CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID as repository secrets (see task chinmina-docs-7yn.2.2).

Summary by CodeRabbit

  • Chores

    • Configured Cloudflare Pages deployment with automated workflows and expanded deployment permissions
    • Enabled automatic preview URLs for pull requests and publication to job summaries
    • Set up automated production deployment on main with deployment status tracking in GitHub
    • Added deployment helper tooling and Cloudflare project configuration
  • Documentation

    • Added migration plan for moving docs hosting to Cloudflare Pages (transition requirements, CI behavior, and testing/acceptance)

Adds wrangler.toml at repo root declaring project identity (name=chinmina,
pages_build_output_dir=dist) and a deploy-cloudflare job that downloads the
shared dist artifact and deploys via wrangler-action on all branches.
Production deploys on main; PRs get preview URLs. Deployment URL written to
workflow summary.
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Mar 27, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds Cloudflare Pages deployment: new GitHub Actions job, Wrangler config, deployment script, and devDependency. The job consumes the build artifact, deploys via Wrangler, and reports the preview/production URL to PR comments or GitHub Deployment records.

Changes

Cohort / File(s) Summary
CI/CD Workflow
.github/workflows/deploy.yaml
Expanded workflow permissions; adds deploy-cloudflare job that downloads dist/ artifact, sets up Node, runs pnpm and wrangler to deploy to Cloudflare Pages; publishes URL to job summary and environment; triggers PR comment flow for pull_request events.
Deployment Script
.github/scripts/cloudflare-deploy.sh
New executable Bash script with comment and deployment modes: parses Wrangler JSON output (prioritizing pages-deploy-detailed, deploy, version-upload), extracts preview/alias URLs, creates/updates PR comments via gh api, or creates GitHub Deployment and status with environment_url and dashboard link when available.
Cloudflare Config & Tooling
wrangler.toml, package.json
Adds wrangler.toml with name = "chinmina" and pages_build_output_dir = "dist". Adds wrangler ^4.77.0 to devDependencies in package.json.
Documentation
docs/prd-cloudflare-pages-migration.md
New PRD describing migration plan, canonical URL and DNS/HTTPS requirements, CI/CD behavior (shared build artifact, preview and production deploys), testing, and out-of-scope items.

Sequence Diagram(s)

sequenceDiagram
    participant GHA as GitHub Actions
    participant Wrangler as Cloudflare Wrangler
    participant GHApi as GitHub API

    GHA->>GHA: Build project -> produce `dist/` artifact
    GHA->>GHA: Upload artifact
    GHA->>GHA: Start `deploy-cloudflare` job (after build)
    GHA->>Wrangler: `pnpm wrangler pages deploy` (using secrets)
    Wrangler-->>GHA: Return JSON output (preview URL, alias, ids)

    alt Pull Request event
        GHA->>GHApi: GET PR comments
        alt existing preview comment
            GHApi-->>GHA: comment id
            GHA->>GHApi: PATCH update comment with preview URL
        else
            GHA->>GHApi: POST new PR comment with preview URL
        end
    else Main branch
        GHA->>GHApi: POST create Deployment
        GHA->>GHApi: POST deployment status with environment_url (+dashboard link if available)
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Poem

🐰 I bounced a build into the cloud so fair,
I nudged the Wrangler, sent the files up there,
A preview link I left in PR light—
Docs hop live, and everything's right! 🥕

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'ci: add Cloudflare Pages deployment' directly and clearly summarizes the main change: adding a new CI/CD job to deploy to Cloudflare Pages. It is concise, specific, and accurately reflects the primary purpose of the changeset.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/cf-pages-deploy-7yn.2

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
.github/workflows/deploy.yaml (1)

48-59: wrangler.toml is ignored by this job.

Only the dist artifact is downloaded here; the repository itself is never checked out, so wrangler.toml is absent when cloudflare/wrangler-action runs. Cloudflare treats the Wrangler file as the Pages source of truth when you use it, and their GitHub Actions examples check out the repo before invoking the action. Today that only duplicates dist/project name, but any future Pages config added to wrangler.toml would be ignored by CI. (developers.cloudflare.com)

♻️ Minimal way to make the config file available during deploy
  deploy-cloudflare:
    needs: build
    runs-on: ubuntu-latest
    steps:
+     - name: Checkout repository
+       uses: actions/checkout@v6
      - name: Download dist artifact
        uses: actions/download-artifact@v4
        with:
          name: dist
          path: dist/
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/deploy.yaml around lines 48 - 59, The workflow currently
downloads only the dist artifact so wrangler.toml is never available to the
cloudflare/wrangler-action; add a repository checkout step (e.g.
actions/checkout@v4) before the "Deploy to Cloudflare Pages" step (and before
"Download dist artifact" or at least before the step that runs
cloudflare/wrangler-action@v3) so the wrangler.toml in the repo is present when
the Deploy step executes; keep the existing "Download dist artifact" and the
deploy command (pages deploy dist --project-name=chinmina) unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/deploy.yaml:
- Around line 44-59: Add a guard to the deploy-cloudflare job so it only runs
for PRs originating from the same repository and non-Dependabot actors: update
the deploy-cloudflare job (job id deploy-cloudflare) to include an if condition
such as if: github.event_name != 'pull_request' ||
(github.event.pull_request.head.repo.full_name == github.repository &&
github.actor != 'dependabot[bot]') so that the Cloudflare action (uses:
cloudflare/wrangler-action@v3) is skipped for forked PRs and Dependabot PRs
where apiToken/accountId secrets are not available.

---

Nitpick comments:
In @.github/workflows/deploy.yaml:
- Around line 48-59: The workflow currently downloads only the dist artifact so
wrangler.toml is never available to the cloudflare/wrangler-action; add a
repository checkout step (e.g. actions/checkout@v4) before the "Deploy to
Cloudflare Pages" step (and before "Download dist artifact" or at least before
the step that runs cloudflare/wrangler-action@v3) so the wrangler.toml in the
repo is present when the Deploy step executes; keep the existing "Download dist
artifact" and the deploy command (pages deploy dist --project-name=chinmina)
unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: c5381dad-8c13-4d40-8e3a-01f568b7d0b4

📥 Commits

Reviewing files that changed from the base of the PR and between 563e92b and 7affb17.

📒 Files selected for processing (2)
  • .github/workflows/deploy.yaml
  • wrangler.toml

Use the package.json wrangler CLI instead of cloudflare/wrangler-action.
The deploy job now checks out the repo, installs deps, then runs
pnpm wrangler pages deploy directly. Post-deploy GitHub integration
(PR comment, deployment record, step summary) is handled by
.github/scripts/cloudflare-deploy.sh.
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/example.yaml:
- Around line 32-33: The workflow references steps.deploy.outcome but the Deploy
step has no id, causing actionlint to fail; add an explicit id: deploy to the
Deploy step (the job step with name "Deploy") or update all references to point
to the correct existing step id so that steps.deploy.outcome resolves correctly;
ensure the id is unique in the job and then rerun the workflow check.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: bdc76b84-e280-4255-aeb9-c305bb496633

📥 Commits

Reviewing files that changed from the base of the PR and between 64c8127 and 3dac69c.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (4)
  • .github/scripts/cloudflare-deploy.sh
  • .github/workflows/example.yaml
  • docs/prd-cloudflare-pages-migration.md
  • package.json
✅ Files skipped from review due to trivial changes (1)
  • package.json

@jamestelfer jamestelfer force-pushed the claude/cf-pages-deploy-7yn.2 branch from 3dac69c to b2eb1b1 Compare March 28, 2026 02:42
@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 28, 2026

The job environment: block auto-creates a GitHub Deployment named
'cloudflare', so cloudflare-deploy.sh deployment was redundant and
producing a second record named 'preview'. Replace it with an inline
URL extraction step that sets environment.url and writes the step
summary. PR comments via cloudflare-deploy.sh comment are unchanged.
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (1)
.github/workflows/deploy.yaml (1)

46-48: ⚠️ Potential issue | 🟠 Major

Skip Cloudflare deploy for forked/Dependabot PRs to avoid guaranteed secret failures.

deploy-cloudflare still runs on all pull_request events, but this job requires Cloudflare secrets that are unavailable for fork PRs and Dependabot PRs, causing avoidable red checks.

🔧 Minimal guard
   deploy-cloudflare:
     needs: build
+    if: github.event_name != 'pull_request' || (github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]')
     runs-on: ubuntu-latest
Are GitHub Actions repository secrets available to pull_request workflows from forks and Dependabot pull requests?
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/deploy.yaml around lines 46 - 48, The deploy-cloudflare
job runs for forked and Dependabot PRs and fails due to missing secrets; update
the job (deploy-cloudflare) to guard execution with an if condition that only
allows runs when not a forked PR and not triggered by Dependabot—e.g., check
that either the event is not pull_request or that
github.event.pull_request.head.repo.full_name equals github.repository, and also
exclude github.actor == "dependabot[bot]"; add this if to the deploy-cloudflare
job (the block containing needs: build and runs-on: ubuntu-latest) so the job is
skipped for fork/Dependabot PRs.
🧹 Nitpick comments (1)
.github/workflows/deploy.yaml (1)

10-15: Scope elevated permissions to the Cloudflare job only.

pull-requests: write and deployments: write are currently workflow-wide. Move them to jobs.deploy-cloudflare.permissions so the build/GitHub Pages path keeps minimal token privileges.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/deploy.yaml around lines 10 - 15, The workflow currently
grants elevated permissions globally under the top-level permissions block; move
the two entries pull-requests: write and deployments: write out of the top-level
permissions and add them under jobs.deploy-cloudflare.permissions instead so
only the deploy-cloudflare job gets those privileges while keeping the global
permissions minimal (retain contents: read, pages: write, id-token: write at top
level). Ensure you update the permissions map keys exactly as pull-requests and
deployments and add them to jobs.deploy-cloudflare.permissions.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/deploy.yaml:
- Around line 81-90: The deployment URL extraction step (step id "cf-url")
currently writes an empty URL to outputs/summary when jq finds nothing; change
the script to check the captured url variable after extraction and if it's
empty, write a clear error to stdout/ GITHUB_STEP_SUMMARY and exit non‑zero to
fail the job (e.g., echo an error and use exit 1). Ensure this check sits
immediately after the url assignment in the cf-url run block so the step cannot
succeed with an empty value.

In `@docs/prd-cloudflare-pages-migration.md`:
- Around line 53-56: Update the PRD to reflect the actual deployed workflow:
change the "Cloudflare Pages deploy job" description to state the pipeline runs
the command "pnpm wrangler pages deploy dist --project-name=chinmina" (not
cloudflare/wrangler-action with command: pages deploy ...), and update the
`wrangler.toml` note to clarify that despite having name = "chinmina" and
pages_build_output_dir = "dist", the current workflow still passes the
--project-name flag and invokes wrangler via pnpm; mention the required GitHub
secrets (CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID) remain the same.

---

Duplicate comments:
In @.github/workflows/deploy.yaml:
- Around line 46-48: The deploy-cloudflare job runs for forked and Dependabot
PRs and fails due to missing secrets; update the job (deploy-cloudflare) to
guard execution with an if condition that only allows runs when not a forked PR
and not triggered by Dependabot—e.g., check that either the event is not
pull_request or that github.event.pull_request.head.repo.full_name equals
github.repository, and also exclude github.actor == "dependabot[bot]"; add this
if to the deploy-cloudflare job (the block containing needs: build and runs-on:
ubuntu-latest) so the job is skipped for fork/Dependabot PRs.

---

Nitpick comments:
In @.github/workflows/deploy.yaml:
- Around line 10-15: The workflow currently grants elevated permissions globally
under the top-level permissions block; move the two entries pull-requests: write
and deployments: write out of the top-level permissions and add them under
jobs.deploy-cloudflare.permissions instead so only the deploy-cloudflare job
gets those privileges while keeping the global permissions minimal (retain
contents: read, pages: write, id-token: write at top level). Ensure you update
the permissions map keys exactly as pull-requests and deployments and add them
to jobs.deploy-cloudflare.permissions.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4711a1fb-62e7-44fb-813f-2a674183a15a

📥 Commits

Reviewing files that changed from the base of the PR and between 3dac69c and fb0a5b5.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (4)
  • .github/scripts/cloudflare-deploy.sh
  • .github/workflows/deploy.yaml
  • docs/prd-cloudflare-pages-migration.md
  • package.json
✅ Files skipped from review due to trivial changes (2)
  • package.json
  • .github/scripts/cloudflare-deploy.sh

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (2)
.github/workflows/deploy.yaml (2)

81-90: ⚠️ Potential issue | 🟡 Minor

Fail fast when no deployment URL is extracted.

Line 88-Line 90 publish outputs even when url is empty, which can leave deployment metadata silently incomplete.

✅ Add empty-URL guard
       - name: Extract deployment URL
         id: cf-url
         if: always() && steps.deploy.outcome == 'success'
         run: |
           url=$(cat .wrangler-output/wrangler-output-*.json 2>/dev/null \
             | jq -r 'select(.type == "pages-deploy-detailed") | .url // empty' \
             | head -1)
+          if [ -z "$url" ]; then
+            echo "Failed to extract Cloudflare deployment URL from wrangler output" >&2
+            echo "### Cloudflare Pages" >> "$GITHUB_STEP_SUMMARY"
+            echo "❌ Failed to extract deployment URL." >> "$GITHUB_STEP_SUMMARY"
+            exit 1
+          fi
           echo "value=${url}" >> "$GITHUB_OUTPUT"
           echo "### Cloudflare Pages" >> "$GITHUB_STEP_SUMMARY"
           echo "**URL:** ${url}" >> "$GITHUB_STEP_SUMMARY"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/deploy.yaml around lines 81 - 90, After extracting url in
the GitHub Actions step with id "cf-url" (variable url from the jq pipeline),
add an empty-URL guard: if url is empty, write a clear error to
GITHUB_STEP_SUMMARY and to workflow output (or set a failure message) and exit
non‑zero to fail fast instead of continuing to echo blank metadata; otherwise
proceed to write the "Cloudflare Pages" summary and set the output as currently
implemented.

46-48: ⚠️ Potential issue | 🟠 Major

Skip Cloudflare deploy for forked/Dependabot PRs.

Line 46 currently has no guard, so this job runs on PRs where Cloudflare secrets are unavailable and fails instead of skipping cleanly.

🛡️ Minimal guard
   deploy-cloudflare:
     needs: build
+    if: github.event_name != 'pull_request' || (github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]')
     runs-on: ubuntu-latest
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/deploy.yaml around lines 46 - 48, The deploy-cloudflare
job currently runs on forks/Dependabot PRs and fails due to missing secrets;
update the deploy-cloudflare job definition (job name: deploy-cloudflare) to
include an if guard that skips execution for pull_request events from forked
repos, e.g. add if: ${{ github.event_name != 'pull_request' ||
github.event.pull_request.head.repo.full_name == github.repository }} so the job
only runs for non-PR workflows or PRs from the same repository where secrets
exist.
🧹 Nitpick comments (1)
.github/workflows/deploy.yaml (1)

10-15: Scope write permissions to deploy jobs only (least privilege).

Line 14 and Line 15 grant write scopes globally, so the build job also gets elevated token permissions unnecessarily. Move write permissions to the specific deploy jobs.

🔐 Suggested permission scoping
 permissions:
   contents: read
-  pages: write
-  id-token: write
-  deployments: write
-  pull-requests: write

 jobs:
   build:
+    permissions:
+      contents: read
     runs-on: ubuntu-latest
     steps:
       ...

   deploy-cloudflare:
+    permissions:
+      contents: read
+      deployments: write
+      pull-requests: write
     needs: build
     runs-on: ubuntu-latest
     ...

   deploy:
+    permissions:
+      contents: read
+      pages: write
+      id-token: write
     needs: build
     if: github.event_name == 'push' && github.ref == 'refs/heads/main'
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/deploy.yaml around lines 10 - 15, The global permissions
block currently grants write scopes (id-token and deployments and pull-requests)
to the entire workflow, which elevates the token for non-deploy jobs like the
build job; remove write permissions from the top-level permissions stanza and
instead add the required write scopes (e.g., id-token: write, deployments:
write, pull-requests: write) only to the specific deploy job(s) (e.g., the
job(s) named "deploy" or "pages") by adding a permissions section under those
job definitions; keep read-only permissions (contents: read) at the top level
and ensure the "build" job has no write permissions.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/deploy.yaml:
- Around line 73-80: The workflow step "Deploy to Cloudflare Pages" currently
interpolates github.head_ref/github.ref_name directly into the run command,
enabling command injection; add a new environment variable (e.g., BRANCH_NAME)
in that step set to ${{ github.head_ref || github.ref_name }} and update the run
invocation used by the step (the line that runs pnpm wrangler pages deploy ...)
to reference the branch via the env variable (e.g., "$BRANCH_NAME") instead of
inline interpolation so the branch value is passed safely and not executed by
the shell.

---

Duplicate comments:
In @.github/workflows/deploy.yaml:
- Around line 81-90: After extracting url in the GitHub Actions step with id
"cf-url" (variable url from the jq pipeline), add an empty-URL guard: if url is
empty, write a clear error to GITHUB_STEP_SUMMARY and to workflow output (or set
a failure message) and exit non‑zero to fail fast instead of continuing to echo
blank metadata; otherwise proceed to write the "Cloudflare Pages" summary and
set the output as currently implemented.
- Around line 46-48: The deploy-cloudflare job currently runs on
forks/Dependabot PRs and fails due to missing secrets; update the
deploy-cloudflare job definition (job name: deploy-cloudflare) to include an if
guard that skips execution for pull_request events from forked repos, e.g. add
if: ${{ github.event_name != 'pull_request' ||
github.event.pull_request.head.repo.full_name == github.repository }} so the job
only runs for non-PR workflows or PRs from the same repository where secrets
exist.

---

Nitpick comments:
In @.github/workflows/deploy.yaml:
- Around line 10-15: The global permissions block currently grants write scopes
(id-token and deployments and pull-requests) to the entire workflow, which
elevates the token for non-deploy jobs like the build job; remove write
permissions from the top-level permissions stanza and instead add the required
write scopes (e.g., id-token: write, deployments: write, pull-requests: write)
only to the specific deploy job(s) (e.g., the job(s) named "deploy" or "pages")
by adding a permissions section under those job definitions; keep read-only
permissions (contents: read) at the top level and ensure the "build" job has no
write permissions.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 17bbd556-b728-491a-beff-7a5cff9d555f

📥 Commits

Reviewing files that changed from the base of the PR and between fb0a5b5 and 242a682.

📒 Files selected for processing (1)
  • .github/workflows/deploy.yaml

@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 28, 2026

@jamestelfer jamestelfer merged commit 9689169 into main Mar 28, 2026
4 checks passed
@jamestelfer jamestelfer deleted the claude/cf-pages-deploy-7yn.2 branch March 28, 2026 04:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant