The four workflows all triggered on the same push to main and ran fully independently, so build-main.yml published a latest-main release even when PHPUnit or the linters were red. `needs:` only works between jobs of one workflow, so the checks move into build-main.yml and the package job now depends on them. Two gaps close along the way: the check workflows only ran on main pushes and pull requests, so a v* tag was published entirely unverified, and `npm run build` only ran on main, so no pull request ever exercised the frontend build -- the workflow now runs on pull_request too, with the publish step skipped so the job acts as a build check. Build and publish deliberately stay in a single job; moving the tarball between jobs would require actions/upload-artifact (unusable on this Gitea, see CLAUDE.md) or actions/cache.
Deck Workflow-Automatisierung
Nextcloud-App für Nextcloud Hub 26 Spring (Server 34.x), die überfällige Karten der Deck-App automatisch von einem Stapel in einen anderen verschiebt und optional eine E-Mail-Benachrichtigung verschickt.
Ersetzt das früher genutzte eigenständige PHP-Cron-Skript durch eine vollwertige App mit Oberfläche in den persönlichen Einstellungen — jeder Nutzer kann dort seine eigenen Regeln ("Workflows") anlegen, ohne Admin-Rechte oder Server-Zugriff zu benötigen.
Funktionsumfang
Pro Workflow lässt sich konfigurieren:
- Quell-Board und Quell-Stapel
- Ziel-Stapel, in den überfällige Karten verschoben werden
- optionaler Filter auf zugewiesene Benutzer (Karte muss mindestens einem der gewählten Benutzer zugewiesen sein)
- optionaler Filter auf Labels/Tags (Karte muss mindestens eines der gewählten Labels haben)
- Checkbox: E-Mail-Benachrichtigung an den Workflow-Besitzer, sobald eine Karte verschoben wurde
Ein Nutzer kann beliebig viele Workflows anlegen, bearbeiten, deaktivieren oder löschen.
Architektur
- Keine HTTP/OCS-Aufrufe gegen Deck. Alles Lesen (Boards, Stapel, Karten, Labels, zugewiesene Benutzer) und das Verschieben von Karten läuft ausschließlich über Decks eigene interne PHP-Klassen (
OCA\Deck\Service\CardService,StackService,BoardService,OCA\Deck\Db\CardMapper, …), aufgelöst per Dependency Injection direkt im selben PHP-Prozess. Sämtlicher Deck-Zugriff ist inlib/Service/DeckIntegrationService.phpgebündelt. - Hintergrundjob statt Seitenaufruf.
lib/BackgroundJob/RunWorkflowsJob.phpist einTimedJob, der alle 5 Minuten läuft (abhängig vom Nextcloud-Cron-Intervall) undlib/Service/WorkflowRunner.phpaufruft. - Rechte-Kontext je Nutzer. Da Decks Berechtigungsprüfungen die aktuell eingeloggte Session lesen, ein Hintergrundjob aber standardmäßig keinen eingeloggten Nutzer hat und Regeln mehrerer Nutzer in einem einzigen Lauf auswerten muss, "verkörpert" der
WorkflowRunnerfür die Dauer der jeweiligen Workflows kurzzeitig den entsprechenden Besitzer (IUserSession::setUser()), bevor die Deck-Klassen aufgerufen werden. - E-Mail läuft über Nextclouds eigenen
IMailer(nutzt also den in der Nextcloud-Administration hinterlegten Mailserver) und geht an die im Profil des Workflow-Besitzers hinterlegte Adresse.
Wichtiger Hinweis zu Decks internen Klassen
OCA\Deck\* ist keine dokumentierte, stabile öffentliche API von Deck (keine @since-Markierungen, keine offizielle Zusicherung von Abwärtskompatibilität). Diese App verwendet sie trotzdem bewusst direkt, wie es die Vorgabe verlangt — jeder Zugriff läuft defensiv abgesichert über DeckIntegrationService (Prüfung, ob Deck aktiviert ist, class_exists()-Checks, try/catch mit Logging statt Absturz). Nach größeren Deck-Updates lohnt sich ein Blick ins Nextcloud-Log, falls Workflows plötzlich nicht mehr greifen.
Installation
- App in
apps/workflow_deck_automationdes Nextcloud-Servers ablegen (oder über den Appstore-Build aus der CI, siehe unten). - In der Nextcloud-Administration unter Apps aktivieren.
- Die Deck-App muss installiert und für die jeweiligen Nutzer aktiviert sein.
- Sicherstellen, dass der Hintergrundjob-Modus auf Cron (empfohlen) steht, damit
RunWorkflowsJobregelmäßig läuft.
Benutzung
Jeder Nutzer findet die Einstellungen unter Persönliche Einstellungen → Deck Workflow-Automatisierung. Dort können neue Workflows angelegt, bestehende bearbeitet oder gelöscht werden. Die Dropdowns für Board/Stapel/Label/Benutzer werden live aus Deck geladen.
Entwicklung
Voraussetzungen: PHP 8.2+, Composer, Node.js 24+, npm 11+.
composer install
npm install
npm run build # einmaliger Produktions-Build
npm run watch # Entwicklung mit automatischem Rebuild
Tests & Linting
composer run lint # php -l über lib/ und tests/
composer run cs:check # nextcloud/coding-standard (php-cs-fixer)
composer run test:unit # PHPUnit — reine Filter-Logik, benötigt keine Deck-Installation
Ein echter End-to-End-Test (Karte anlegen, Workflow konfigurieren, Hintergrundjob auslösen, Verschiebung + Mail prüfen) lässt sich nur gegen eine echte Nextcloud-34-Instanz mit installierter Deck-App durchführen, z. B. per:
php occ background-job:worker workflow_deck_automation
Release-Paket bauen
make appstore
Erzeugt build/artifacts/appstore/workflow_deck_automation.tar.gz.
CI (Gitea Actions)
| Workflow | Zweck |
|---|---|
lint-php.yml |
php -l über eine PHP-8.2–8.4-Matrix |
lint-info-xml.yml |
validiert appinfo/info.xml gegen das Appstore-XML-Schema |
phpunit.yml |
führt die PHPUnit-Tests aus (SQLite/rein logisch, kein DB-Service nötig) |
build-main.yml |
baut Frontend + Appstore-Archiv und veröffentlicht es als Release-Asset — bei Push auf main als rollendes Pre-Release latest-main, bei Push eines v*-Tags als reguläres Release |
Datenmodell
Workflows werden in der Tabelle wfda_workflows gespeichert (siehe lib/Migration/Version1000Date20260813120000.php): eine Zeile pro Workflow, mit user_id-Bezug, Board-/Stapel-IDs, JSON-kodierten Filterlisten sowie enabled/notify_email/last_run.
Lizenz
AGPL-3.0-or-later