Files
direct-img.link/.github/workflows/deploy.yml
T
multipleof4andClaude Opus 5.5 32f742b73f Feat: Move from Pages to a Worker and serve popular images as static files
Static assets don't count toward the free plan's 100,000 requests a day, so a
daily GitHub Action promotes the most viewed images (by Cloudflare analytics)
from R2 into public/ before deploying, and reports to ntfy. Zone rules fold
the site and ?i= into the path, since static files ignore query strings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 17:08:34 +00:00

73 lines
2.4 KiB
YAML

# Deploys the worker on every push to main and once a day. Each run first promotes the most viewed images to static
# files (scripts/promote.js) and ends with an ntfy message on what changed and anything that needs attention.
name: Deploy
on:
push:
branches: [main]
schedule:
# Just after 00:00 UTC, when the free plan's daily request count resets, so the report covers a full day
- cron: "23 0 * * *"
workflow_dispatch:
concurrency:
group: deploy
permissions:
contents: read
actions: write # deletes the previous run's image cache
jobs:
deploy:
runs-on: ubuntu-latest
timeout-minutes: 120
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
# Promotion limits (see scripts/promote.js)
MIN_VIEWS: 20
MAX_BYTES: 4000000000
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
# Last run's promoted images, so only newly promoted ones download from R2
- uses: actions/cache/restore@v4
with:
path: promoted
key: promoted-${{ github.run_id }}
restore-keys: promoted-
- id: promote
run: node scripts/promote.js
- id: deploy
run: npx -y wrangler@4 deploy
- if: steps.promote.outcome == 'success'
uses: actions/cache/save@v4
with:
path: promoted
key: promoted-${{ github.run_id }}
# Each run saves a new cache, so older ones go to stay under the repo's 10 GB
- if: steps.promote.outcome == 'success'
continue-on-error: true
env:
GH_TOKEN: ${{ github.token }}
GH_REPO: ${{ github.repository }}
run: gh cache list --key promoted- --json id,key --jq '.[] | select(.key != "promoted-${{ github.run_id }}") | .id' | xargs -r -n1 gh cache delete
- if: always()
env:
NTFY_URL: ${{ secrets.NTFY_URL }}
NTFY_TOKEN: ${{ secrets.NTFY_TOKEN }}
STATUS: ${{ job.status }}
FAILED_STEP: ${{ steps.promote.outcome == 'failure' && 'Promoting images' || steps.deploy.outcome == 'failure' && 'wrangler deploy' || '' }}
TRIGGER: ${{ github.event_name }}
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
run: node scripts/notify.js