D365 Audit in Ihrer Deployment Pipeline
Integrieren Sie die Analysetools von D365 Audit direkt in Ihre Pipeline. Lassen Sie sich über neue Befunde informieren oder Ihre Pipeline abbrechen, wenn kritische Befunde auftauchen, etwa wenn Zugangsdaten unverschlüsselt übertragen würden, und erhalten Sie wertvolle Einblicke in die Veränderungen von Version zu Version.
Pakete
Kostenlos testen
Überzeugen Sie sich selbst. Integrieren Sie unsere API in Ihre eigene Pipeline. Der Testschlüssel gilt für zwei Prüfungen und deaktiviert sich danach selbst.
Ihren API-Key erhalten Sie per Mail an die unten eingetragene Adresse. Pro Firmendomain und Lösungspublisher ist es möglich, unsere Schnittstelle einmalig ohne Kosten zu testen.
So funktioniert es
- Ihre Deployment Pipeline exportiert die Lösung wie bisher (Power Platform Build Tools oder pac solution export).
- Ein Befehl schickt das .zip zusammen mit Ihrem API-Schlüssel an die D365-Audit-API.
- Die Befunde erscheinen im Build-Log, auf Wunsch auch als Testergebnisse (JUnit) oder Code-Scanning-Hinweise (SARIF).
Sicherheit für IT-Admins
- Kein nachgeladener Code. Die Pipeline ruft curl auf, das zum Agent gehört, und schickt eine HTTPS-Anfrage mit der .zip. Nichts von d365audit.de wird auf Ihrem Agent ausgeführt, die Antwort ist reiner Text fürs Log.
- Aus der Pipeline geht nur der Lösungsexport raus, nie ein Zugriff auf Ihre Umgebung. Was gespeichert wird: Die hochgeladene Datei wird direkt nach der Analyse gelöscht, die Befundliste (Excel) bleibt 7 Tage abrufbar. Für die Bindung an Ihren Publisher (bei Enterprise an zwei) bleibt je Publisher nur ein Fingerabdruck seines Namens (SHA-256 mit dem Salz Ihres Kontos), bis 30 Tage nach Ende des Abos. Für den Vergleich mit dem letzten Lauf bleibt je Befund nur ein Fingerabdruck (SHA-256 über ein zufälliges Salz Ihres Kontos, Regel, Tabelle und Komponentenname), keine Namen und keine Inhalte. Die Fingerabdrücke bleiben 400 Tage gespeichert, die des jeweils letzten Laufs je Projekt als Vergleichsbasis für den nächsten Lauf bis 30 Tage nach Ende des Abos.
- Der Schlüssel liegt bei uns nur als Hash. Erneuern jederzeit: Link per Mail oder POST /api/v1/keys/rotate; der alte Schlüssel ist sofort ungültig.
- Link im Log. Wer das Build-Log lesen kann, kann die Befundliste (Excel) über den Link 7 Tage lang abrufen. JUnit, SARIF und Summary brauchen den API-Schlüssel.
- Werte aus der Lösung schleusen keine Log-Befehle ein: Namen und Hinweise kommen ohne Zeilenumbrüche, „##“ und „::“.
- Proxy: curl nutzt HTTPS_PROXY (und NO_PROXY) der Maschine oder --proxy in der Zeile. Freigeben: www.d365audit.de, Port 443.
Sie sind bereits Kunde oder haben Ihren Schlüssel verloren?
Ihr Abo können Sie hier im Stripe-Kundenportal verwalten (Anmeldung mit der E-Mail-Adresse Ihres Abos). Dort haben Sie Einblick in Ihre Rechnungen und Zahlungsmittel und können kündigen.
Sollten Sie einen neuen API-Schlüssel benötigen, können Sie ihn hier mit der E-Mail-Adresse Ihres Abos anfordern; der bisherige wird dabei ungültig.
Integration mit Azure DevOps
Für eine bestehende Pipeline, die die Lösung schon exportiert (Power Platform Build Tools oder pac CLI). Ein HTTPS-Aufruf mit curl, das auf jedem Agent schon da ist: ohne Erweiterung, ohne Skript, ohne nachgeladenen Code. Sie brauchen den API-Schlüssel aus dem Abo (Pakete oben).
- Schlüssel als geheime Variable anlegen.
Pipeline bearbeiten → Variablen → Neue Variable, Name
D365AUDIT_API_KEY, „Diesen Wert geheim halten“ anhaken. - Schritt direkt hinter den Export setzen.
- script: | curl --fail-with-body -sS -H "Authorization: Bearer $(D365AUDIT_API_KEY)" -F "file=@$(Build.ArtifactStagingDirectory)/MeineLoesung.zip" "https://www.d365audit.de/api/v1/scan?ci=azure" displayName: D365 Audit
- Pfad der .zip eintragen.
Statt
$(Build.ArtifactStagingDirectory)/MeineLoesung.zipdenselben Pfad wie bei SolutionOutputFile Ihres Export-Schritts (PowerPlatformExportSolution@2), zum Beispiel$(Build.ArtifactStagingDirectory)/$(SolutionName).zip.
Was dann passiert
- Der Schritt wartet auf die Analyse (meist wenige Sekunden) und schreibt das Ergebnis ins Build-Log: Zusammenfassung, Befunde und der Link zur Befundliste als Excel.
- Erster Lauf: Die Befunde werden zur Ausgangsbasis. Der Build warnt nur (teilweise erfolgreich), er bricht nicht.
- Danach bricht der Build nur bei NEUEN Befunden der Stufe hoch oder kritisch: Der Server antwortet mit HTTP 422, curl endet mit Exit-Code 22, der Schritt wird rot, die Befunde stehen im Log.
- Läuft auf windows-latest (cmd.exe), ubuntu-latest und macos-latest (bash) und auf self-hosted Agents mit curl ab 7.76.
Optional: Befunde im Reiter „Tests“
Der Schritt D365 Audit setzt die Variable D365AUDIT_JUNIT_URL. Zwei weitere Schritte holen damit das JUnit-XML und veröffentlichen es:
Anpassen: Schwelle, Liste, Projektname
Als Parameter in der Adresse, zum Beispiel /api/v1/scan?ci=azure&threshold=medium&mode=delta
threshold | critical, high (Standard), medium, low, none (nur berichten) |
mode | Welche Befunde im Log stehen, das Gate bleibt gleich: critical (Standard) = neue Befunde ab der Schwelle, also was den Build bricht; delta = neue und behobene Befunde seit dem letzten Lauf, alle Stufen; all = der gesamte Befund der aktuellen Version. |
project | Name für den Vergleich mit dem letzten Lauf (Standard: Lösungsname) |
first_run | fail = auch der erste Lauf bricht (Standard warn) |
only_new | 0 = alle Befunde zählen fürs Gate, nicht nur neue |
lang | en = englische Reports und Meldungen |
Strenger: der Schlüssel nur als Umgebungsvariable
Azure DevOps setzt $(D365AUDIT_API_KEY) vor dem Start ins Skript ein und maskiert den Wert im Log, das ist dokumentiert und funktioniert. Microsoft empfiehlt, geheime Variablen stattdessen als Umgebungsvariable zu übergeben. Dann steht der Schlüssel nicht in der temporären Skriptdatei. Die Schreibweise unterscheidet sich zwischen cmd.exe und bash, deshalb je eine Zeile:
In beiden Varianten gibt die Shell den Schlüssel als Argument an curl weiter, solange der Schritt läuft. Auf Microsoft-gehosteten Agents bekommt jeder Job eine frische Maschine; auf geteilten self-hosted Agents können andere Prozesse derselben Maschine Befehlszeilen sehen.
Integration mit GitHub Actions
Den Schlüssel als Repository-Secret D365AUDIT_API_KEY hinterlegen und den Schritt hinter den Export setzen. Mit shell: bash läuft dieselbe Zeile auch auf Windows-Runnern.
Befunde erscheinen als Anmerkungen (::error:: und ::warning::); GitHub zeigt je Schritt die ersten 10 jeder Art, der Rest steht im Log.
Integration mit anderen CI-Systemen
Jedes System, das curl ausführen kann (GitLab CI, Jenkins, Bitbucket, TeamCity …). Ohne ci= enthält die Antwort keine Log-Befehle. Exit-Code 0 = Gate bestanden, 22 = Gate verletzt oder Fehler (der Text sagt, was).
API-Dokumentation
Authorization: Bearer d365a_…
POST /api/v1/scan | .zip im Feld file, Analyse im selben Aufruf, Text fürs Build-Log. Parameter ci (azure, github, plain), threshold, mode, project, first_run, only_new, lang. 200 = Gate bestanden, 422 = Gate verletzt. |
POST /api/v1/analyses | .zip hochladen (Feld file, optional project, lang). Antwort 202 mit id, danach abfragen. |
GET /api/v1/analyses/<id> | Stand und Ergebnis als JSON. Parameter threshold, only_new, first_run und mode (delta, critical, all; ohne mode die ganze Liste). |
GET /api/v1/analyses/<id>/junit | JUnit-XML |
GET /api/v1/analyses/<id>/sarif | SARIF 2.1.0 |
GET /api/v1/analyses/<id>/summary | Markdown |
GET /api/v1/account | Paket, Status, Kontingent |
POST /api/v1/keys/rotate | Neuer Schlüssel, der alte wird ungültig |
Fehlerbehandlung
| „Kein API-Schlüssel angekommen“ (HTTP 401) | Die geheime Variable D365AUDIT_API_KEY fehlt oder der Name ist anders geschrieben. |
| HTTP 401 | Schlüssel unbekannt oder ersetzt: neuen Schlüssel anfordern |
| HTTP 402 | Abo nicht aktiv (Zahlung fehlgeschlagen oder gekündigt): Bitte überprüfen Sie Ihr Abo hier: Abo verwalten. |
| HTTP 429 | Überprüfungen des Monats aufgebraucht, ab dem 1. des Folgemonats (UTC) wieder verfügbar. Oder zu viele Uploads in 10 Minuten, die Meldung nennt die Wartezeit. Oder es läuft noch eine Überprüfung desselben Abos (scan_running); nach deren Ende erneut senden. Uploads, die wegen eines fremden Publishers oder ohne .zip abgelehnt werden, zählen nicht aufs Kontingent. |
| HTTP 422 | Kein Fehler: Das Quality Gate ist verletzt, die Befunde stehen im Log. |
| HTTP 400 | Keine .zip im Feld file, kein Lösungsexport oder ein Parameter falsch geschrieben; die Meldung sagt, was. |
| curl: (26) … read | Die .zip liegt nicht unter dem Pfad: Der Schritt steht vor dem Export, oder der Pfad in der curl-Zeile weicht von SolutionOutputFile ab. |
| curl: option --fail-with-body: is unknown | curl älter als 7.76 (manche ältere self-hosted Agents). curl --version zeigt die Version; curl aktualisieren. |
| curl: (6) oder (7), Name oder Verbindung | Self-hosted Agent hinter Proxy oder Firewall: www.d365audit.de auf Port 443 freigeben. curl nutzt HTTPS_PROXY der Maschine; oder --proxy http://proxy:8080 in die Zeile schreiben. |
| Proxy mit Anmeldung (HTTP 407) | --proxy-user "benutzer:passwort" in die Zeile, das Passwort am besten als geheime Variable, für den Proxy des Agents etwa --proxy "$(Agent.ProxyUrl)" --proxy-user "$(Agent.ProxyUsername):$(Agent.ProxyPassword)". |
| HTTP 504 | Die Analyse hat länger als 90 Sekunden gedauert. Sie läuft weiter, die Meldung nennt die Adresse des Ergebnisses. |