Pipeline für Pull-Anforderungen
Die Pull-Request-Pipeline führt eine Reihe von Konformitätsprüfungen für einen Pull-Request für das angegebene Anwendungs-Repository durch.
Der Versuch, eine Pull-Anforderung in die Masterverzweigung einzufügen, kann aufgrund der fehlgeschlagenen Konformitätsprüfungen blockiert werden. Durch das Öffnen oder Aktualisieren einer Pull-Anforderung für den Masterverzweigung wird die Ausführung der Pipeline für Pull-Anforderungen ausgelöst. Sie können Ihre eigene Konfiguration für die Pipelines und Tests in benutzerdefinierten Skripten ausführen.
Stages und Tasks
In der folgenden Tabelle sind die Aufgaben aufgeführt, die in einer PR-Pipeline ausgeführt werden. Darüber hinaus enthält die Tabelle auch eine Übersicht über jede dieser Stufen:
-
Task oder Phase: Dies bezieht sich auf den Namen der Phase, der in der Konfigurationsdatei
.pipeline-config.yamldefiniert ist. -
Kurzbeschreibung: Enthält eine kurze Erläuterung der Aktionen, die während der Ausführung der Phase ausgeführt werden.
-
Anpassung zulässig: Gibt an, ob Benutzer die Flexibilität haben, das Standardverhalten der Stage durch Einfügen eines benutzerdefinierten Scripts in die Datei
.pipeline-config.yamlzu ändern oder zu ersetzen. -
Standard-Referenzimplementierung: Hier wird angegeben, ob die DevSecOps-Pipelines mit einer vordefinierten oder Standardimplementierung für die Stufe geliefert werden. Insbesondere für bestimmte Phasen wie
unit-testsodersetupbietet die DevSecOps-Pipeline keine fertige Implementierung. Stattdessen müssen Benutzer angepasste Scripts oder Code bereitstellen, die auf die Anforderungen ihrer Anwendung zugeschnitten sind. -
Angabensammlung: Gibt an, ob die Phase die Erfassung von Standardangaben durchführt. Wenn DevSecOps Pipeline eine Referenzimplementierung für eine Stufe bereitstellen, wird die Beweissammlung sofort durchgeführt. Wenn Benutzer diese vordefinierten Phasen jedoch ändern oder ersetzen möchten, müssen sie sicherstellen, dass ihre angepassten Implementierungen die entsprechende Angabensammlung enthalten. Die gleiche Verantwortung tragen die Benutzer in den Phasen, in denen die DevSecOps-Pipeline keine sofort einsatzbereite Implementierung bietet, so dass sie die Beweissammlung selbst durchführen müssen. Die Spalte gibt die Entität (Benutzer/Pipeline) an, die für die Angabensammlung verantwortlich ist.
-
Überspringen zulässig (gültig für Version > = v10): Gibt an, ob Benutzer die Ausführung dieser Phase ausschließen können, indem sie die Eigenschaft zum Überspringen in der
.pipeline-config.yamlauf 'true' setzen. Bei der Verwendung dieser Funktion ist jedoch Vorsicht geboten, insbesondere bei der Erfassung von Angaben in Stadien. Das Überspringen solcher Phasen kann zu fehlenden wichtigen Angaben für den Build führen.
| Aufgabe oder Phase | Kurzbeschreibung | Anpassung zulässig in .pipeline-config.yaml |
Standardreferenzimplementierung | Anforderung der Angabensammlung | Überspringen zulässig |
|---|---|---|---|---|---|
start |
Richten Sie die Pipeline-Umgebung ein. | Nein | Ja | NA | Nein |
setup |
Richten Sie Ihre Build-und Testumgebung ein. | Ja | Nein | NA | Nein |
detect-secrets |
Führen Sie den Scan zum Erkennen geheimer Schlüssel für den Anwendungscode aus. | Ja | Ja | NA | Nein |
unit-tests |
Komponententests und App-Tests für App-Code ausführen. | Ja | Nein | NA | Ja |
compliance-checks |
Führen Sie Code Risk Analyzer-Scans und andere Konformitätsprüfungen für App-Repositorys durch. | Ja | Ja | NA | Ja |
finish |
Konsolidieren Sie den Pipelinestatus. | Ja | Ja | NA | Ja |
Weitere Informationen dazu, wie Stages mithilfe der Datei .pipeline-config.yaml angepasst werden können, enthalten die Listen Angepasste Scripts und Pipelineparameter.
Scan 'Geheime Schlüssel erkennen'
Das Tool IBM Detect Secrets stellt fest, wo im Code der App geheime Schlüssel sichtbar sind. Weitere Informationen zum Einrichten Ihres Repositorys für den Scan finden Sie hier.
Scans und Prüfungen bei Compliance-Prüfungen
| Scannen oder prüfen | Beschreibung |
|---|---|
| Code Risk Analyzer-Scans auf Sicherheitslücken | Macht Sicherheitslücken für alle Abhängigkeiten des App-Pakets, für Container-Basisimages und für Betriebssystempakete ausfindig. Verwendet das Tool 'Code Risk Analyzer'. |
| CIS-Prüfung durch Code Risk Analyzer | Führt Konfigurationsprüfungen für Kubernetes-Bereitstellungsmanifeste aus Verwendet das Tool 'Code Risk Analyzer'. |
| Prüfung der Code Risk Analyzer-Stückliste (BOM, Bill of Material) | Die Stückliste (BOM, Bill of Material) für ein angegebenes Repository, in der der Herkunftsnachweis aller Abhängigkeiten erfasst ist. Diese Stückliste wird mit unterschiedlichen Granularitätsebenen erfasst. Die Stückliste erfasst beispielsweise die Liste der Basisimages, die im Build verwendet werden, die Liste der Pakete aus den Basisimages und die Liste von App-Paketen, die über das Basisimage installiert werden. Die Stückliste fungiert als Ground Truth für die Analyseergebnisse und kann potenziell zur Durchsetzung von Richtliniengates verwendet werden. Verwendet das Tool 'Code Risk Analyzer'. |
| Überprüfung der Repository-Konformität | Überprüft, ob die Einstellungen für den Verzweigungsschutz korrekt sind. |
Diese Scripts werden für alle App-Repositorys ausgeführt, von denen die Pipeline Kenntnis besitzt. Verwenden Sie zum Hinzufügen von Repositorys zu diesen Scans die Schnittstelle pipelinectl,
die in Ihrer Konfigurationsstage bereitgestellt wird.
Weitere Informationen zu der erwarteten Ausgabe aus Benutzerscriptstages finden Sie in Angepasste Scripts.
Taskjobs
| Taskjob | Beschreibung |
|---|---|
code-pr-start |
Klont Apps und DevSecOps-Repositorys und legt Anfangsstatus 'pending' (anstehend) für Statusprüfungen von Git Repos and Issue Tracking-Repositorys fest. |
code-setup |
Der Platzhalter für ein angepasstes Script für eine benutzerdefinierte Konfiguration, mit dem Benutzer die Pipelinekonfiguration abschließen können. |
code-detect-secrets |
Führt den Scan zum Erkennen geheimer Schlüssel aus, um festzustellen, wo geheime Schlüssel im App-Code sichtbar sind. |
code-unit-tests |
Der Platzhalter für ein angepasstes Script für benutzerdefinierte Tests, mit dem Benutzer ihre eigenen Tests ausführen können. |
code-pr-finish |
Führt alle erforderlichen Konformitätsprüfungen aus, kommentiert die Ergebnisse für die Pull-Anforderung und setzt ihr Ergebnis in die Git Repos and Issue Tracking-Repositorys. |
Verwendung von PR/MR-Änderungen für Pipeline-Konfigurationsrepositorium
Wenn die PR-Pipeline die Änderungen der Konfigurationsdateien/Skripte, die vom PR/MR kommen, berücksichtigen soll, sollten das Konfigurations-Repository und der Zweig leer sein, was wie folgt eingestellt werden kann:
- Die Umgebungsvariablen
one-pipeline-repo,one-pipeline-config-repoundpipeline-config-reposind leer oder nicht in den Umgebungsvariablen angegeben - Die Umgebungsvariablen
one-pipeline-config-branchundpipeline-config-branchsind leer oder nicht in den Umgebungsvariablen angegeben.
Pull-Anforderungen mit Problemen zusammenführen
Als Benutzer mit Administratorrechten können Sie Pull-Anforderungen mit fehlgeschlagenen Statusprüfungen im Repository zusammenzuführen. Diese Pull-Anforderungen registrieren jedoch ein Ergebnis des Typs failure (fehlgeschlagen)
in ihrem Nachweis für die fehlgeschlagene Task. Dieses Ergebnis ist in der Zusammenfassung der Nachweise und der Beschreibung des Änderungsantrags enthalten.
Ermöglichung der Beweiserhebung in der PR-Pipeline
Die PR-Pipeline unterstützt die Sammlung von Beweisen und das Problemmanagement. Standardmäßig sammelt die PR-Pipeline keine Beweise oder öffnet keine Probleme, aber die Benutzer können diese Funktion aktivieren. Um die Sammlung von Beweisen
und die Verwaltung von Problemen zu ermöglichen, setzen Sie die Umgebungsvariable collect-evidence-in-pr als eine der folgenden Aufzählungen:
none: (Standard) Setzen Siecollect-evidence-in-praufnone, um die Sammlung von Beweisen in der PR-Pipeline zu verhindern.all: Setzen Siecollect-evidence-in-praufall, um alle Nachweise unabhängig vom Status der PR-Pipeline zu sammeln. Ausgaben werden gemäß demcollect-evidence-Skript geöffnet, aktualisiert oder geschlossen.success: Setzen Siecollect-evidence-in-praufsuccess, um nur dann Nachweise zu sammeln, wenn die gesamte PR-Pipeline erfolgreich verlaufen ist. Wenn die PR-Pipeline fehlschlägt, werden keine Beweise gesammelt oder in der Asservatenkammer veröffentlicht und es findet kein Problemmanagement statt.
Hinweis: Da PR-Pipelines im Allgemeinen recht häufig ausgeführt werden, erspart die Wahl des richtigen Modus von collect-evidence-in-pr eine unnötige Sammlung von Beweisen. Es wird empfohlen, den Modus success während
der Entwicklungsphase oder in Fällen, in denen Ausfälle zu erwarten sind, zu wählen, um die Beweiserhebung zu verhindern, wenn die Pipeline ausfällt.
Wenn die PR-Pipeline eine Async-Pipeline auslöst, wird der Modus collect-evidence-in-pr, der auf success eingestellt ist, nicht unterstützt. Falls die PR-Pipeline eine asynchrone Pipeline auslöst, setzen Sie collect-evidence-in-pr auf all, um Beweise zu sammeln.
Hinweis: Wenn es sich bei dem Anwendungs-Repository um ein GitLab-Repository handelt und die MR (Merge Request) aus einem geforkten Repository stammt, muss der Benutzer einen Wert für die git-token Umgebungsvariable env angeben,
die Zugriff auf das Quell- und das Ziel-Repository hat, um den richtigen Status für die Merge Request festzulegen. Das bedeutet, dass der Git-Token einem Benutzer gehören müsste, der sowohl im Basis-Repository als auch im geforkten Repository
einen Beitrag leistet, und der Token über die Berechtigung verfügt, den Status bei einem Commit festzulegen.
Auftauchen von CVE in der PR
Wenn ein PR erstellt wird und die PR-Pipeline Sicherheitslücken findet, fügt die Pipeline die Informationen über die Sicherheitslücke, wie Schweregrad, Kennung der Sicherheitslücke, Paket mit Beschreibung und, falls vorhanden, die Korrektur als Kommentar hinzu. Auf diese Weise können die Benutzer schnell prüfen, welche Schwachstellen im PR behoben werden sollen, anstatt die Pipeline-Protokolle zu durchsuchen.
Ein Opt-in-Flag opt-in-pr-updates ermöglicht es, diese Funktion in der PR-Pipeline zu aktivieren oder zu deaktivieren. Diese Option ist standardmäßig aktiviert.
Einrichten einer PR-Pipeline zur Bearbeitung von Github Merge Queue PRs
Eine Merge Queue ist eine Github-Funktion, die dazu beiträgt, die Geschwindigkeit zu erhöhen, indem sie die Zusammenführung von Pull Requests in einen belegten Zweig automatisiert und sicherstellt, dass der Zweig nicht durch inkompatible Änderungen unterbrochen wird. Mehr zum Einrichten und Verwenden von Github Merge Queue hier.
Obwohl der Zweck von „Merge Queue“ darin besteht, die Geschwindigkeit zu erhöhen, ist zu beachten, dass für einen bestimmten Pull-Request ( Git ) die PR-Pipeline zweimal durchlaufen wird: Zunächst wird der „Standard“-PR ausgeführt. Sobald dies abgeschlossen ist, führen Sie den PR „Merge Queue“ aus.
Erstellen Sie einen neuen Git Auslöser
Erstellen Sie einen neuen Git Auslöser oder duplizieren Sie einen vorhandenen Auslöser. Behalten Sie alle Standardeinstellungen bei, setzen Sie nur die folgenden Eigenschaften außer Kraft:
Name: Sie bevorzugen einen Triggernamen, der den Kontext der Merge Queue widerspiegelt - z. B:PR - Merge QueueEventListener: auswählenpr-listener-merge-queueTrigger on: auswählenCEL filterCEL filter: eingebenbody.action == 'checks_requested'
Merge Queue-PRs verwenden ephemere Zweige - die dynamisch erstellt werden, wenn der ursprüngliche PR zur Merge Queue hinzugefügt wird - aus denen der Merge Queue-PR erstellt wird. Infolgedessen enthält die entsprechende Payload des Ereignisses „ Git “ (die die Pull-Request-Pipeline auslöst) keine Informationen über PR URL oder HTML URL.
Irrelevant im Kontext von Merge Queue, müssen die folgenden DevSecOps Funktionen durch Hinzufügen der entsprechenden Texteigenschaften deaktiviert werden:
skip-merge-pr-to-base: sollte auftruegesetzt werden (Standardwert false)opt-in-pr-updates: sollte auf0gesetzt werden (Standard 1)
Speichern Sie den Auslöser.
Testen des Auslösers für die Zusammenführungswarteschlange
- Erstellen Sie einen neuen Pull Request für den Hauptzweig des Quellcode-Repositorys der Anwendung.
- Beobachten Sie: die "Standard"-PR-Pipeline DevSecOps wird ausgelöst
- Klicken Sie auf der PR-Seite auf
Merge when readyund dann aufAttempt merge when ready- dadurch wird der PR unterenqueuein die Warteschlange für die Zusammenführung aufgenommen, sobald der "normale" PR abgeschlossen ist. - Warten Sie auf den erfolgreichen Abschluss des "Standard" DevSecOps PR
- Beachten Sie: Sobald die PR-Pipeline abgeschlossen ist, wird der PR zur Merge Queue hinzugefügt und der PR in der Merge Queue wird ausgelöst:
- Warten Sie auf die Fertigstellung der Warteschlangenzusammenführung PR
- Wenn erfolgreich, wird der PR mit einem Kommentar wie
Merged via the queue into main with commit abcdefg - Wenn der PR nicht erfolgreich ist (z.B.: fehlgeschlagene Konformitätsprüfung), wird er nicht automatisch zusammengeführt und aus der Zusammenführungs-Warteschlange entfernt.
PR-Nutzlast Übersicht
Nutzdaten
Ein Payload ist ein allgemeiner Begriff, der einen strukturierten Datenblock, in der Regel im JSON-Format, beschreibt, der als Teil eines Ereignisses oder einer Anfrage übertragen wird. Payloads werden häufig in Webhooks, APIs und Automatisierungssystemen verwendet, um relevante Informationen in einer maschinenlesbaren Form zu übermitteln.
Payloads können je nach Kontext eine breite Palette von Inhalten darstellen, z. B. Build-Metadaten, Benutzeraktivitäten, Issue-Updates oder, wie in diesem Fall, Details zu Pull Requests.
PR-Nutzlast
#cd-devsecops-pr-Nutzlast
Der PR-Payload ist eine spezifische Instanz eines Payloads, der Metadaten und Kontextinformationen über einen Pull Request (PR) kapselt. Sie wird generiert, wenn ein Pull-Request-Ereignis eintritt, und bietet einen strukturierten Zugriff auf Schlüsselattribute, die mit diesem PR zusammenhängen.
Diese Nutzlast umfasst eine breite Palette von Daten wie z. B:
- PR-Titel und Beschreibung
- Autor und Gutachter
- Quell- (Kopf) und Zielzweige (Basis)
- Commit-Historie und SHA-Referenzen
- Repositorydetails
- Zeitstempel, Etiketten, Status und mehr
Während die vollständige Nutzlast umfangreiche Informationen enthält, wird derzeit nur eine bestimmte Teilmenge der Felder extrahiert und als Umgebungsvariablen zur Verwendung in Pipelines, Skripten und Konfigurationsdateien bereitgestellt.
Aus der PR-Nutzlast extrahierte Umwelteigenschaften
Die folgenden Umgebungsvariablen werden derzeit von der PR-Payload abgeleitet und aktiv verwendet:
| Variablenname | Beschreibung |
|---|---|
head-branch |
Der Quellzweig des PR (Zweig, aus dem zusammengeführt wird) |
head-sha |
Die SHA der letzten Übergabe im Hauptzweig |
head-repo |
Das Repository, aus dem der PR stammt |
base-branch |
Der Zielzweig des PR (Zweig, in den zusammengeführt wird) |
base-repo |
Der vollständige Verweis auf das Basis-Repository |
base-repo-name |
Der Name des Basis-Repositorys |
base-repo-owner |
Der Eigentümer (Benutzer oder Organisation) des Basis-Repositorys |
commit-timestamp |
Der Zeitstempel der letzten Übertragung im PR |
pr-url |
Die API URL der Pull-Anfrage |
pr-html-url |
Das Web (HTML) URL der Pull-Anfrage |
pr-title |
Der Titel der Pull-Anfrage |
action |
status der PR |
base_ref |
zielzweig der PR |
Diese Werte werden als Umgebungsvariablen injiziert, um den Zugriff während der Ausführung in automatisierten Arbeitsabläufen zu vereinfachen.
Die PR-Nutzlast enthält viele zusätzliche Felder, die über die oben aufgeführten hinausgehen. Allerdings wird derzeit nur die extrahierte Teilmenge für operative Zwecke genutzt. Bei Bedarf kann der Zugriff auf die gesamte Nutzlast für fortgeschrittene Anwendungsfälle oder zukünftige Erweiterungen bereitgestellt werden.