Files
moeka-project/.github/workflows/deploy-cloudflare-workers-preview-upload.yml
T

237 lines
9.6 KiB
YAML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: Cloudflare Workers (Preview) Upload
on:
workflow_run:
workflows:
- Cloudflare Workers (Preview)
types:
- completed
env:
PR_NUM: 0
BRANCH_NAME: main
jobs:
on-success:
if: ${{ github.event.workflow_run.conclusion == 'success' }}
name: Deploy - ${{ matrix.app_name }}
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
strategy:
matrix:
include:
- app_name: stage-web
artifact_name: preview-build-stage-web
artifact_path: ./apps/stage-web/dist
wrangler_config_path: ./apps/stage-web/wrangler.toml
steps:
- uses: actions/checkout@v6
# Turborepo
- name: Cache turbo build setup
uses: actions/cache@v4
with:
path: .turbo
key: ${{ runner.os }}-turbo-${{ github.sha }}
restore-keys: |
${{ runner.os }}-turbo-
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v6
with:
node-version: lts/*
cache: pnpm
# NOTICE:
#
# Here installing wrangler to global is required, or otherwise:
# ERR_PNPM_ADDING_TO_ROOT Running this command will add the dependency to the workspace root...
# error occurs.
#
# Since https://github.com/cloudflare/wrangler-action/pull/339#issuecomment-2667622947 rejected the -g support
# by saying un-reasonable 'I'm not sure if it's common ... to install packages to the global scope, ... might be introducing some unintended side effects.'
#
# Clearly I think installing with `<packageManager> install` brings more unintended side effects...
#
# As suggested by https://github.com/cloudflare/wrangler-action/issues/181#issuecomment-2127990708, we should pre-install
# with our package manager and then use it in the action.
- run: pnpm i -g wrangler@4
- name: Download artifact - PR
uses: dawidd6/action-download-artifact@v11
with:
workflow_conclusion: success
run_id: ${{ github.event.workflow_run.id }}
name: pr-num
path: pr-num
allow_forks: true
- name: Download artifact - PR
uses: dawidd6/action-download-artifact@v11
with:
workflow_conclusion: success
run_id: ${{ github.event.workflow_run.id }}
name: branch-name
path: branch-name
allow_forks: true
- name: Obtain PR number
id: pr-num
run: |
echo "PR_NUM=$(cat pr-num/pr_num)" >> "$GITHUB_OUTPUT"
- name: Obtain branch name
id: branch-name
run: |
echo "BRANCH_NAME=$(cat branch-name/branch_name)" >> "$GITHUB_ENV"
- name: Download artifact
uses: dawidd6/action-download-artifact@v11
with:
workflow_conclusion: success
run_id: ${{ github.event.workflow_run.id }}
name: preview-build-stage-web
path: ./apps/stage-web/dist
allow_forks: true
- name: Wrangler Upload
id: wrangler-versions-upload
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
command: versions upload -c ${{ matrix.wrangler_config_path }} --preview-alias pr-${{ steps.pr-num.outputs.PR_NUM }} --env preview --message 'GitHub Actions uploaded preview for Pull Request ${{ steps.pr-num.outputs.PR_NUM }}' --tag v0.0.1-pr.${{ steps.pr-num.outputs.PR_NUM }}
gitHubToken: ${{ secrets.GITHUB_TOKEN }}
# Workflows
#
# wrangler versions upload -c ./apps/stage-web/wrangler.toml --preview-alias pr-763 --env preview --message 'GitHub Actions uploading preview for Pull Request 763' --tag v0.0.1-pr.763
# wrangler versions list -c apps/stage-web/wrangler.toml --json --env preview | jq -r --arg tag v0.0.1-pr.763 'map(select(.annotations["workers/tag"] == $tag)) | sort_by(.metadata.created_on) | .[] | (.id // empty)'
# wrangler versions deploy -c ./apps/stage-web/wrangler.toml --env preview 2ab3c0ee-7597-4c20-ae5b-23536d7f79ec -y --message 'GitHub Actions deploying preview for Pull Request 763'
- name: Wrangler Get Version ID
id: wrangler-version-id
# [
# {
# "id": "2ab3c0ee-7597-4c20-ae5b-23536d7f79ec",
# "number": 4,
# "metadata": {
# "created_on": "2025-11-27T03:30:56.622177Z",
# "source": "wrangler",
# "author_id": "04391c4b41bbf6bd8220b4f469918aac",
# "author_email": "user@example.com",
# "has_preview": true
# },
# "annotations": {
# "workers/alias": "pr-763",
# "workers/message": "GitHub Actions deploying preview for PR 763",
# "workers/tag": "v0.0.1-pr.763",
# "workers/triggered_by": "version_upload"
# }
# }
# ]
#
# Here we use jq to filter the version with the specific tag we just uploaded,
#
# - map(input)
# - select( if input.[index].annotations.workers/tag === $tag ) // same as filter
# - sort_by( input.[index].metadata.created_on ) // sort by created_on
# - .[-1] // get the last one (latest)
# - .id // get the id field
#
# Which means we should get the version ID we just uploaded, in this example,
# 2ab3c0ee-7597-4c20-ae5b-23536d7f79ec
# returned
#
# Thanks to:
# - https://github.com/tuatmcc/tuatmcc.com/blob/b07197c1fb9f4939edcfa78fde96e6ad4e8a7205/.github/workflows/deploy.yml#L130C98-L130C118
# - https://github.com/shun-shobon/blog.s2n.tech/blob/51b864301c760414d7dc910308084ffd60625384/.github/workflows/deploy.yml#L102-L109
run: |
export VERSION_ID=$(wrangler versions list -c ${{ matrix.wrangler_config_path }} --json --env preview | jq -r --arg tag v0.0.1-pr.${{ steps.pr-num.outputs.PR_NUM }} 'map(select(.annotations["workers/tag"] == $tag)) | sort_by(.metadata.created_on) | .[-1] | (.id // empty)')
echo "VERSION_ID=$VERSION_ID" >> $GITHUB_ENV
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
- name: Wrangler Deploy
id: wrangler-deploy
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
command: versions deploy -c ${{ matrix.wrangler_config_path }} --env preview ${{ steps.wrangler-version-id.outputs.VERSION_ID }} --message 'GitHub Actions deploying preview for Pull Request ${{ steps.pr-num.outputs.PR_NUM }}' -y
gitHubToken: ${{ secrets.GITHUB_TOKEN }}
- name: Find Comment
uses: peter-evans/find-comment@v4
id: fc
with:
issue-number: ${{ steps.pr-num.outputs.PR_NUM }}
comment-author: 'github-actions[bot]'
body-includes: to Cloudflare Workers (Preview) for *${{ matrix.app_name }}*
- name: Create or update comment
uses: peter-evans/create-or-update-comment@v5
with:
comment-id: ${{ steps.fc.outputs.comment-id }}
issue-number: ${{ steps.pr-num.outputs.PR_NUM }}
edit-mode: replace
body: |
## ✅ Deploy to Cloudflare Workers (Preview) for *${{ matrix.app_name }}* ready!
| Name | Link |
|:-----------------------|:---------------------------------------------------------------------------------------------|
| 🔍 Latest deploy log | https://github.com/${{ github.repository }}/actions/runs/${{ github.event.workflow_run.id }} |
| 😎 Deploy Preview | ${{ steps.wrangler-deploy.outputs.deployment-url }} |
on-failure:
if: ${{ github.event.workflow_run.conclusion == 'failure' }}
name: Failed to build previewing docs
runs-on: ubuntu-latest
permissions:
pull-requests: write
strategy:
matrix:
include:
- app_name: stage-web
steps:
- name: Download artifact - PR
uses: dawidd6/action-download-artifact@v11
with:
workflow_conclusion: success
run_id: ${{ github.event.workflow_run.id }}
name: pr-num
path: pr-num
allow_forks: true
- name: Obtain PR number
id: pr-num
run: |
echo "PR_NUM=$(cat pr-num/pr_num)" >> "$GITHUB_OUTPUT"
- name: Find Comment
uses: peter-evans/find-comment@v4
id: fc
with:
issue-number: ${{ steps.pr-num.outputs.PR_NUM }}
comment-author: 'github-actions[bot]'
body-includes: to Cloudflare Workers (Preview) for *${{ matrix.app_name }}*
- name: Create or update comment
uses: peter-evans/create-or-update-comment@v5
with:
comment-id: ${{ steps.fc.outputs.comment-id }}
issue-number: ${{ steps.pr-num.outputs.PR_NUM }}
edit-mode: replace
body: |
## ❌ Deploy to Cloudflare Workers (Preview) for *${{ matrix.app_name }}* failed.
| Name | Link |
|:-----------------------|:---------------------------------------------------------------------------------------------|
| 🔍 Latest deploy log | https://github.com/${{ github.repository }}/actions/runs/${{ github.event.workflow_run.id }} |