From 6dce97d459211fb92864b0c3b1fb3a3ad83ca8e7 Mon Sep 17 00:00:00 2001 From: sneak Date: Thu, 5 Nov 2026 20:02:52 +0000 Subject: [PATCH] Notify sneak's ntfy topic on every CI deploy (closes #48) Add a notify job to the deploy workflow that posts an ntfy message on success or failure, using the topic from secrets.NTFY_TOPIC. Model: deepseek-v4-pro --- .gitea/workflows/deploy.yml | 40 +++++++++++++++++++++++++++++++++++++ TODO.md | 10 ++++++++++ 2 files changed, 50 insertions(+) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 8263c4a..46326a1 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -108,3 +108,43 @@ jobs: run: wrangler pages deploy public --project-name=lora-vegas --branch=${{ github.ref_name }} env: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + + notify: + runs-on: ubuntu-latest + needs: [build, deploy] + # Run whether the build and deploy passed or failed. The Notify step + # carries continue-on-error: true so a notification that cannot be sent + # leaves the deploy's result exactly as it was. + if: always() + container: + # node 20.20.2-bookworm, 2026-08-09. Same pinned image as the deploy + # job, chosen because it ships curl; no extra packages to install. + image: node@sha256:8f693eaa7e0a8e71560c9a82b55fd54c2ae920a2ba5d2cde28bac7d1c01c9ba5 + steps: + # needs.deploy.result is "success" only when the deploy job actually + # published; anything else -- a failed build or a failed deploy -- is + # reported as a failure with a link to the run. + - name: Notify + # curl failing (ntfy unreachable or erroring, or NTFY_TOPIC + # absent) must not fail the run, so continue-on-error lives on + # this step and not on the job: on this Gitea a job-level flag + # still marks the job failed and reddens the commit. + continue-on-error: true + env: + RESULT: ${{ needs.deploy.result }} + NTFY_TOPIC: ${{ secrets.NTFY_TOPIC }} + run: | + short="$(printf '%.7s' "$GITHUB_SHA")" + run_url="$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID" + if [ "$RESULT" = success ]; then + curl -fsS --max-time 10 \ + -H "Title: lora.vegas deployed from $GITHUB_REF_NAME" \ + -d "$short deployed to https://lora.vegas/" \ + "https://ntfy.sh/$NTFY_TOPIC" + else + curl -fsS --max-time 10 \ + -H "Title: lora.vegas deploy from $GITHUB_REF_NAME failed" \ + -H "Priority: high" \ + -d "Run: $run_url" \ + "https://ntfy.sh/$NTFY_TOPIC" + fi diff --git a/TODO.md b/TODO.md index 3b9cf6c..34ac581 100644 --- a/TODO.md +++ b/TODO.md @@ -34,6 +34,16 @@ leaning on `.gitignore` (https://git.eeqj.de/sneak/lora.vegas/issues/33). # Completed Steps +- 2026-11-05: added a `notify` job to the deploy workflow that posts an ntfy + message on every deploy, success or failure (closes + https://git.eeqj.de/sneak/lora.vegas/issues/48). The job runs `if: always()` + so it fires whether the build and deploy passed or failed, and the Notify step + carries `continue-on-error: true` so a notification that cannot be sent leaves + the deploy's result exactly as it was. On success the message body is the + short commit plus the site URL, and on failure it is a link to the run. The + topic comes from the `NTFY_TOPIC` Actions secret, which sneak must add before + anything is sent; the topic is never written in the repository. Both curl + calls carry `--max-time 10` so a stalled ntfy cannot hold the run open - 2026-10-21: made `script/lint` fail when two pages write the same output path (https://git.eeqj.de/sneak/lora.vegas/issues/25). `Dockerfile.lint` now runs `hugo --minify --printPathWarnings --panicOnWarning`. `--printPathWarnings` -- 2.54.0