Add pr-number input to cloudflare-pages-preview actions

Both deploy and cleanup previously read context.payload.pull_request.number
directly, which throws on workflow_dispatch and other non-PR triggers.

New optional inputs:
- deploy: pr-number (default: event PR number), commit-sha (default: github.sha)
- cleanup: pr-number (default: event PR number)

If pr-number resolves to empty/0, the comment step is skipped gracefully
instead of crashing.

This lets /stageblog's companion workflow_dispatch receiver call the
composite deploy action directly instead of inlining wrangler + noindex
injection. The noindex logic staying in the actions repo (rather than in
a script file inside the caller repo that gets checked out at the fork's
SHA) is also the secure path — fork authors can't tamper with it.

The slash-commands README example is updated to use the deploy action
with the new inputs. The earlier commit on this branch (which rewrote
the example to call wrangler directly) is effectively superseded.
This commit is contained in:
Den Delimarsky 2026-03-11 20:25:04 +00:00
commit a4bb78216a
No known key found for this signature in database
4 changed files with 48 additions and 43 deletions

View file

@ -139,6 +139,8 @@ Cloudflare API and GitHub API.
| `comment-marker` | | `<!-- cf-pages-preview -->` | Sticky-comment identifier |
| `comment-title` | | `Preview Deployed` | Heading in PR comment |
| `github-token` | | `${{ github.token }}` | Token for PR commenting |
| `pr-number` | | `${{ github.event.pull_request.number }}` | PR number to comment on — override when running on `workflow_dispatch` or other triggers without `payload.pull_request` |
| `commit-sha` | | `${{ github.sha }}` | SHA shown in the sticky comment — override when the checked-out ref differs from `github.sha` |
### `cleanup`
@ -150,6 +152,7 @@ Cloudflare API and GitHub API.
| `branch` | | `pr-<PR number>` | CF Pages branch alias to delete |
| `comment-marker` | | `<!-- cf-pages-preview -->` | Sticky-comment identifier |
| `github-token` | | `${{ github.token }}` | Token for PR commenting |
| `pr-number` | | `${{ github.event.pull_request.number }}` | PR number to update the sticky comment on — override when running on `workflow_dispatch` or other triggers without `payload.pull_request` |
## Outputs

View file

@ -26,6 +26,13 @@ inputs:
description: GitHub token for updating the PR comment
required: false
default: ${{ github.token }}
pr-number:
description: >-
PR number to update the sticky comment on. Only needed on triggers
where context.payload.pull_request is unavailable (e.g. workflow_dispatch).
Defaults to the event payload's PR number.
required: false
default: ${{ github.event.pull_request.number }}
runs:
using: composite
@ -65,11 +72,16 @@ runs:
uses: actions/github-script@v8
env:
COMMENT_MARKER: ${{ inputs.comment-marker }}
PR_NUMBER: ${{ inputs.pr-number }}
with:
github-token: ${{ inputs.github-token }}
script: |
const { owner, repo } = context.repo;
const prNumber = context.payload.pull_request.number;
const prNumber = Number(process.env.PR_NUMBER);
if (!prNumber) {
core.info('No PR number available — skipping comment update.');
return;
}
const marker = process.env.COMMENT_MARKER;
const { data: comments } = await github.rest.issues.listComments({

View file

@ -40,6 +40,20 @@ inputs:
description: GitHub token for posting/updating the PR comment
required: false
default: ${{ github.token }}
pr-number:
description: >-
PR number to comment on. Only needed on triggers where
context.payload.pull_request is unavailable (e.g. workflow_dispatch).
Defaults to the event payload's PR number.
required: false
default: ${{ github.event.pull_request.number }}
commit-sha:
description: >-
Commit SHA shown in the sticky comment. Useful when the checked-out
ref differs from github.sha (e.g. building a pinned head SHA on
workflow_dispatch). Defaults to github.sha.
required: false
default: ${{ github.sha }}
outputs:
deployment-url:
@ -93,11 +107,17 @@ runs:
COMMENT_MARKER: ${{ inputs.comment-marker }}
COMMENT_TITLE: ${{ inputs.comment-title }}
INJECT_NOINDEX: ${{ inputs.inject-noindex }}
PR_NUMBER: ${{ inputs.pr-number }}
COMMIT_SHA: ${{ inputs.commit-sha }}
with:
github-token: ${{ inputs.github-token }}
script: |
const { owner, repo } = context.repo;
const prNumber = context.payload.pull_request.number;
const prNumber = Number(process.env.PR_NUMBER);
if (!prNumber) {
core.info('No PR number available — skipping comment.');
return;
}
const deployUrl = process.env.DEPLOY_URL;
const aliasUrl = process.env.ALIAS_URL || deployUrl;
const marker = process.env.COMMENT_MARKER;
@ -115,7 +135,7 @@ runs:
|---|---|
| **Preview (stable)** | ${aliasUrl} |
| **This commit** | ${deployUrl} |
| **Commit** | \`${context.sha.slice(0, 7)}\` |
| **Commit** | \`${process.env.COMMIT_SHA.slice(0, 7)}\` |
_Includes drafts and future-dated posts.${noindexNote}_`;

View file

@ -172,49 +172,19 @@ jobs:
# ... your blog build steps → output to blog/public ...
# cloudflare-pages-preview/deploy cannot be used here — its comment
# step reads context.payload.pull_request.number, which is undefined
# on workflow_dispatch and will throw. Call wrangler directly:
- name: Inject noindex
run: |
echo -e '/*\n X-Robots-Tag: noindex, nofollow, noarchive, nosnippet' > blog/public/_headers
find blog/public -name '*.html' -print0 | \
xargs -0 -r sed -i 's|<head>|<head><meta name="robots" content="noindex, nofollow">|'
- id: deploy
uses: cloudflare/wrangler-action@v3
- uses: modelcontextprotocol/actions/cloudflare-pages-preview/deploy@main
with:
apiToken: ${{ secrets.CF_PAGES_PREVIEW_API_TOKEN }}
accountId: ${{ secrets.CF_PAGES_PREVIEW_ACCOUNT_ID }}
command: pages deploy blog/public --project-name=mcp-blog-preview --branch=pr-${{ inputs.pr_number }}
- uses: actions/github-script@v8
env:
PR_NUMBER: ${{ inputs.pr_number }}
HEAD_SHA: ${{ inputs.head_sha }}
DEPLOY_URL: ${{ steps.deploy.outputs.deployment-url }}
ALIAS_URL: ${{ steps.deploy.outputs.pages-deployment-alias-url }}
with:
script: |
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: Number(process.env.PR_NUMBER),
body: `## Blog Preview (staged via /stageblog)\n\n` +
`| | |\n|---|---|\n` +
`| **Preview (stable)** | ${process.env.ALIAS_URL} |\n` +
`| **This commit** | ${process.env.DEPLOY_URL} |\n` +
`| **Commit** | \`${process.env.HEAD_SHA.slice(0,7)}\` |\n\n` +
`_Includes drafts and future-dated posts. noindex headers set._`,
});
directory: blog/public
project-name: mcp-blog-preview
api-token: ${{ secrets.CF_PAGES_PREVIEW_API_TOKEN }}
account-id: ${{ secrets.CF_PAGES_PREVIEW_ACCOUNT_ID }}
branch: pr-${{ inputs.pr_number }}
pr-number: ${{ inputs.pr_number }}
commit-sha: ${{ inputs.head_sha }}
comment-title: "Blog Preview (staged via /stageblog)"
comment-marker: "<!-- stage-blog-comment -->"
```
> **Known limitation:** `cloudflare-pages-preview/deploy` currently reads
> `context.payload.pull_request.number` unconditionally in its comment step,
> which throws on `workflow_dispatch`. Until the deploy action accepts an
> explicit `pr-number` input, bypass it and call `cloudflare/wrangler-action`
> directly as shown above. (Fixing deploy is a follow-up.)
## Inputs
| Input | Required | Default | Description |