Add PR previews using cloudflare pages (#9208)
@@ -15,17 +15,21 @@ concurrency:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
if: github.event.pull_request.head.repo.full_name == github.repository
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout the branch
|
- name: Checkout the branch
|
||||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js for docs build
|
||||||
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
|
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 20
|
||||||
|
cache: npm
|
||||||
|
cache-dependency-path: documentation/package-lock.json
|
||||||
|
|
||||||
- name: Install dependencies and build docs
|
- name: Install dependencies and build docs
|
||||||
working-directory: ./documentation
|
working-directory: ./documentation
|
||||||
@@ -33,11 +37,78 @@ jobs:
|
|||||||
INKEEP_API_KEY: ${{ secrets.INKEEP_API_KEY }}
|
INKEEP_API_KEY: ${{ secrets.INKEEP_API_KEY }}
|
||||||
INKEEP_INTEGRATION_ID: ${{ secrets.INKEEP_INTEGRATION_ID }}
|
INKEEP_INTEGRATION_ID: ${{ secrets.INKEEP_INTEGRATION_ID }}
|
||||||
INKEEP_ORG_ID: ${{ secrets.INKEEP_ORG_ID }}
|
INKEEP_ORG_ID: ${{ secrets.INKEEP_ORG_ID }}
|
||||||
TARGET_PATH: "/pr-preview/pr-${{ github.event.number }}/"
|
TARGET_PATH: /
|
||||||
run: |
|
run: |
|
||||||
npm install
|
npm ci
|
||||||
npm run build
|
npm run build
|
||||||
|
|
||||||
- name: Verify docs map was generated
|
- name: Verify docs map was generated
|
||||||
working-directory: ./documentation
|
working-directory: ./documentation
|
||||||
run: ./scripts/verify-build.sh
|
run: ./scripts/verify-build.sh
|
||||||
|
|
||||||
|
- name: Setup Node.js for Wrangler
|
||||||
|
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
|
||||||
|
with:
|
||||||
|
node-version: 22
|
||||||
|
|
||||||
|
- name: Deploy preview to Cloudflare Pages
|
||||||
|
id: cloudflare-pages
|
||||||
|
working-directory: ./documentation
|
||||||
|
env:
|
||||||
|
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.PAGES_PR_PREVIEW_CF_ACCOUNT_ID }}
|
||||||
|
CLOUDFLARE_API_TOKEN: ${{ secrets.PAGES_PR_PREVIEW_CF_API_TOKEN }}
|
||||||
|
CLOUDFLARE_PAGES_PROJECT_NAME: ${{ secrets.PAGES_PR_PREVIEW_CF_PAGES_PROJECT_NAME }}
|
||||||
|
PR_NUMBER: ${{ github.event.number }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
output=$(npx --yes wrangler@latest pages deploy build \
|
||||||
|
--project-name="$CLOUDFLARE_PAGES_PROJECT_NAME" \
|
||||||
|
--branch="pr-$PR_NUMBER" \
|
||||||
|
--commit-dirty=true 2>&1 | tee /dev/stderr)
|
||||||
|
|
||||||
|
preview_url=$(echo "$output" | grep -Eo 'https://[^[:space:]]+' | tail -n 1)
|
||||||
|
if [ -z "$preview_url" ]; then
|
||||||
|
echo "Failed to find Cloudflare Pages preview URL in wrangler output" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "preview-url=$preview_url" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- name: Comment preview URL
|
||||||
|
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||||
|
env:
|
||||||
|
PREVIEW_URL: ${{ steps.cloudflare-pages.outputs.preview-url }}
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const marker = '<!-- documentation-site-preview -->';
|
||||||
|
const body = `${marker}\nDocumentation preview deployed: ${process.env.PREVIEW_URL}`;
|
||||||
|
|
||||||
|
const {owner, repo} = context.repo;
|
||||||
|
const issue_number = context.issue.number;
|
||||||
|
const {data: comments} = await github.rest.issues.listComments({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
issue_number,
|
||||||
|
per_page: 100,
|
||||||
|
});
|
||||||
|
|
||||||
|
const existingComment = comments.find((comment) =>
|
||||||
|
comment.user.type === 'Bot' && comment.body?.includes(marker)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (existingComment) {
|
||||||
|
await github.rest.issues.updateComment({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
comment_id: existingComment.id,
|
||||||
|
body,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
await github.rest.issues.createComment({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
issue_number,
|
||||||
|
body,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 19 MiB After Width: | Height: | Size: 3.0 MiB |
|
Before Width: | Height: | Size: 17 MiB After Width: | Height: | Size: 3.4 MiB |
|
Before Width: | Height: | Size: 26 MiB After Width: | Height: | Size: 2.6 MiB |
|
Before Width: | Height: | Size: 13 MiB After Width: | Height: | Size: 1.9 MiB |
|
Before Width: | Height: | Size: 30 MiB After Width: | Height: | Size: 3.0 MiB |
|
Before Width: | Height: | Size: 16 MiB After Width: | Height: | Size: 2.4 MiB |
|
Before Width: | Height: | Size: 18 MiB After Width: | Height: | Size: 2.3 MiB |
|
Before Width: | Height: | Size: 9.2 MiB After Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 18 MiB After Width: | Height: | Size: 3.6 MiB |
|
Before Width: | Height: | Size: 22 MiB After Width: | Height: | Size: 1.9 MiB |
|
Before Width: | Height: | Size: 18 MiB After Width: | Height: | Size: 1.5 MiB |
|
Before Width: | Height: | Size: 15 MiB After Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 13 MiB After Width: | Height: | Size: 2.1 MiB |