Surge Preview Deploy #610
This file contains hidden or 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: Surge Preview Deploy | |
| on: | |
| workflow_run: | |
| workflows: ["Surge Preview Build"] | |
| types: | |
| - completed | |
| jobs: | |
| deploy: | |
| runs-on: ubuntu-latest | |
| if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' && github.repository == 'doocs/md' | |
| steps: | |
| - name: Download PR artifact | |
| uses: dawidd6/action-download-artifact@v21 | |
| with: | |
| workflow: ${{ github.event.workflow_run.workflow_id }} | |
| run_id: ${{ github.event.workflow_run.id }} | |
| name: pr | |
| - name: Save PR 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 | |
| - name: Download dist artifact | |
| uses: dawidd6/action-download-artifact@v21 | |
| with: | |
| workflow: ${{ github.event.workflow_run.workflow_id }} | |
| run_id: ${{ github.event.workflow_run.id }} | |
| workflow_conclusion: success | |
| name: dist | |
| - name: Upload surge service | |
| id: deploy | |
| run: | | |
| export DEPLOY_DOMAIN=https://doocs-md-preview-pr-${{ steps.pr.outputs.id }}.surge.sh | |
| npx surge --project ./ --domain $DEPLOY_DOMAIN --token ${{ secrets.SURGE_TOKEN }} | |
| - name: Comment PR with preview link | |
| uses: actions/github-script@v9 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const prNumber = ${{ steps.pr.outputs.id }}; | |
| const deployUrl = 'https://doocs-md-preview-pr-${{ steps.pr.outputs.id }}.surge.sh'; | |
| const commitSha = '${{ github.event.workflow_run.head_sha }}'; | |
| const body = [ | |
| '🚀 Surge Preview has been successfully deployed!', | |
| '', | |
| `**Preview URL:** ${deployUrl}`, | |
| '', | |
| `<sub>Built with commit ${commitSha}</sub>`, | |
| '', | |
| '<!-- Surge Preview Comment -->', | |
| ].join('\n'); | |
| // Upsert: find existing comment and update, or create new | |
| const { data: comments } = await github.rest.issues.listComments({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: prNumber, | |
| }); | |
| const existing = comments.find(c => c.body.includes('<!-- Surge Preview Comment -->')); | |
| if (existing) { | |
| await github.rest.issues.updateComment({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| comment_id: existing.id, | |
| body, | |
| }); | |
| } else { | |
| await github.rest.issues.createComment({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: prNumber, | |
| body, | |
| }); | |
| } | |
| - name: Deploy failed | |
| if: ${{ failure() }} | |
| uses: actions/github-script@v9 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const prNumber = ${{ steps.pr.outputs.id }}; | |
| const workflowRunUrl = '${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}'; | |
| const body = [ | |
| '😭 Surge Preview deployment failed.', | |
| '', | |
| `Please check the [workflow run](${workflowRunUrl}) for details.`, | |
| '', | |
| '<!-- Surge Preview Comment -->', | |
| ].join('\n'); | |
| // Upsert: find existing comment and update, or create new | |
| const { data: comments } = await github.rest.issues.listComments({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: prNumber, | |
| }); | |
| const existing = comments.find(c => c.body.includes('<!-- Surge Preview Comment -->')); | |
| if (existing) { | |
| await github.rest.issues.updateComment({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| comment_id: existing.id, | |
| body, | |
| }); | |
| } else { | |
| await github.rest.issues.createComment({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: prNumber, | |
| body, | |
| }); | |
| } | |
| failed: | |
| runs-on: ubuntu-latest | |
| if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'failure' && github.repository == 'doocs/md' | |
| steps: | |
| - name: Download PR artifact | |
| uses: dawidd6/action-download-artifact@v21 | |
| with: | |
| workflow: ${{ github.event.workflow_run.workflow_id }} | |
| run_id: ${{ github.event.workflow_run.id }} | |
| name: pr | |
| - name: Save PR 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 | |
| - name: Comment PR with build failure | |
| uses: actions/github-script@v9 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const prNumber = ${{ steps.pr.outputs.id }}; | |
| const workflowRunUrl = '${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.event.workflow_run.id }}'; | |
| const body = [ | |
| '😭 Surge Preview build failed.', | |
| '', | |
| `Please check the [workflow run](${workflowRunUrl}) for details.`, | |
| '', | |
| '<!-- Surge Preview Comment -->', | |
| ].join('\n'); | |
| // Upsert: find existing comment and update, or create new | |
| const { data: comments } = await github.rest.issues.listComments({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: prNumber, | |
| }); | |
| const existing = comments.find(c => c.body.includes('<!-- Surge Preview Comment -->')); | |
| if (existing) { | |
| await github.rest.issues.updateComment({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| comment_id: existing.id, | |
| body, | |
| }); | |
| } else { | |
| await github.rest.issues.createComment({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: prNumber, | |
| body, | |
| }); | |
| } |