Erfahren Sie, wie das Testen der Code-Qualität von Pipelines funktioniert und wie damit die Qualität Ihrer Bereitstellungen verbessert werden kann.
Beim Code-Qualitätstest wird Ihr Anwendungscode anhand eines Satzes von Qualitätsregeln bewertet. Dies ist der Hauptzweck einer reinen Codequalitäts-Pipeline und wird unmittelbar nach dem Build-Schritt in allen Produktions- und Nicht-Produktions-Pipelines ausgeführt.
Siehe Dokument . Konfigurieren der CI/CD-Pipeline , um mehr über verschiedene Pipelinetypen zu erfahren.
Beim Testen der Code-Qualität wird der Quell-Code gescannt, um sicherzustellen, dass er bestimmte Qualitätskriterien erfüllt. Dies wird durch eine Kombination aus SonarQube und der Prüfung auf Inhaltspaketebene mit OakPAL implementiert. Es gibt über 100 Regeln, die generische Java-Regeln und AEM-spezifische Regeln kombinieren. Einige der AEM-spezifischen Regeln werden auf der Grundlage der Best Practices von AEM Engineering erstellt und werden als benutzerspezifische Code-Qualitätsregeln.
Sie können die vollständige Liste der Regeln herunterladen mit diesem Link.
Probleme, die durch Code-Qualitätstests identifiziert werden, werden einer von drei Kategorien zugewiesen.
Kritisch: Hierbei handelt es sich um vom Test identifizierte Probleme, die zu einem sofortigen Pipeline-Fehler führen.
Wichtig: Hierbei handelt es sich um Probleme, durch die die Pipeline angehalten wird. Implementierungs-Manager, Projekt-Manager oder Geschäftsinhaber können die Probleme außer Kraft setzen. In diesem Fall wird die Pipeline fortgesetzt. Sie können die Probleme aber auch akzeptieren. In diesem Fall stoppt die Pipeline mit einem Fehler.
Info - Hierbei handelt es sich um Probleme, die ausschließlich zu Informationszwecken bereitgestellt werden und keine Auswirkungen auf die Pipelineausführung haben
Die Ergebnisse dieses Schritts werden als Bewertung bereitgestellt.
Die folgende Tabelle fasst die Bewertungen und Fehlerschwellen für die einzelnen kritischen, wichtigen und Informationskategorien zusammen.
Name | Definition | Kategorie | Fehlerschwellenwert |
---|---|---|---|
Sicherheitsbewertung | A = Keine Schwachstellen B = mindestens 1 kleinere Schwachstelle C = mindestens 1 größere Schwachstelle D = mindestens 1 kritische Schwachstelle E = mindestens 1 Schwachstelle der Kategorie „Blocker“ |
Kritisch | < B |
Zuverlässigkeitsbewertung | A = Keine Fehler B = mindestens 1 kleinerer Fehler C = mindestens 1 größerer Fehler D = mindestens 1 kritischer Fehler E = mindestens 1 Fehler der Kategorie „Blocker“ |
Kritisch | < D |
Wartbarkeitsbewertung | Definiert durch die ausstehenden Kosten für die Behebung von Code-Fehlern als Prozentsatz der Zeit, die bereits in das Programm investiert wurde
|
Wichtig | < A |
Abdeckung | Definiert durch eine Mischung aus Zeilenabdeckung der Einheitstests und Bedingungsabdeckung nach der Formel: Coverage = (CT + CF + LC)/(2*B + EL)
|
Wichtig | < 50 % |
Übersprungene Einheitentests | Anzahl der übersprungenen Einheitentests | Info | > 1 |
Offene Probleme | Allgemeine Problemtypen – Schwachstellen (Vulnerability), Fehler (Bug) und Code-Smells (Code Smell) | Info | > 0 |
Duplizierte Zeilen | Definiert als die Anzahl der Zeilen, die in doppelten Blöcken enthalten sind. Ein Code-Block gilt unter den folgenden Bedingungen als dupliziert. Nicht-Java-Projekte:
|
Info | > 1 % |
Kompatibilität mit Cloud Service | Anzahl der festgestellten Kompatibilitätsprobleme mit Cloud Service | Info | > 0 |
Siehe Metrikdefinitionen von SonarQube für detailliertere Definitionen.
Weitere Informationen zu den benutzerdefinierten Regeln zur Code-Qualität, die von Cloud Manager ausgeführt werden, finden Sie unter Benutzerspezifische Regeln für Code-Qualität.
Das Verfahren zur Qualitätsprüfung ist nicht perfekt. Mitunter werden fälschlicherweise Probleme identifiziert, die eigentlich nicht problematisch sind. Dies wird als falsch positiv bezeichnet.
In diesen Fällen kann der Quell-Code mit der standardmäßigen @SuppressWarnings
-Java-Anmerkung kommentiert werden. Dabei wird die Regel-ID als Anmerkungsattribut angegeben. Ein häufiges Problem besteht etwa darin, dass die SonarQube-Regel zur Erkennung hartcodierter Kennwörter in Bezug auf die Identifizierung eines hartcodierten Kennworts „aggressiv“ sein kann.
Der folgende Code ist in einem AEM-Projekt, das eine Verbindung zu einem externen Service herstellen soll, relativ häufig.
@Property(label = "Service Password")
private static final String PROP_SERVICE_PASSWORD = "password";
SonarQube weist dann auf eine Schwachstelle der Kategorie „Blocker“ hin. Nach Prüfung des Codes erkennen Sie, dass es sich nicht um eine Schwachstelle handelt, und kommentieren dies mit der entsprechenden Regel-ID.
@SuppressWarnings("squid:S2068")
@Property(label = "Service Password")
private static final String PROP_SERVICE_PASSWORD = "password";
Wenn der Code allerdings tatsächlich so lautete:
@Property(label = "Service Password", value = "mysecretpassword")
private static final String PROP_SERVICE_PASSWORD = "password";
Dann bestünde die richtige Lösung darin, das hartcodierte Kennwort zu entfernen.
Obwohl sich möglichst spezifische @SuppressWarnings
-Anmerkungen bewährt haben, also nur eine bestimmte Anweisung oder den Block zu kommentieren, der das Problem verursacht, können Anmerkungen auf Klassenebene hinzugefügt werden.
Es gibt zwar keinen expliziten Sicherheitstestschritt, doch gibt es sicherheitsrelevante Code-Qualitätsregeln, die während des Codequalitätsschritts bewertet werden. Siehe Dokument . Sicherheitsübersicht für AEM as a Cloud Service um mehr über die Sicherheit in Cloud Service zu erfahren.
Im Rahmen des Qualitätsanalyseprozesses führt Cloud Manager eine Analyse der vom Maven-Build erzeugten Inhaltspakete durch. Cloud Manager bietet Optimierungen zur Beschleunigung dieses Prozesses an, die wirksam sind, wenn bestimmte Verpackungseinschränkungen beachtet werden. Am wichtigsten ist die Optimierung, die für Projekte durchgeführt wird, die ein einzelnes Inhaltspaket ausgeben, das im Allgemeinen als „all“-Paket bezeichnet wird und eine Reihe andere Inhaltspakete enthält, die durch den Build erzeugt und als übersprungen markiert wurden. Wenn Cloud Manager dieses Szenario erkennt, wird nicht das gesamte Paket entpackt, sondern die einzelnen Inhaltspakete werden direkt gescannt und auf der Grundlage von Abhängigkeiten sortiert. Betrachten Sie zum Beispiel die folgende Build-Ausgabe.
all/myco-all-1.0.0-SNAPSHOT.zip
(Inhaltspaket)ui.apps/myco-ui.apps-1.0.0-SNAPSHOT.zip
(übersprungenes Inhaltspaket)ui.content/myco-ui.content-1.0.0-SNAPSHOT.zip
(übersprungenes Inhaltspaket)Wenn die beiden übersprungenen Inhaltspakete die einzigen Elemente innerhalb von myco-all-1.0.0-SNAPSHOT.zip
sind, werden die beiden eingebetteten Pakete anstelle des gesamten Inhaltspakets (all) gescannt.
Bei Projekten, die Dutzende von eingebetteten Paketen produzieren, kann diese Optimierung nachweislich bis zu 10 Minuten pro Pipeline-Ausführung einsparen.
Ein Sonderfall kann eintreten, wenn das Inhaltspaket „all“ eine Kombination aus übersprungenen Inhaltspaketen und OSGi-Bundles enthält. Wenn myco-all-1.0.0-SNAPSHOT.zip
beispielsweise die beiden zuvor erwähnten eingebetteten Pakete sowie ein oder mehrere OSGi-Bundles enthält, wird ein neues, minimales Inhaltspaket nur mit den OSGi-Bundles erstellt. Dieses Paket hat immer die Bezeichnung cloudmanager-synthetic-jar-package
und die darin enthaltenen Bundles werden in /apps/cloudmanager-synthetic-installer/install
abgelegt.