๐ Deploy cloud-mail to Cloudflare Workers workflow (maillab/cloud-mail)
The ๐ Deploy cloud-mail to Cloudflare Workers workflow from maillab/cloud-mail, explained and optimized by Latchkey.
CI health: C - fair
Point runs-on at Latchkey and get run de-duplication, job timeouts, SHA-pinned actions, self-healing for flaky steps, and up to 58% lower cost, applied automatically.
What it does
This is the ๐ Deploy cloud-mail to Cloudflare Workers workflow from the maillab/cloud-mail repository, a real project running GitHub Actions. It is shown here with attribution under its MIT license.
Below, Latchkey shows a faster, safer version produced by its optimization engine.
The workflow
name: ๐ Deploy cloud-mail to Cloudflare Workers
on:
push:
branches: [ main ]
paths:
- "mail-worker/**"
- "mail-vue/**"
workflow_dispatch:
jobs:
Deploy-cloud-mail:
name: ๐๏ธ Build and Deploy
runs-on: ubuntu-latest
env:
NAME: ${{ secrets.NAME || vars.NAME || 'cloud-mail' }}
CUSTOM_DOMAIN: ${{ secrets.CUSTOM_DOMAIN || vars.CUSTOM_DOMAIN }}
DOMAIN: ${{ secrets.DOMAIN || vars.DOMAIN }}
ADMIN: ${{ secrets.ADMIN || vars.ADMIN }}
JWT_SECRET: ${{ secrets.JWT_SECRET || vars.JWT_SECRET }}
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN || vars.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID || vars.CLOUDFLARE_ACCOUNT_ID }}
D1_DATABASE_ID: ${{ secrets.D1_DATABASE_ID || vars.D1_DATABASE_ID }}
KV_NAMESPACE_ID: ${{ secrets.KV_NAMESPACE_ID || vars.KV_NAMESPACE_ID }}
R2_BUCKET_NAME: ${{ secrets.R2_BUCKET_NAME || vars.R2_BUCKET_NAME }}
PROJECT_LINK: ${{ secrets.PROJECT_LINK || vars.PROJECT_LINK }}
AI_MODEL: ${{ secrets.AI_MODEL || vars.AI_MODEL || '@cf/meta/llama-3.1-8b-instruct' }}
CLOUDFLARE_EMAIL: ${{ secrets.CF_EMAIL || vars.CF_EMAIL || false }}
ANALYSIS_CACHE: ${{ secrets.ANALYSIS_CACHE || vars.ANALYSIS_CACHE || false }}
LINUXDO_CLIENT_ID: ${{ secrets.LINUXDO_CLIENT_ID || vars.LINUXDO_CLIENT_ID }}
LINUXDO_CLIENT_SECRET: ${{ secrets.LINUXDO_CLIENT_SECRET || vars.LINUXDO_CLIENT_SECRET }}
LINUXDO_CALLBACK_URL: ${{ secrets.LINUXDO_CALLBACK_URL || vars.LINUXDO_CALLBACK_URL }}
LINUXDO_SWITCH: ${{ secrets.LINUXDO_SWITCH || vars.LINUXDO_SWITCH }}
outputs:
worker_url: ${{ steps.deploy.outputs.worker_url }}
steps:
- name: ๐ ๆฃๅบไปฃ็ ไปๅบ / Checkout repository
uses: actions/checkout@v4
- name: โ ่ฎพ็ฝฎ pnpm / Set up pnpm
uses: pnpm/action-setup@v4.1.0
with:
version: 9
- name: โ ่ฎพ็ฝฎ Node.js / Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "22"
cache: "pnpm"
cache-dependency-path: "./mail-worker/pnpm-lock.yaml"
- name: ๐ฆ ๅฎ่ฃ
ไพ่ต / Install dependencies
run: pnpm install --frozen-lockfile
working-directory: ./mail-worker
- name: ๐ก ็ฆ็จ Wrangler ้ฅๆต / Disable wrangler telemetry
working-directory: ./mail-worker
run: pnpm wrangler telemetry disable
- name: ๐ ๏ธ ่ฎพ็ฝฎ็ฏๅข / Set up environment
working-directory: ./mail-worker
run: |
echo "๐ Starting environment setup..."
if [ -z "$JWT_SECRET" ] || grep -q '[?%#/\\]' <<< "$JWT_SECRET"; then
echo "โ JWT_SECRET variable is empty or contains invalid characters (?, %, #, /, \\)."
exit 1
fi
if ! jq -e 'type == "array"' <<< "$DOMAIN" ; then
echo "โ DOMAIN variable must be a JSON array (e.g., [\"example.com\"])."
exit 1
fi
if [ -z "$ADMIN" ]; then
echo "โ ADMIN variable cannot be empty."
exit 1
fi
if [ -z "$CLOUDFLARE_ACCOUNT_ID" ]; then
echo "โ CLOUDFLARE_ACCOUNT_ID variable cannot be empty."
exit 1
fi
if [ -z "$CLOUDFLARE_API_TOKEN" ]; then
echo "โ CLOUDFLARE_API_TOKEN variable cannot be empty."
exit 1
fi
if [ -z "$CUSTOM_DOMAIN" ]; then
echo "::warning:: CUSTOM_DOMAIN variable is not set."
fi
CONFIG_FILE="wrangler-action.toml"
if [ -z "$R2_BUCKET_NAME" ]; then
sed -i '/\[\[r2_buckets\]\]/,/^$/d' "$CONFIG_FILE"
fi
if [ -z "$PROJECT_LINK" ]; then
sed -i '/^project_link = /d' "$CONFIG_FILE"
fi
if [ -z "$LINUXDO_CLIENT_ID" ] || [ -z "$LINUXDO_CLIENT_SECRET" ]; then
sed -i '/^linuxdo_client_id = /,/^linuxdo_switch = /d' "$CONFIG_FILE"
fi
if [ -z "$CUSTOM_DOMAIN" ]; then
sed -i '/\[\[routes\]\]/,/^$/d' "$CONFIG_FILE"
fi
if [ "$(printf '%s' "$CLOUDFLARE_EMAIL" | tr '[:upper:]' '[:lower:]')" = "true" ]; then
cat >> "$CONFIG_FILE" <<'EOF'
[[send_email]]
name = "email"
EOF
fi
sed -i "s|\${NAME}|${NAME}|g" "$CONFIG_FILE"
sed -i "s|\${CUSTOM_DOMAIN}|${CUSTOM_DOMAIN}|g" "$CONFIG_FILE"
sed -i "s|\"\${DOMAIN}\"|${DOMAIN}|g" "$CONFIG_FILE"
sed -i "s|\${ADMIN}|${ADMIN}|g" "$CONFIG_FILE"
sed -i "s|\${JWT_SECRET}|${JWT_SECRET}|g" "$CONFIG_FILE"
sed -i "s|\${R2_BUCKET_NAME}|${R2_BUCKET_NAME}|g" "$CONFIG_FILE"
sed -i "s|\${PROJECT_LINK}|${PROJECT_LINK}|g" "$CONFIG_FILE"
sed -i "s|\${ANALYSIS_CACHE}|${ANALYSIS_CACHE}|g" "$CONFIG_FILE"
sed -i "s|\${AI_MODEL}|${AI_MODEL}|g" "$CONFIG_FILE"
sed -i "s|\${LINUXDO_CLIENT_ID}|${LINUXDO_CLIENT_ID}|g" "$CONFIG_FILE"
sed -i "s|\${LINUXDO_CLIENT_SECRET}|${LINUXDO_CLIENT_SECRET}|g" "$CONFIG_FILE"
sed -i "s|\${LINUXDO_CALLBACK_URL}|${LINUXDO_CALLBACK_URL}|g" "$CONFIG_FILE"
sed -i "s|\${LINUXDO_SWITCH}|${LINUXDO_SWITCH}|g" "$CONFIG_FILE"
echo "โ
Environment setup completed."
- name: โก ่ฎพ็ฝฎKVๆฐๆฎๅบ / Set up KV database
working-directory: ./mail-worker
run: |
CONFIG_FILE="wrangler-action.toml"
if [ -n "$KV_NAMESPACE_ID" ]; then
sed -i "s|\${KV_NAMESPACE_ID}|${KV_NAMESPACE_ID}|g" "$CONFIG_FILE"
echo "โ
Using the database from environment variables."
exit 0
fi
echo "๐ Checking if the database exists..."
set +e
KV_LIST=$(pnpm wrangler kv namespace list 2>&1)
STATUS=$?
set -e
if [ $STATUS -ne 0 ]; then
echo "$KV_LIST"
exit 1
fi
if echo "$KV_LIST" | jq -e ".[] | select(.title == \"$NAME\")" >/dev/null; then
echo "โ
Database $NAME already exists."
KV_ID=$(echo "$KV_LIST" | jq -r ".[] | select(.title == \"$NAME\") | .id")
echo "KV_NAMESPACE_ID: $KV_ID"
else
echo "โ ๏ธ Database $NAME does not exist. Starting creation..."
pnpm wrangler kv namespace create $NAME
KV_LIST=$(pnpm wrangler kv namespace list)
KV_ID=$(echo "$KV_LIST" | jq -r ".[] | select(.title == \"$NAME\") | .id")
fi
sed -i "s|\${KV_NAMESPACE_ID}|$KV_ID|g" "$CONFIG_FILE"
echo "โ
Setup completed."
- name: ๐ฌ ่ฎพ็ฝฎD1ๆฐๆฎๅบ / Set up D1 database
working-directory: ./mail-worker
run: |
CONFIG_FILE="wrangler-action.toml"
if [ -n "$D1_DATABASE_ID" ]; then
sed -i "s|\${D1_DATABASE_ID}|${D1_DATABASE_ID}|g" "$CONFIG_FILE"
echo "โ
Using the database from environment variables."
exit 0
fi
echo "๐ Checking if the database exists..."
set +e
DB_LIST=$(pnpm wrangler d1 list --json 2>&1)
STATUS=$?
set -e
if [ $STATUS -ne 0 ]; then
echo "$DB_LIST"
exit 1
fi
if echo "$DB_LIST" | jq -e ".[] | select(.name == \"$NAME\")" >/dev/null; then
echo "โ
Database $NAME already exists."
D1_ID=$(echo "$DB_LIST" | jq -r ".[] | select(.name == \"$NAME\") | .uuid")
echo "D1_DATABASE_ID: $D1_ID"
else
echo "โ ๏ธ Database $NAME does not exist. Starting creation..."
pnpm wrangler d1 create $NAME
DB_LIST=$(pnpm wrangler d1 list --json)
D1_ID=$(echo "$DB_LIST" | jq -r ".[] | select(.name == \"$NAME\") | .uuid")
fi
sed -i "s|\${D1_DATABASE_ID}|$D1_ID|g" "$CONFIG_FILE"
echo "โ
Setup completed."
- name: ๐ ๅผๅง้จ็ฝฒ / Start deployment
id: deploy
working-directory: ./mail-worker
run: |
echo "๐ Starting deployment..."
pnpm wrangler deploy -c wrangler-action.toml 2>&1 \
| tee deploy.log \
| grep -v "https://.*\.workers\.dev" \
| sed -E 's/env\.domain .*/env.domain (***)/' \
|| true
DEPLOY_EXIT_CODE=${PIPESTATUS[0]}
if [ $DEPLOY_EXIT_CODE -ne 0 ]; then
exit 1
fi
WORKER_URL=$(grep -o "https://.*\.workers\.dev" deploy.log || echo "")
if [ -n "$WORKER_URL" ]; then
echo "::add-mask::$WORKER_URL"
fi
echo "worker_url=$WORKER_URL" >> $GITHUB_OUTPUT
echo "โ
Setup completed."
- name: โป๏ธ ๅๅงๅๆฐๆฎๅบ / Initialize database
run: |
echo "๐ ๏ธ Starting database initialization..."
sleep 15
WORKER_URL="${CUSTOM_DOMAIN:+https://$CUSTOM_DOMAIN}"
WORKER_URL="${WORKER_URL:-${{ steps.deploy.outputs.worker_url }}}"
if [ -z "$WORKER_URL" ]; then
echo "โ Preview URL not available. Please set CUSTOM_DOMAIN."
exit 1
fi
HTTP_CODE=$(curl -sL -w "%{http_code}" -o response.txt "$WORKER_URL/api/init/${JWT_SECRET}")
RESPONSE_BODY=$(cat response.txt)
if [ "$RESPONSE_BODY" = "success" ]; then
echo "โ
Setup completed."
else
echo "โ Failed. HTTP: $HTTP_CODE, Response: $RESPONSE_BODY"
exit 1
fi
- name: ๐๏ธ ๅ ้ค่ฟ่ก่ฎฐๅฝ / Delete workflow runs
uses: GitRML/delete-workflow-runs@main
continue-on-error: true
with:
retain_days: '1'
keep_minimum_runs: '0'
The same workflow, on Latchkey
Removes redundant runs and caps runaway jobs. Added and changed lines are highlighted.
name: ๐ Deploy cloud-mail to Cloudflare Workers on: push: branches: [ main ] paths: - "mail-worker/**" - "mail-vue/**" workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: Deploy-cloud-mail: timeout-minutes: 30 name: ๐๏ธ Build and Deploy runs-on: latchkey-small env: NAME: ${{ secrets.NAME || vars.NAME || 'cloud-mail' }} CUSTOM_DOMAIN: ${{ secrets.CUSTOM_DOMAIN || vars.CUSTOM_DOMAIN }} DOMAIN: ${{ secrets.DOMAIN || vars.DOMAIN }} ADMIN: ${{ secrets.ADMIN || vars.ADMIN }} JWT_SECRET: ${{ secrets.JWT_SECRET || vars.JWT_SECRET }} CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN || vars.CLOUDFLARE_API_TOKEN }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID || vars.CLOUDFLARE_ACCOUNT_ID }} D1_DATABASE_ID: ${{ secrets.D1_DATABASE_ID || vars.D1_DATABASE_ID }} KV_NAMESPACE_ID: ${{ secrets.KV_NAMESPACE_ID || vars.KV_NAMESPACE_ID }} R2_BUCKET_NAME: ${{ secrets.R2_BUCKET_NAME || vars.R2_BUCKET_NAME }} PROJECT_LINK: ${{ secrets.PROJECT_LINK || vars.PROJECT_LINK }} AI_MODEL: ${{ secrets.AI_MODEL || vars.AI_MODEL || '@cf/meta/llama-3.1-8b-instruct' }} CLOUDFLARE_EMAIL: ${{ secrets.CF_EMAIL || vars.CF_EMAIL || false }} ANALYSIS_CACHE: ${{ secrets.ANALYSIS_CACHE || vars.ANALYSIS_CACHE || false }} LINUXDO_CLIENT_ID: ${{ secrets.LINUXDO_CLIENT_ID || vars.LINUXDO_CLIENT_ID }} LINUXDO_CLIENT_SECRET: ${{ secrets.LINUXDO_CLIENT_SECRET || vars.LINUXDO_CLIENT_SECRET }} LINUXDO_CALLBACK_URL: ${{ secrets.LINUXDO_CALLBACK_URL || vars.LINUXDO_CALLBACK_URL }} LINUXDO_SWITCH: ${{ secrets.LINUXDO_SWITCH || vars.LINUXDO_SWITCH }} outputs: worker_url: ${{ steps.deploy.outputs.worker_url }} steps: - name: ๐ ๆฃๅบไปฃ็ ไปๅบ / Checkout repository uses: actions/checkout@v4 - name: โ ่ฎพ็ฝฎ pnpm / Set up pnpm uses: pnpm/action-setup@v4.1.0 with: version: 9 - name: โ ่ฎพ็ฝฎ Node.js / Set up Node.js uses: actions/setup-node@v4 with: node-version: "22" cache: "pnpm" cache-dependency-path: "./mail-worker/pnpm-lock.yaml" - name: ๐ฆ ๅฎ่ฃ ไพ่ต / Install dependencies run: pnpm install --frozen-lockfile working-directory: ./mail-worker - name: ๐ก ็ฆ็จ Wrangler ้ฅๆต / Disable wrangler telemetry working-directory: ./mail-worker run: pnpm wrangler telemetry disable - name: ๐ ๏ธ ่ฎพ็ฝฎ็ฏๅข / Set up environment working-directory: ./mail-worker run: | echo "๐ Starting environment setup..." if [ -z "$JWT_SECRET" ] || grep -q '[?%#/\\]' <<< "$JWT_SECRET"; then echo "โ JWT_SECRET variable is empty or contains invalid characters (?, %, #, /, \\)." exit 1 fi if ! jq -e 'type == "array"' <<< "$DOMAIN" ; then echo "โ DOMAIN variable must be a JSON array (e.g., [\"example.com\"])." exit 1 fi if [ -z "$ADMIN" ]; then echo "โ ADMIN variable cannot be empty." exit 1 fi if [ -z "$CLOUDFLARE_ACCOUNT_ID" ]; then echo "โ CLOUDFLARE_ACCOUNT_ID variable cannot be empty." exit 1 fi if [ -z "$CLOUDFLARE_API_TOKEN" ]; then echo "โ CLOUDFLARE_API_TOKEN variable cannot be empty." exit 1 fi if [ -z "$CUSTOM_DOMAIN" ]; then echo "::warning:: CUSTOM_DOMAIN variable is not set." fi CONFIG_FILE="wrangler-action.toml" if [ -z "$R2_BUCKET_NAME" ]; then sed -i '/\[\[r2_buckets\]\]/,/^$/d' "$CONFIG_FILE" fi if [ -z "$PROJECT_LINK" ]; then sed -i '/^project_link = /d' "$CONFIG_FILE" fi if [ -z "$LINUXDO_CLIENT_ID" ] || [ -z "$LINUXDO_CLIENT_SECRET" ]; then sed -i '/^linuxdo_client_id = /,/^linuxdo_switch = /d' "$CONFIG_FILE" fi if [ -z "$CUSTOM_DOMAIN" ]; then sed -i '/\[\[routes\]\]/,/^$/d' "$CONFIG_FILE" fi if [ "$(printf '%s' "$CLOUDFLARE_EMAIL" | tr '[:upper:]' '[:lower:]')" = "true" ]; then cat >> "$CONFIG_FILE" <<'EOF' [[send_email]] name = "email" EOF fi sed -i "s|\${NAME}|${NAME}|g" "$CONFIG_FILE" sed -i "s|\${CUSTOM_DOMAIN}|${CUSTOM_DOMAIN}|g" "$CONFIG_FILE" sed -i "s|\"\${DOMAIN}\"|${DOMAIN}|g" "$CONFIG_FILE" sed -i "s|\${ADMIN}|${ADMIN}|g" "$CONFIG_FILE" sed -i "s|\${JWT_SECRET}|${JWT_SECRET}|g" "$CONFIG_FILE" sed -i "s|\${R2_BUCKET_NAME}|${R2_BUCKET_NAME}|g" "$CONFIG_FILE" sed -i "s|\${PROJECT_LINK}|${PROJECT_LINK}|g" "$CONFIG_FILE" sed -i "s|\${ANALYSIS_CACHE}|${ANALYSIS_CACHE}|g" "$CONFIG_FILE" sed -i "s|\${AI_MODEL}|${AI_MODEL}|g" "$CONFIG_FILE" sed -i "s|\${LINUXDO_CLIENT_ID}|${LINUXDO_CLIENT_ID}|g" "$CONFIG_FILE" sed -i "s|\${LINUXDO_CLIENT_SECRET}|${LINUXDO_CLIENT_SECRET}|g" "$CONFIG_FILE" sed -i "s|\${LINUXDO_CALLBACK_URL}|${LINUXDO_CALLBACK_URL}|g" "$CONFIG_FILE" sed -i "s|\${LINUXDO_SWITCH}|${LINUXDO_SWITCH}|g" "$CONFIG_FILE" echo "โ Environment setup completed." - name: โก ่ฎพ็ฝฎKVๆฐๆฎๅบ / Set up KV database working-directory: ./mail-worker run: | CONFIG_FILE="wrangler-action.toml" if [ -n "$KV_NAMESPACE_ID" ]; then sed -i "s|\${KV_NAMESPACE_ID}|${KV_NAMESPACE_ID}|g" "$CONFIG_FILE" echo "โ Using the database from environment variables." exit 0 fi echo "๐ Checking if the database exists..." set +e KV_LIST=$(pnpm wrangler kv namespace list 2>&1) STATUS=$? set -e if [ $STATUS -ne 0 ]; then echo "$KV_LIST" exit 1 fi if echo "$KV_LIST" | jq -e ".[] | select(.title == \"$NAME\")" >/dev/null; then echo "โ Database $NAME already exists." KV_ID=$(echo "$KV_LIST" | jq -r ".[] | select(.title == \"$NAME\") | .id") echo "KV_NAMESPACE_ID: $KV_ID" else echo "โ ๏ธ Database $NAME does not exist. Starting creation..." pnpm wrangler kv namespace create $NAME KV_LIST=$(pnpm wrangler kv namespace list) KV_ID=$(echo "$KV_LIST" | jq -r ".[] | select(.title == \"$NAME\") | .id") fi sed -i "s|\${KV_NAMESPACE_ID}|$KV_ID|g" "$CONFIG_FILE" echo "โ Setup completed." - name: ๐ฌ ่ฎพ็ฝฎD1ๆฐๆฎๅบ / Set up D1 database working-directory: ./mail-worker run: | CONFIG_FILE="wrangler-action.toml" if [ -n "$D1_DATABASE_ID" ]; then sed -i "s|\${D1_DATABASE_ID}|${D1_DATABASE_ID}|g" "$CONFIG_FILE" echo "โ Using the database from environment variables." exit 0 fi echo "๐ Checking if the database exists..." set +e DB_LIST=$(pnpm wrangler d1 list --json 2>&1) STATUS=$? set -e if [ $STATUS -ne 0 ]; then echo "$DB_LIST" exit 1 fi if echo "$DB_LIST" | jq -e ".[] | select(.name == \"$NAME\")" >/dev/null; then echo "โ Database $NAME already exists." D1_ID=$(echo "$DB_LIST" | jq -r ".[] | select(.name == \"$NAME\") | .uuid") echo "D1_DATABASE_ID: $D1_ID" else echo "โ ๏ธ Database $NAME does not exist. Starting creation..." pnpm wrangler d1 create $NAME DB_LIST=$(pnpm wrangler d1 list --json) D1_ID=$(echo "$DB_LIST" | jq -r ".[] | select(.name == \"$NAME\") | .uuid") fi sed -i "s|\${D1_DATABASE_ID}|$D1_ID|g" "$CONFIG_FILE" echo "โ Setup completed." - name: ๐ ๅผๅง้จ็ฝฒ / Start deployment id: deploy working-directory: ./mail-worker run: | echo "๐ Starting deployment..." pnpm wrangler deploy -c wrangler-action.toml 2>&1 \ | tee deploy.log \ | grep -v "https://.*\.workers\.dev" \ | sed -E 's/env\.domain .*/env.domain (***)/' \ || true DEPLOY_EXIT_CODE=${PIPESTATUS[0]} if [ $DEPLOY_EXIT_CODE -ne 0 ]; then exit 1 fi WORKER_URL=$(grep -o "https://.*\.workers\.dev" deploy.log || echo "") if [ -n "$WORKER_URL" ]; then echo "::add-mask::$WORKER_URL" fi echo "worker_url=$WORKER_URL" >> $GITHUB_OUTPUT echo "โ Setup completed." - name: โป๏ธ ๅๅงๅๆฐๆฎๅบ / Initialize database run: | echo "๐ ๏ธ Starting database initialization..." sleep 15 WORKER_URL="${CUSTOM_DOMAIN:+https://$CUSTOM_DOMAIN}" WORKER_URL="${WORKER_URL:-${{ steps.deploy.outputs.worker_url }}}" if [ -z "$WORKER_URL" ]; then echo "โ Preview URL not available. Please set CUSTOM_DOMAIN." exit 1 fi HTTP_CODE=$(curl -sL -w "%{http_code}" -o response.txt "$WORKER_URL/api/init/${JWT_SECRET}") RESPONSE_BODY=$(cat response.txt) if [ "$RESPONSE_BODY" = "success" ]; then echo "โ Setup completed." else echo "โ Failed. HTTP: $HTTP_CODE, Response: $RESPONSE_BODY" exit 1 fi - name: ๐๏ธ ๅ ้ค่ฟ่ก่ฎฐๅฝ / Delete workflow runs uses: GitRML/delete-workflow-runs@main continue-on-error: true with: retain_days: '1' keep_minimum_runs: '0'
What changed
- Run on Latchkey managed runners with one line (
runs-on), which apply the fixes below automatically and self-heal transient failures. This example useslatchkey-small; pick the runner size that fits the job. - Cancel superseded runs when a branch or PR gets a newer push.
- Add a job timeout so a hung step cannot burn hours of runner time.
2 third-party actions are referenced by a movable tag. Pin them to the commit SHA (Latchkey resolves and applies this automatically) so a repointed tag cannot change what runs.
What Latchkey heals here
This workflow has steps that commonly fail on transient issues (network, registries, flaky browsers). On Latchkey managed runners they are detected, retried, and self-healed instead of failing your build:
- Dependency installs
This workflow runs 1 job per trigger. On Latchkey the same minutes cost up to 58% less than GitHub-hosted, with zero queue time.