# Each PR will build preview site that help to check code is work as expect. 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 preview': '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 preview'] === 'success'); core.setOutput('build-failure', jobs['build preview'] === 'failure'); return jobs; deploy-preview: name: deploy preview permissions: actions: read # for dawidd6/action-download-artifact to query and download artifacts issues: write # for actions-cool/maintain-one-comment to modify or create issue comments pull-requests: write # for actions-cool/maintain-one-comment to modify or create PR comments 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 pr 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 PR id id: pr run: | 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}-ant-design.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 }}-ant-design.surge.sh) body-include: '' 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 }}-ant-design.surge.sh) body-include: '' number: ${{ steps.pr.outputs.id }}