From cdc16f39407bad645cc95829f71d19ebb8542a1f Mon Sep 17 00:00:00 2001 From: Eduard Wisch Date: Tue, 7 Apr 2026 00:12:08 +0200 Subject: [PATCH] Feat: Composite Action fuer Ntfy Build-Benachrichtigungen Initialer Import. Unterstuetzt start/success/failure mit passenden Tags, Prioritaeten und optionalem Click-URL. Nutzt wget (im Runner- Image vorhanden) und defaulted auf den zentralen Topic vk-builds. --- README.md | 67 ++++++++++++++++++++++++++++++++++++- action.yml | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 action.yml diff --git a/README.md b/README.md index 03fc164..0bf57e7 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,68 @@ # ntfy-action -Zentrale Composite Action für Ntfy-Benachrichtigungen in Forgejo-Workflows \ No newline at end of file +Zentrale Forgejo Composite Action für Build-Benachrichtigungen via [Ntfy](https://notify.data-it-solution.de). + +## Voraussetzungen + +- Secret `NTFY_AUTH` im Repo (oder auf Org-Ebene) gesetzt. Wert: `Basic `. +- Ntfy-Server läuft unter `https://notify.data-it-solution.de`, Topic-ACL ist im Ntfy-Container eingerichtet (siehe KB-Eintrag #188). + +## Verwendung + +```yaml +jobs: + build: + runs-on: docker + steps: + - uses: data/ntfy-action@main + with: + status: start + project: meinprojekt + ntfy_auth: ${{ secrets.NTFY_AUTH }} + run_number: ${{ github.run_number }} + message: ${{ github.event.head_commit.message }} + + # ... hier dein Build ... + + - uses: data/ntfy-action@main + if: success() + with: + status: success + project: meinprojekt + ntfy_auth: ${{ secrets.NTFY_AUTH }} + run_number: ${{ github.run_number }} + + - uses: data/ntfy-action@main + if: failure() + with: + status: failure + project: meinprojekt + ntfy_auth: ${{ secrets.NTFY_AUTH }} + run_number: ${{ github.run_number }} + click_url: https://git.data-it-solution.de/${{ github.repository }}/actions +``` + +## Inputs + +| Name | Pflicht | Default | Beschreibung | +|---|---|---|---| +| `status` | ja | — | `start`, `success` oder `failure` | +| `project` | ja | — | Projektname für Titel und Tag | +| `ntfy_auth` | ja | — | Basic-Auth-Header-Wert aus Secret | +| `topic` | nein | `vk-builds` | Ntfy-Topic | +| `message` | nein | `#` | Freie Nachricht (z. B. Commit-Message) | +| `run_number` | nein | — | Workflow-Run-Nummer | +| `click_url` | nein | — | URL beim Klick auf die Notification | +| `ntfy_server` | nein | `https://notify.data-it-solution.de` | Server-URL | + +## Topic-Konvention + +Per Default wird `vk-builds` als Sammel-Topic verwendet, damit du alle Build-Benachrichtigungen in einem einzigen Abo im Browser/Handy bekommst. Für projekt-spezifische Kanäle einfach `topic:` überschreiben. + +## Status-Mapping + +| Status | Priority | Tags | Titel | +|---|---|---|---| +| `start` | default | 🔧 hammer_and_wrench | ` Build gestartet` | +| `success` | high | ✅ white_check_mark | ` Build erfolgreich` | +| `failure` | urgent | ❌ rotating_light | ` Build FEHLGESCHLAGEN` | diff --git a/action.yml b/action.yml new file mode 100644 index 0000000..30c75b1 --- /dev/null +++ b/action.yml @@ -0,0 +1,97 @@ +name: "Ntfy Notify" +description: "Sendet Build-Status-Benachrichtigungen an den internen Ntfy-Server (notify.data-it-solution.de)" +author: "data-it-solution" + +inputs: + status: + description: "Build-Status: start, success, failure" + required: true + project: + description: "Projekt-Name (erscheint im Titel)" + required: true + topic: + description: "Ntfy-Topic (Default: vk-builds fuer alles)" + required: false + default: "vk-builds" + message: + description: "Frei waehlbarer Nachrichtentext (Default: Commit-Message)" + required: false + default: "" + ntfy_auth: + description: "Basic-Auth-Header-Wert (aus Secret NTFY_AUTH)" + required: true + ntfy_server: + description: "Ntfy-Server-URL (Default: https://notify.data-it-solution.de)" + required: false + default: "https://notify.data-it-solution.de" + run_number: + description: "Workflow-Run-Nummer (fuer den Titel)" + required: false + default: "" + click_url: + description: "URL, die beim Klick auf die Benachrichtigung geoeffnet wird" + required: false + default: "" + +runs: + using: "composite" + steps: + - name: Send Ntfy Notification + shell: sh + env: + NTFY_AUTH: ${{ inputs.ntfy_auth }} + NTFY_SERVER: ${{ inputs.ntfy_server }} + NTFY_TOPIC: ${{ inputs.topic }} + STATUS: ${{ inputs.status }} + PROJECT: ${{ inputs.project }} + MSG: ${{ inputs.message }} + RUN: ${{ inputs.run_number }} + CLICK: ${{ inputs.click_url }} + run: | + # Status -> Title, Priority, Tags + case "$STATUS" in + start) + TITLE="$PROJECT Build gestartet" + PRIO="default" + TAGS="hammer_and_wrench,$PROJECT" + ;; + success) + TITLE="$PROJECT Build erfolgreich" + PRIO="high" + TAGS="white_check_mark,$PROJECT" + ;; + failure) + TITLE="$PROJECT Build FEHLGESCHLAGEN" + PRIO="urgent" + TAGS="x,rotating_light,$PROJECT" + ;; + *) + TITLE="$PROJECT ($STATUS)" + PRIO="default" + TAGS="information_source,$PROJECT" + ;; + esac + + # Default-Message = "#: " falls leer + if [ -z "$MSG" ]; then + MSG="#$RUN" + elif [ -n "$RUN" ]; then + MSG="#$RUN: $MSG" + fi + + # Header zusammenbauen (Click-URL optional) + HDR_CLICK="" + if [ -n "$CLICK" ]; then + HDR_CLICK="--header=Click: $CLICK" + fi + + # wget, weil in den meisten Runner-Images vorinstalliert. + # `|| true` damit ein Ntfy-Ausfall den Build nicht rot macht. + wget -q -O- \ + --header="Authorization: $NTFY_AUTH" \ + --header="Title: $TITLE" \ + --header="Priority: $PRIO" \ + --header="Tags: $TAGS" \ + $HDR_CLICK \ + --post-data="$MSG" \ + "$NTFY_SERVER/$NTFY_TOPIC" || true