static-site-deploy/action.yml
Eric Wendland c242db40a1
All checks were successful
Test / test (push) Successful in 9s
feat(static-site-deploy): deploy with the workflow's OIDC identity
Without BUNNY_STORAGE_PASSWORD, the action now requests the running
workflow's OIDC identity token (Forgejo with enable-openid-connect,
GitHub with id-token: write) for the gateway's audience and starts the
deployment with it. It takes the Storage Zone password from the
gateway's answer, masks it in the log, plans and uploads with it, and
finalizes or aborts with a fresh token. A dry run in this mode stays
local. Password deployments work as before.

action.yml finds its script under FORGEJO_ACTION_PATH or
GITHUB_ACTION_PATH, so the action also runs on GitHub Actions.
2026-10-02 23:29:58 +02:00

60 lines
2.1 KiB
YAML

---
name: Deploy static site to Bunny
description: Safely synchronize a completed static website build to Bunny Storage.
inputs:
directory:
description: Directory containing the completed static build and index.html.
required: true
storage-zone:
description: Bunny Storage Zone name.
required: true
storage-endpoint:
description: Regional Bunny Storage API hostname.
required: false
default: storage.bunnycdn.com
purge-endpoint:
description: Optional trusted Gandalf deployment gateway base URL.
required: false
default: ""
edge-rules:
description: >-
Optional TOML file with [[edge_rules]] (redirects, status codes, headers,
cache times) for the site's Pull Zones. Needs purge-endpoint. Through the
gateway, leaving it empty removes rules from earlier deployments.
required: false
default: ""
dry-run:
description: Report changes without uploading or deleting files.
required: false
default: "false"
workers:
description: Maximum concurrent Bunny Storage transfers.
required: false
default: "16"
runs:
using: composite
steps:
- name: Synchronize static build
shell: bash
env:
STATIC_SITE_DIRECTORY: ${{ inputs.directory }}
BUNNY_STORAGE_ZONE: ${{ inputs.storage-zone }}
BUNNY_STORAGE_ENDPOINT: ${{ inputs.storage-endpoint }}
BUNNY_PURGE_ENDPOINT: ${{ inputs.purge-endpoint }}
STATIC_SITE_REVISION: ${{ github.sha }}
STATIC_SITE_DRY_RUN: ${{ inputs.dry-run }}
STATIC_SITE_WORKERS: ${{ inputs.workers }}
STATIC_SITE_EDGE_RULES: ${{ inputs.edge-rules }}
run: |
set -euo pipefail
args=(bunny "$STATIC_SITE_DIRECTORY" --workers "$STATIC_SITE_WORKERS")
if [[ "$STATIC_SITE_DRY_RUN" == "true" ]]; then
args+=(--dry-run)
elif [[ "$STATIC_SITE_DRY_RUN" != "false" ]]; then
echo "dry-run must be true or false" >&2
exit 2
fi
# Forgejo and GitHub name the action's checkout differently.
python3 "${FORGEJO_ACTION_PATH:-$GITHUB_ACTION_PATH}/static_site.py" "${args[@]}"