diff --git a/.github/workflows/job-messages.yml b/.github/workflows/job-messages.yml new file mode 100644 index 000000000..0e47838ba --- /dev/null +++ b/.github/workflows/job-messages.yml @@ -0,0 +1,65 @@ +name: Job messages + +on: + workflow_call: + inputs: + branch: + required: false + type: string + commit: + required: true + type: string + preview_url: + required: false + type: string + build_workflow_run_id: + required: false + type: number + commenting_workflow_run_id: + required: true + type: string + in_progress: + required: true + type: boolean + outputs: + msg: + description: The composed message + value: ${{ jobs.msg.outputs.msg }} + marker: + description: Hidden marker to detect PR comments composed by the bot + value: "CFPages-deployment" + +jobs: + msg: + name: Deployment status + runs-on: ubuntu-latest + outputs: + msg: ${{ env.msg }} + + steps: + - name: Compose message + if: ${{ always() }} + id: compose + env: + COMMIT: ${{ inputs.commit }} + PREVIEW_URL: ${{ inputs.preview_url != '' && (inputs.branch != 'master' && inputs.preview_url || format('https://jf-web.pages.dev ({0})', inputs.preview_url)) || 'Not available' }} + DEPLOY_STATUS: ${{ inputs.in_progress && '🔄 Deploying...' || (inputs.preview_url != '' && '✅ Deployed!' || '❌ Failure. Check workflow logs for details') }} + DEPLOYMENT_TYPE: ${{ inputs.branch != 'master' && '🔀 Preview' || '⚙️ Production' }} + BUILD_WORKFLOW_RUN: ${{ !inputs.in_progress && format('**[View build logs](https://github.com/{0}/actions/runs/{1})**', 'jellyfin/jellyfin-web', inputs.build_workflow_run_id) || '' }} + COMMENTING_WORKFLOW_RUN: ${{ format('**[View bot logs](https://github.com/{0}/actions/runs/{1})**', 'jellyfin/jellyfin-web', inputs.commenting_workflow_run_id) }} + # EOF is needed for multiline environment variables in a GitHub Actions context + run: | + echo "## Cloudflare Pages deployment" > $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| **Latest commit** | ${COMMIT::7} |" >> $GITHUB_STEP_SUMMARY + echo "|------------------------- |:----------------------------: |" >> $GITHUB_STEP_SUMMARY + echo "| **Status** | $DEPLOY_STATUS |" >> $GITHUB_STEP_SUMMARY + echo "| **Preview URL** | $PREVIEW_URL |" >> $GITHUB_STEP_SUMMARY + echo "| **Type** | $DEPLOYMENT_TYPE |" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "$BUILD_WORKFLOW_RUN" >> $GITHUB_STEP_SUMMARY + echo "$COMMENTING_WORKFLOW_RUN" >> $GITHUB_STEP_SUMMARY + COMPOSED_MSG=$(cat $GITHUB_STEP_SUMMARY) + echo "msg<> $GITHUB_ENV + echo "$COMPOSED_MSG" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 000000000..2b7bbea71 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,94 @@ +on: + workflow_run: + workflows: + - Build + types: + - completed + +jobs: + publish: + permissions: + contents: read + deployments: write + + name: Deploy to Cloudflare Pages + runs-on: ubuntu-latest + outputs: + url: ${{ steps.cf.outputs.url }} + + steps: + - name: Download workflow artifact + uses: dawidd6/action-download-artifact@v2.27.0 + with: + run_id: ${{ github.event.workflow_run.id }} + name: jellyfin-web__prod + path: dist + + - name: Publish + id: cf + uses: cloudflare/pages-action@1 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + projectName: jf-web + directory: dist + gitHubToken: ${{ secrets.GITHUB_TOKEN }} + + pr-context: + name: PR context + if: ${{ always() && github.event.workflow_run.event == 'pull_request' }} + runs-on: ubuntu-latest + outputs: + commit: ${{ env.pr_sha }} + pr_number: ${{ env.pr_number }} + + steps: + - name: Get PR context + uses: dawidd6/action-download-artifact@v2.27.0 + id: pr_context + with: + run_id: ${{ github.event.workflow_run.id }} + name: PR_context + + - name: Set PR context environment variables + if: ${{ steps.pr_context.conclusion == 'success' }} + run: | + echo "pr_number=$(cat PR_number)" >> $GITHUB_ENV + echo "pr_sha=$(cat PR_sha)" >> $GITHUB_ENV + + compose-comment: + name: Compose comment + if: ${{ always() }} + uses: ./.github/workflows/job-messages.yml + needs: + - publish + - pr-context + + with: + branch: ${{ github.event.workflow_run.head_branch }} + commit: ${{ needs.pr-context.outputs.commit != '' && needs.pr-context.outputs.commit || github.event.workflow_run.head_sha }} + preview_url: ${{ needs.publish.outputs.url }} + build_workflow_run_id: ${{ github.event.workflow_run.id }} + commenting_workflow_run_id: ${{ github.run_id }} + in_progress: false + + comment-status: + name: Create comment status + if: | + always() && + github.event.workflow_run.event == 'pull_request' && + needs.pr-context.outputs.pr_number != '' + runs-on: ubuntu-latest + needs: + - compose-comment + - pr-context + + steps: + - name: Update job summary in PR comment + uses: thollander/actions-comment-pull-request@v2.4.2 + with: + GITHUB_TOKEN: ${{ secrets.JF_BOT_TOKEN }} + message: ${{ needs.compose-comment.outputs.msg }} + pr_number: ${{ needs.pr-context.outputs.pr_number }} + comment_tag: ${{ needs.compose-comment.outputs.marker }} + mode: recreate