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