arc42 · vereinfacht · Version 1.0

tina-snow-cli

Spring-Shell-CLI für Anhänge an ServiceNow-KB-Artikeln

Konzeptionelle Kurzfassung der Architektur: Upload, Auflisten und Bereinigung von Anhängen. Grundlage sind der Quellcode (Version 1.0.1), die Konfiguration und die Diagramme dieser Sichten.

Stand 2026-10-13 · Quelle: src/main/java, src/main/resources, conf/, pom.xml

Ist-Stand Quellcode-verifiziert

Sichten im Überblick

SichtDiagrammtypInhaltSeite
KontextarchitectureOperator, CLI, ServiceNow, Token-Endpunkt; Kapitel „Fachlich“ und „Technisch“arc42-kontext
BausteinearchitectureBefehle, Fachkern, Darstellung; Architekturregeln; Sicht „schreibt“arc42-bausteine
VerteilungdeploymentStages DEV, QS, PROD; Vertrauensgrenze QSarc42-verteilung
Laufzeit uploadsequenceCSV zu ZIP, Token, sys_id, Uploadarc42-laufzeit-upload
Laufzeit cleanupsequenceFilter, Sortierung, Schleife über zu löschende Anhängearc42-laufzeit-cleanup
Überblick-Blattanalog (Whiteboard)Ein Blatt: Kontext, Bausteine, offene Punkteanalog-arc42-board

1 Einführung und Ziele

tina-snow-cli ist ein Kommandozeilenwerkzeug auf Basis von Spring Shell. Es hängt Berichte an KB-Artikel in ServiceNow, listet Anhänge auf und bereinigt veraltete Anhänge.

Upload

Bericht per Befehl als Anhang an einen KB-Artikel hängen.

Bereinigung

Anhänge nach Präfix filtern und nur die neuesten n behalten.

Lesbare Ausgabe

Ergebnisse als Tabelle im Terminal, wählbar im Anzug (Theme).

StakeholderInteresse
Operator (Redaktion KB, CI-Job)Befehle zuverlässig ausführen, eindeutige Exit-Codes
EntwicklungWartbarer Code, aktuelle Dokumentation
ServiceNow-BetriebNur definierte REST-Aufrufe, passende Berechtigungen
SecurityGeschützte Zugangsdaten, kontrollierte Löschungen

2 Randbedingungen

BereichVorgabe
TechnikJava 21, Spring Boot 4.1.0 (Parent), Spring Shell 4.0.3, Maven
SchnittstelleServiceNow REST: Table-API kb_knowledge, Attachment-API
ZugangOAuth 2.0 Client Credentials; Zugangsdaten nur über Umgebungsvariablen
StagesDEV, QS, PROD; Basis-URL und Token-Endpunkt je Konfigurationsdatei
BetriebStandard nicht interaktiv (CI/CD); interaktiver Modus über conf/active-config.yaml
QualitätswerkzeugeSpotless (Eclipse-Formatter), JaCoCo, CycloneDX-SBOM

3 Kontextabgrenzung

Die CLI spricht mit vier Partnern: dem Operator, ServiceNow, dem Token-Endpunkt und dem lokalen Dateisystem.

Kontextsicht: Der Operator bedient tina-snow-cli, das ServiceNow und den Token-Endpunkt anspricht und lokale Dateien liest
Abb. 1 · Kontextsicht · interaktiv öffnen
NachbarKanalAusgetauscht
OperatorBefehlszeileBefehle, Ausgabe, Exit-Code
ServiceNow ITSMHTTPS, JSONArtikel-sys_id, Anhangsliste, Upload, Löschung
Token-EndpunktHTTPS, form-urlencodedaccess_token (je Stage verschieden)
DateisystemlokalQuelldatei, erzeugtes ZIP

4 Lösungsstrategie

5 Bausteinsicht

Bausteinsicht: Befehle, Fachkern und Darstellung in der CLI, ServiceNow und Token-Endpunkt extern
Abb. 2 · Bausteinsicht · interaktiv öffnen · Sicht „schreibt“ zeigt, welche Bausteine ServiceNow verändern
BausteinVerantwortungPakete
CLI-Befehleupload, read, cleanup, themesnow.attachment, cli
FachkernToken, Artikelauflösung, Anhänge, REST-Basis, CSV-Kompressionsnow, snow.auth, snow.kb, snow.attachment
DarstellungErgebnis-Rendering, Anzüge, Glyphen, Tabellen, Promptrender, chrome
KonfigurationServiceNowProperties, ApiQueryProperties, UiProperties, application.yamlsnow, chrome, resources

Regeln im Diagramm: Die Darstellung spricht nie direkt mit ServiceNow; Aufrufe laufen nur von oben nach unten (CLI, Fachkern, extern). Beide Regeln sind eingehalten.

Hinweis: Die README beschreibt eine ältere Paketstruktur (config/, service/, UpdateCommand). Maßgeblich ist der Ist-Stand oben.

6 Laufzeitsicht

6.1 Befehl upload

Sequenz upload: Operator, CLI, Token-Endpunkt und ServiceNow
Abb. 3 · Laufzeit upload · interaktiv öffnen
  1. CSV-Datei wird zu ZIP gepackt. Die ZIP-Datei liegt neben der Quelle.
  2. Access-Token holen (aus dem Cache oder neu).
  3. KB-Nummer in sys_id auflösen. Kein Treffer: Exit-Code 3.
  4. Datei per Multipart an /api/now/attachment/upload senden.
  5. Ergebnis ausgeben: Artikelnummer und Dateiname.

6.2 Befehl cleanup

Sequenz cleanup: Filter nach Präfix, Sortierung und Löschschleife über die Anhänge ab Platz n+1
Abb. 4 · Laufzeit cleanup · interaktiv öffnen
  1. Token und sys_id wie beim Upload.
  2. Anhangsliste des Artikels laden.
  3. Nach Präfix filtern (Standard Test) und nach sys_created_on absteigend sortieren.
  4. Alle Treffer ab Platz n+1 einzeln löschen (Standard n = 3).
  5. Ergebnis ausgeben: gelöscht und behalten.

6.3 Befehl read

read -a <Nummer> zählt die Anhänge. Mit -A erscheint die Tabelle, mit --raw die vollen sys_ids, Bytes und ISO-Zeitstempel.

7 Verteilungssicht

Verteilung: tina-snow-cli auf dem Operator-Rechner, drei ServiceNow-Stages und Entra ID für QS
Abb. 5 · Verteilungssicht · interaktiv öffnen
StageBasis-URLToken-EndpunktKonfiguration
DEVhttps://itsm.dev.gematik.solutionsServiceNow oauth_token.doconf/dev/active-config.yaml
QShttps://itsm.qs.gematik.solutions/Microsoft Entra ID (v2.0), eigener Scopeconf/qs/active-config.yaml
PRODhttps://itsm.gematik.de/ServiceNow oauth_token.doconf/prod/active-config.yaml

Die Datei conf/active-config.yaml wird beim Start importiert. Sie zeigt aktuell auf QS (siehe R4).

8 Querschnittliche Konzepte

ThemaUmsetzung
SicherheitClient Credentials; Secrets über Umgebungsvariablen; Bearer-Token im Header
Token-Lebensdauerexpires_in aus der Antwort; ohne Angabe 30 min; Erneuerung 30 s vor Ablauf
FehlerklassenBadInput, NotFound, AuthFailed, Transport (sealed SnowCliException)
Exit-Codes1 unerwartet · 2 Eingabe · 3 nicht gefunden · 4 Authentifizierung · 5 Transport
FehlerausgabeMeldung auf stderr mit Präfix „Fehler:“
DarstellungAnzüge transit (Standard), atlas, wire; gewählter Anzug wird gespeichert
DateienContent-Type aus der Dateiendung; CSV zu ZIP über CsvCompressor
LoggingSpring-Boot-Logging; Stufen je Paket in der Konfiguration

9 Entscheidungen

NrEntscheidungBegründungFolge
E1Spring Shell als FrameworkBefehle als Annotationen; interaktiver und nicht interaktiver Modus aus einer AnwendungBindung an Spring Shell 4
E2OAuth 2.0 Client CredentialsKein Benutzerlogin, geeignet für CI/CDZugangsdaten müssen geschützt verwaltet werden
E3Konfigurierbare Abfragen (api-query)Stages mit abweichenden Feldern ohne CodeänderungFehlkonfiguration wirkt direkt (R4)
E4CSV immer zu ZIPReduziert das Transfervolumen (laut Klassen-Javadoc)Weicht von der README-Regel „ab 5 MB“ ab (R9)
E5Token-Cache im ProzessWeniger Token-Anfragen je LaufKein Cache über Prozessgrenzen hinweg

10 Qualitätsanforderungen

QualitätSzenarioStand im Code
SicherheitZugangsdaten landen nicht im RepositoryNur Umgebungsplatzhalter in application.yaml und conf/*.yaml
AutomatisierbarkeitEin CI-Job wertet den Exit-Code ausExit-Codes je Fehlerklasse; Test SnowExitStatusTest
NachvollziehbarkeitDie Fehlerursache ist aus der Meldung erkennbarMeldung „Fehler: …“ mit Ursache
WartbarkeitEin neuer Befehl braucht keinen Umbau des FachkernsBefehle nutzen gemeinsame Services (AuthService, KbClient, AttachmentClient)
PrüfbarkeitBuild mit Tests und CoverageJaCoCo-Report, Surefire-Reports vorhanden

11 Risiken und technische Schulden

NrBefundWirkungMaßnahmeStatus
R1cleanup verlangt keine Bestätigung; -p ist optional mit Standard „Test“Anhänge können ohne Freigabe gelöscht werdenPräfix Pflicht machen; Bestätigung oder Dry-Run ergänzenOffen
R2CSV wird immer zu ZIP; die ZIP liegt neben der Quelle und wird ohne Nachfrage überschriebenDatenverlust bei gleichnamiger ZIPZielordner oder Temp-Verzeichnis; Überschreiben verhindernOffen
R3Eine Nicht-KB-Eingabe läuft über den Attachment-Lookup und liefert die sys_id eines AnhangsFalsche Artikel-Zuordnung denkbarPfad fachlich klären; Test ergänzenZu prüfen
R4conf/active-config.yaml setzt article auf sys_id=, der KbClient erwartet KB-Nummern; Skriptnamen lauten _dev, die aktive Konfiguration zeigt auf QSFalsche Stage oder NotFoundStage-Konfiguration vereinheitlichen; aktive Stage dokumentierenZu prüfen
R5Theme-Name tina in application.yaml existiert nichtFällt stillschweigend auf transit zurückNamen auf transit setzenOffen
R6Secret-Variablen sind je Stage unterschiedlich benannt (_QS nur für QS)Verwechslung, fehlende ZugangsdatenEinheitliche Namen je StageOffen
R7Root- und Fachlogging auf DEBUG in conf/active-config.yamlMehr Log-Inhalt; Inhalte nicht geprüftStufe im Profil auf INFO; Logausgaben auf Zugangsdaten prüfenZu prüfen
R8Keine Wiederholung bei TransportfehlernEin Netzfehler bricht den Lauf abRetry mit Backoff für GET-AufrufeOffen
R9README veraltet (UpdateCommand, Theme-Namen, 5-MB-Regel, Paketstruktur)FehlinformationREADME an den Ist-Stand angleichenOffen

12 Glossar

BegriffBedeutung
KB-ArtikelWissensartikel in ServiceNow (Tabelle kb_knowledge)
sys_idEindeutige ID eines Datensatzes in ServiceNow
AnhangDatei an einem Datensatz (sys_attachment)
StageUmgebung: DEV, QS oder PROD
Client CredentialsOAuth-Ablauf ohne Benutzer, mit Client-ID und Client-Secret
RetainAnzahl der neuesten Anhänge, die cleanup behält
AnzugFarbschema und Layout der Terminal-Ausgabe (Theme)
ChromeDarstellungsschicht der CLI: Farben, Layout, Tabellen, Prompt
Blatt (analog)Handgezeichnete Skizze im Publisher-Baustein-Stil (Überblick-Blatt)