Skip to content
116 changes: 109 additions & 7 deletions .github/workflows/build-and-preview-site.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,6 @@ on:
pull_request_target:
branches: [master]
types: [opened, synchronize, reopened, closed]
paths:
- '!**'
- 'docs/**'
- 'Makefile'
- 'CNAME'
- '.github/workflows/build-and-deploy-site.yml'
- '.github/workflows/build-and-preview-site.yml'

permissions:
contents: write
Expand All @@ -28,6 +21,12 @@ jobs:
build-and-deploy-preview:
runs-on: ubuntu-24.04

outputs:

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Please move output section after runs-on

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@Bhumikagarggg Done, thank you for the suggestion. I've moved the outputs section below runs-on as requested. Could you please take another look when you have a chance?

removed_prs_json: ${{ steps.prune-previews.outputs.removed_prs_json }}

env:
PREVIEW_RETENTION_LIMIT: 6

steps:
- name: Checkout PR code
if: github.event.action != 'closed'
Expand Down Expand Up @@ -74,6 +73,60 @@ jobs:
action: auto
comment: false

- name: Checkout gh-pages for preview retention
if: github.event.action != 'closed'
uses: actions/checkout@v6
with:
ref: gh-pages
fetch-depth: 0
persist-credentials: true
filter: blob:none
sparse-checkout: |
pr-preview
path: gh-pages-maintenance


- name: Prune old PR previews
id: prune-previews
if: github.event.action != 'closed'
run: |
cd gh-pages-maintenance
mkdir -p pr-preview
removed_prs=()

mapfile -t previews < <(
while IFS= read -r preview; do
timestamp="$(git log -1 --format=%ct -- "pr-preview/$preview" 2>/dev/null || echo 0)"
printf '%s %s\n' "$timestamp" "$preview"
done < <(find pr-preview -mindepth 1 -maxdepth 1 -type d -name 'pr-*' -printf '%f\n') \
| sort -nr \
| awk '{print $2}'
)

if (( ${#previews[@]} <= $PREVIEW_RETENTION_LIMIT )); then
echo "removed_prs_json=[]" >> "$GITHUB_OUTPUT"
exit 0
fi

for preview in "${previews[@]:$PREVIEW_RETENTION_LIMIT}"; do
rm -rf "pr-preview/$preview"
removed_prs+=("${preview#pr-}")
done

git add pr-preview

if git diff --cached --quiet; then
echo "removed_prs_json=[]" >> "$GITHUB_OUTPUT"
exit 0
fi

git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"

git commit -m "Prune old PR previews"
git push

echo "removed_prs_json=$(printf '%s\n' "${removed_prs[@]}" | jq -R . | jq -sc .)" >> "$GITHUB_OUTPUT"
- name: Comment PR with Preview URL
if: github.event.action != 'closed'
uses: marocchino/sticky-pull-request-comment@v2
Expand All @@ -83,7 +136,56 @@ jobs:
🚀 Preview deployment: https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/pr-preview/pr-${{ github.event.pull_request.number }}/
> *Note: Preview may take a moment (GitHub Pages deployment in progress). Please wait and refresh. Track deployment [here](https://github.com/${{ github.repository }}/actions/workflows/pages/pages-build-deployment)*

- name: Comment on pruned previews
if: github.event.action != 'closed' && steps.prune-previews.outputs.removed_prs_json != '[]'
uses: actions/github-script@v7
env:
REMOVED_PRS_JSON: ${{ steps.prune-previews.outputs.removed_prs_json }}
PREVIEW_RETENTION_LIMIT: ${{ env.PREVIEW_RETENTION_LIMIT }}
with:
script: |
const removedPrs = JSON.parse(process.env.REMOVED_PRS_JSON);
const retentionLimit = process.env.PREVIEW_RETENTION_LIMIT;
const header = "pr-preview";
const marker = `<!-- Sticky Pull Request Comment${header} -->`;

for (const prNumber of removedPrs) {
const body =
`Preview deployment for PR #${prNumber} removed.\n\n` +
`This PR preview was automatically pruned because we keep only the ${retentionLimit} most recently updated previews on GitHub Pages to stay within deployment size limits.\n\n` +
`If needed, push a new commit to this PR to generate a fresh preview.\n` +
`${marker}`;

const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: Number(prNumber),
per_page: 100,
});

const existingComment = [...comments].reverse().find((comment) =>
comment.user?.login === "github-actions[bot]" &&
comment.body?.includes(marker)
);

if (existingComment) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: existingComment.id,
body,
});
continue;
}

await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: Number(prNumber),
body,
});
}

- name: Cleanup PR preview on close
if: github.event.action == 'closed'
uses: rossjrw/pr-preview-action@v1.6.3
Expand Down
Loading