Preview Deploy #7
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Preview Deploy | |
on: | |
workflow_run: | |
workflows: [Preview Build] | |
types: | |
- completed | |
permissions: | |
contents: read | |
jobs: | |
upstream-workflow-summary: | |
name: upstream workflow summary | |
runs-on: ubuntu-latest | |
if: github.event.workflow_run.event == 'pull_request' | |
outputs: | |
jobs: ${{ steps.prep-summary.outputs.result }} | |
build-success: ${{ steps.prep-summary.outputs.build-success }} | |
build-failure: ${{ steps.prep-summary.outputs.build-failure }} | |
steps: | |
- name: Summary Jobs Status | |
uses: actions/github-script@v7 | |
id: prep-summary | |
with: | |
script: | | |
const response = await github.rest.actions.listJobsForWorkflowRun({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
run_id: ${{ github.event.workflow_run.id }}, | |
}); | |
// { [name]: [conclusion] }, e.g. { 'build site': 'success' } | |
const jobs = (response.data?.jobs ?? []).reduce((acc, job) => { | |
if(job?.status === 'completed' && 'name' in job && 'conclusion' in job) { | |
acc[job.name] = job.conclusion; | |
} | |
return acc; | |
}, {}); | |
const total = Object.keys(jobs).length; | |
if(total === 0) core.setFailed('no jobs found'); | |
// the name here must be the same as `jobs.xxx.{name}` in preview-build.yml | |
// set output | |
core.setOutput('build-success', jobs['build site'] === 'success'); | |
core.setOutput('build-failure', jobs['build site'] === 'failure'); | |
return jobs; | |
deploy-preview: | |
name: deploy preview | |
permissions: | |
actions: read | |
issues: write | |
pull-requests: write | |
runs-on: ubuntu-latest | |
needs: upstream-workflow-summary | |
if: github.event.workflow_run.event == 'pull_request' | |
steps: | |
# We need get PR id first | |
- name: Download Pull Request Artifact | |
uses: dawidd6/action-download-artifact@v6 | |
with: | |
workflow: ${{ github.event.workflow_run.workflow_id }} | |
run_id: ${{ github.event.workflow_run.id }} | |
name: pr | |
# Save PR id to output | |
- name: Save Pull Request Id | |
id: pr | |
run: | | |
pr_id=$(<pr-id.txt) | |
if ! [[ "$pr_id" =~ ^[0-9]+$ ]]; then | |
echo "Error: pr-id.txt does not contain a valid numeric PR id. Please check." | |
exit 1 | |
fi | |
echo "id=$pr_id" >> $GITHUB_OUTPUT | |
# Download site artifact | |
- name: Download Site Artifact | |
if: ${{ fromJSON(needs.upstream-workflow-summary.outputs.build-success) }} | |
uses: dawidd6/action-download-artifact@v6 | |
with: | |
workflow: ${{ github.event.workflow_run.workflow_id }} | |
run_id: ${{ github.event.workflow_run.id }} | |
name: site | |
- name: Upload Surge Service | |
id: deploy | |
continue-on-error: true | |
env: | |
PR_ID: ${{ steps.pr.outputs.id }} | |
run: | | |
export DEPLOY_DOMAIN=https://preview-${PR_ID}-libwebp-wasm-gif2webp.surge.sh | |
npx surge --project ./ --domain $DEPLOY_DOMAIN --token ${{ secrets.SURGE_TOKEN }} | |
- name: Success Comment | |
uses: actions-cool/maintain-one-comment@v3 | |
if: ${{ steps.deploy.outcome == 'success' }} | |
with: | |
token: ${{ secrets.GITHUB_TOKEN }} | |
body: | | |
[Preview Is Ready](https://preview-${{ steps.pr.outputs.id }}-libwebp-wasm-gif2webp.surge.sh) | |
<!-- AUTO_PREVIEW_HOOK --> | |
body-include: <!-- AUTO_PREVIEW_HOOK --> | |
number: ${{ steps.pr.outputs.id }} | |
- name: Failed Comment | |
if: ${{ fromJSON(needs.upstream-workflow-summary.outputs.build-failure) || steps.deploy.outcome == 'failure' || failure() }} | |
uses: actions-cool/maintain-one-comment@v3 | |
with: | |
token: ${{ secrets.GITHUB_TOKEN }} | |
body: | | |
[Preview Failed](https://preview-${{ steps.pr.outputs.id }}-libwebp-wasm-gif2webp.surge.sh) | |
<!-- AUTO_PREVIEW_HOOK --> | |
body-include: <!-- AUTO_PREVIEW_HOOK --> | |
number: ${{ steps.pr.outputs.id }} | |
- name: Check Surge Deploy Result And Exit If Failed | |
run: | | |
if [ "${{ steps.deploy.outcome }}" != "success" ]; then | |
echo "Surge Deploy failed." | |
exit 1 | |
fi |