\newcommand{\VerbBar}{|} \newcommand{\VERB}{\Verb[commandchars=\\\{\}]} \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} % Add ',fontsize=\small' for more characters per line \newenvironment{Shaded}{}{} \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{#1}}} \newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}} \newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{#1}} \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}} \newcommand{\BuiltInTok}[1]{#1} \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}} \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{#1}}} \newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}} \newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{#1}} \newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{#1}}} \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{#1}} \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}} \newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{#1}}} \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{#1}}} \newcommand{\ExtensionTok}[1]{#1} \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}} \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{#1}} \newcommand{\ImportTok}[1]{#1} \newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}} \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{#1}}} \newcommand{\NormalTok}[1]{#1} \newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}} \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{#1}} \newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{#1}} \newcommand{\RegionMarkerTok}[1]{#1} \newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}} \newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{#1}} \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}} \newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{#1}} \newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}} \newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}} \setlength{\emergencystretch}{3em} % prevent overfull lines \providecommand{\tightlist}{% \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} \setcounter{secnumdepth}{-\maxdimen} % remove section numbering \hypertarget{cicd-dokumentation}{% \section{CI/CD Dokumentation}\label{cicd-dokumentation}} Dies ist die Dokumentation für die CI/CD Pipeline von dem \hypertarget{was-wird-automatisiert}{% \subsection{Was wird Automatisiert ?}\label{was-wird-automatisiert}} Durch das CI/CD System werden Folgende Prozesse Automatisiert durchgeführt : \begin{itemize} \tightlist \item \textbf{Build}: Build Prozess der Software \begin{itemize} \tightlist \item Automatische Generierung von API-Server Boilercode \item Kompilierung und Verpacken der Software in eine **.jar* \end{itemize} \item \textbf{Test}: Automatisierte Tests \begin{itemize} \tightlist \item Modul-Test mit angebundenen externen Test Datenbank \item Code-Coverage Report \end{itemize} \item \textbf{Analyse}: Analyse von Sourcecode und Test Reports \begin{itemize} \tightlist \item Statische Code Analyse durch SonarQube mit Qualitätsprofil \textbf{Sonar-Way} \item Analyse des Code-Coverage Reports \item Analyse des Modul-Test Ergebnisses \end{itemize} \item \textbf{Package}: Cloudgerechte Verpackung des Software \begin{itemize} \tightlist \item Containerisierung in einem Container-Image für die Cloudnutzung \item Linting des Helm-Charts für Kubernetes \end{itemize} \item \textbf{Deploy}: Deployment der Software \begin{itemize} \tightlist \item Deployment auf einem Kubernetes Cluster durch Helm \end{itemize} \end{itemize} \hypertarget{welche-komponententools-werden-verwendet}{% \subsection{Welche Komponenten/Tools werden verwendet}\label{welche-komponententools-werden-verwendet}} Folgende Komponenten/Tools werden im CI/CD Prozess verwendet: \begin{itemize} \tightlist \item \textbf{Build} \begin{itemize} \tightlist \item OpenAPI Codegenerator \item Maven \end{itemize} \item \textbf{Test} \begin{itemize} \tightlist \item JUnit-5 \item JaCoCo \end{itemize} \item \textbf{Analyse} \begin{itemize} \tightlist \item Static Code Analysis \begin{itemize} \tightlist \item SonarQube 7 \end{itemize} \end{itemize} \item \textbf{Package} \begin{itemize} \tightlist \item Kaniko \item Helm \end{itemize} \item \textbf{Deploy} \begin{itemize} \tightlist \item Helm \item Kubernetes \end{itemize} \end{itemize} \textbf{CI/CD Engine}: Serverless Jenkins X \hypertarget{cicd-in-outputs}{% \section{CI/CD In-,Outputs}\label{cicd-in-outputs}} \hypertarget{trigger}{% \subsection{Trigger}\label{trigger}} Jenkins X erhält verschiedene Inputs,Trigger und Signale durch einen Webhook-Server namens \emph{Lighthouse}. An ihn werden Eventbenachichtigungen durch GitLab gesendet um anschließend ein \textbf{CI-Run} zu starten. Dabei wird ein \textbf{CI-Run} durch folgende Trigger und Konditionen gestartet: \begin{itemize} \tightlist \item Push auf den \textbf{master} branch auf GitLab \item Push auf einen branch mit offenen \emph{Merge Request} \item Ausführen des Befehlt \texttt{jx\ start\ pipeline} \end{itemize} \hypertarget{inputs-und-kontexte-daten}{% \subsection{Inputs und Kontexte Daten}\label{inputs-und-kontexte-daten}} Diese Daten fliesen und beeinflussen den \textbf{CI-Build}: \begin{itemize} \tightlist \item Source-Code \item Branch von den die Pipeline getriggert wurde \item User, der die Pipeline ausgelöst hat. \item Offene Mergerequests \item Prow-Konfiguration \item Jenkins X Projekt Konfiguration \item HMAC Secret des Webhookrequestes \# Pipeline Definitionen \end{itemize} Es existieren zwei verschiedene Pipelines die durch die Trigger ausgelöst werden können: \begin{itemize} \tightlist \item Release \item Preview \end{itemize} \hypertarget{release}{% \subsection{Release}\label{release}} Diese Pipeline kompeliert, testet, analysiert, verpackt und bereitet die Software zum Deployment vor. Sie deployed jedoch die Anwendung nicht, sondern erstellt/modifiziert lediglich verschiedene Umgebungskonfigurationen, bei denen das automatische Deployment vorgesehen ist. \textbf{Trigger}: Push oder Merge auf den \textbf{master} Branch. \hypertarget{stage-setup-buildpack-maven}{% \subsubsection{Stage: Setup (Buildpack Maven)}\label{stage-setup-buildpack-maven}} In dieser Stage wird der Buildprozess vorbereitet und eingeleitet. Befehle: \begin{itemize} \tightlist \item \texttt{echo\ \textbackslash{}\$(jx-release-version)\ \textgreater{}\ VERSION} Schreiben der neuen Software Version in eine Temporäre \texttt{VERSION} Datei um diese in späteren Schritten wieder abrufen zu können \item \texttt{mvn\ versions:set\ -DnewVersion=\textbackslash{}\$(cat\ VERSION)} Setzen der Software Version in Maven um die neuen Software-Artefakte direkt mit richtigen namen und Tags zu versehen. \item \texttt{jx\ step\ tag\ -\/-version\ \textbackslash{}\$(cat\ VERSION)} Setzen der Software Version in Jenkins X und in Git als Tag. \end{itemize} \hypertarget{stage-build-buildpack-maven}{% \subsubsection{Stage: Build (Buildpack Maven)}\label{stage-build-buildpack-maven}} In dieser Stage werden alle zum Build dazugehörigen komponenten und Tools ausgeführt. Bei einigen befehlen werden mehrere Tools und Komponenten gleichzeitig ausgeführt um den Buildprozess erfolgreich abzuschließen. \textbf{Befehle}: \begin{itemize} \item \texttt{mvn\ clean\ deploy} Durch diesen Befehl wird die eigentliche Software gebaut. Der Bauprozess in Maven ist in verschiedene Phasen aufgeteilt, die in einer festen Reinfolge abgearbeitet werden. In jedem dieser Phasen wird ein anderes Tool/Plugin/Komponente aufgerufen. Nach dem Abschluss jeder Phase wird überprüft, ob die Phase erfolgreich abgeschlossen wurde. \textbf{Phasen}: \begin{itemize} \item \texttt{clean} Bereinigt den Projekt Ordner von überresten eines vorherigen buildprozesses. \item \texttt{generate-sources} Erstellt mithilfe von \textbf{openapi-generator.tech} Serverboilercode und API Schnittstellendefinitionen aus einer \emph{OpenAPI-Definitions Datei}. Diese liegt unter \texttt{src/main/resources/api.yaml} und ist in \emph{OpenAPI v3} formatiert. Der generierte Code ist unter \texttt{target/generated-sources/openapi} abgelegt und wird automatisch in den \emph{Classpath} eingebunden. \item \texttt{compile} Erhebt alle Dependencys und stellt diese zu den entsprechenden Phasen des Buildvorgangs zuverfügung. Anschließend werden alle Sourcen die sich in dem Sourcepath befinden kompeliert. \item \texttt{test} Führt UnitTests mithilfe von \emph{JUnit 5} aus. \emph{JUnit} scannt nach Aktivierten und Relevanten Tests und führt diese aus. Die Ergebnisse werden in Form eines XML-Reports in den \texttt{target} Ordner abgelegt. Bei der Ausführung der Tests wird zusätzlich die Code Coverage durch \emph{JaCoCo} erhoben und ebenfals ein Report unter \texttt{target} abgelegt. \item \texttt{package} Erzeugt eine ausführbare \texttt{.jar} Datei mit allen benötigten Dependencys um diese zu Containerisieren. \end{itemize} \item \texttt{skaffold\ build\ -f\ skaffold.yaml} Wird durch Jenkins X zu Kaniko build umformatiert. Baut Container Image mit Parameter aus Jenkins X und veröffentlich diese in einem Container Registry \item Sonarqube Analyse (Custom addition) \begin{Shaded} \begin{Highlighting}[] \ExtensionTok{mvn}\NormalTok{ {-}{-}batch{-}mode sonar:sonar \textbackslash{}} \NormalTok{ {-}Dsonar.projectKey=}\OperatorTok{\textless{}}\NormalTok{sonarqube projekt key}\OperatorTok{\textgreater{}}\NormalTok{ \textbackslash{}} \NormalTok{ {-}Dsonar.host.url=}\OperatorTok{\textless{}}\NormalTok{sonarqube host}\OperatorTok{\textgreater{}}\NormalTok{ \textbackslash{}} \NormalTok{ {-}Dsonar.login=}\OperatorTok{\textless{}}\NormalTok{sonarqube login key}\OperatorTok{\textgreater{}}\NormalTok{ \textbackslash{}} \NormalTok{ {-}Dsonar.gitlab.commit\_sha=}\VariableTok{$(}\FunctionTok{git}\NormalTok{ rev{-}parse HEAD}\VariableTok{)}\NormalTok{ \textbackslash{}} \NormalTok{ {-}Dsonar.gitlab.ref\_name=}\VariableTok{$(}\FunctionTok{git}\NormalTok{ rev{-}parse {-}{-}abbrev{-}ref HEAD}\VariableTok{)}\NormalTok{ \textbackslash{}} \NormalTok{ {-}Dsonar.gitlab.project\_id=}\OperatorTok{\textless{}}\NormalTok{project id}\OperatorTok{\textgreater{}}\NormalTok{ \textbackslash{}} \NormalTok{ {-}Dsonar.branch.name=}\VariableTok{$BRANCH\_NAME}\NormalTok{ \textbackslash{}} \NormalTok{ {-}Dsonar.gitlab.user\_token=}\OperatorTok{\textless{}}\NormalTok{gitlab access toekn}\OperatorTok{\textgreater{}}\NormalTok{\textbackslash{}} \end{Highlighting} \end{Shaded} Analysiert Projekt mit Hilfe von SonarQube und bricht die Pipeline ab wenn Qualitätsprobleme gefunden wurden. \end{itemize} \hypertarget{stage-promote-buildpack-maven}{% \subsubsection{Stage: Promote (Buildpack Maven)}\label{stage-promote-buildpack-maven}} In dieser Stage werden die erzeugten Artefakte in die zugehörigen Artefaktarchivierungssysteme hochgeladen und die verschiedenen Umgebungskonfigurationen modifiziert um den \emph{CD-Prozess} zu starten. \textbf{Befehle:} \begin{itemize} \tightlist \item \texttt{jx\ step\ changelog\ -\/-version\ v\textbackslash{}\$(cat\ ../../VERSION)} Fügt dem Tag und dem Release in GitLab Changelogs aus den Commitnachichten hinzu. \item \texttt{jx\ step\ helm\ release} Veröffentlich das Helmchat aus dem \texttt{charts} Ordner unter einer neuen Version im Chartmuseum. \item \texttt{jx\ promote\ -b\ -\/-all-auto\ -\/-timeout\ 1h\ -\/-version\ \textbackslash{}\$(cat\ ../../VERSION)} Modifiziert oder Erstellt die Umgebunskonfigurationen bei denen in Jenkins X \emph{Autodeploy} aktiviert wurde. \end{itemize} \hypertarget{preview}{% \subsection{Preview}\label{preview}} Diese Pipeline kompeliert, testet, analysiert, verpackt und bereitet die Software zum deployment in eine temporäre Previewenvirgonment. Diese Pipeline ist nicht zum Bau einer Realease Version gedacht und bereitet die Software nur für ein themporäres Preview vor. \textbf{Trigger}: Push oder Merge auf einen Branch, der Quelle eines offenen \emph{Merge-Request} ist. \hypertarget{stage-build-buildpack-maven-1}{% \subsubsection{Stage: Build (Buildpack Maven)}\label{stage-build-buildpack-maven-1}} In dieser Stage werden alle zum Build dazugehörigen komponenten und Tools ausgeführt. Bei einigen befehlen werden mehrere Tools und Komponenten gleichzeitig ausgeführt um den Buildprozess erfolgreich abzuschließen. \textbf{Befehle}: \begin{itemize} \item \texttt{mvn\ clean\ install} Durch diesen Befehl wird die eigentliche Software gebaut. Der Bauprozess in Maven ist in verschiedene Phasen aufgeteilt, die in einer festen Reinfolge abgearbeitet werden. In jedem dieser Phasen wird ein anderes Tool/Plugin/Komponente aufgerufen. Nach dem Abschluss jeder Phase wird überprüft, ob die Phase erfolgreich abgeschlossen wurde. \textbf{Phasen}: \begin{itemize} \item \texttt{clean} Bereinigt den Projekt Ordner von überresten eines vorherigen buildprozesses. \item \texttt{generate-sources} Erstellt mithilfe von \textbf{openapi-generator.tech} Serverboilercode und API Schnittstellendefinitionen aus einer \emph{OpenAPI-Definitions Datei}. Diese liegt unter \texttt{src/main/resources/api.yaml} und ist in \emph{OpenAPI v3} formatiert. Der generierte Code ist unter \texttt{target/generated-sources/openapi} abgelegt und wird automatisch in den \emph{Classpath} eingebunden. \item \texttt{compile} Erhebt alle Dependencys und stellt diese zu den entsprechenden Phasen des Buildvorgangs zuverfügung. Anschließend werden alle Sourcen die sich in dem Sourcepath befinden kompeliert. \item \texttt{test} Führt UnitTests mithilfe von \emph{JUnit 5} aus. \emph{JUnit} scannt nach Aktivierten und Relevanten Tests und führt diese aus. Die Ergebnisse werden in Form eines XML-Reports in den \texttt{target} Ordner abgelegt. Bei der Ausführung der Tests wird zusätzlich die Code Coverage durch \emph{JaCoCo} erhoben und ebenfals ein Report unter \texttt{target} abgelegt. \item \texttt{package} Erzeugt eine ausführbare \texttt{.jar} Datei mit allen benötigten Dependencys um diese zu Containerisieren. \end{itemize} \item \texttt{skaffold\ build\ -f\ skaffold.yaml} Wird durch Jenkins X zu Kaniko build umformatiert. Baut Container Image mit Parameter aus Jenkins X und veröffentlich diese in einem Container Registry \item Sonarqube Analyse (Custom addition) \begin{Shaded} \begin{Highlighting}[] \ExtensionTok{mvn}\NormalTok{ {-}{-}batch{-}mode sonar:sonar \textbackslash{}} \NormalTok{ {-}Dsonar.projectKey=}\OperatorTok{\textless{}}\NormalTok{sonarqube projekt key}\OperatorTok{\textgreater{}}\NormalTok{ \textbackslash{}} \NormalTok{ {-}Dsonar.host.url=}\OperatorTok{\textless{}}\NormalTok{sonarqube host}\OperatorTok{\textgreater{}}\NormalTok{ \textbackslash{}} \NormalTok{ {-}Dsonar.login=}\OperatorTok{\textless{}}\NormalTok{sonarqube login key}\OperatorTok{\textgreater{}}\NormalTok{ \textbackslash{}} \NormalTok{ {-}Dsonar.gitlab.commit\_sha=}\VariableTok{$(}\BuiltInTok{echo} \VariableTok{$PULL\_REFS} \KeywordTok{|} \FunctionTok{cut}\NormalTok{ {-}d}\StringTok{\textquotesingle{}:\textquotesingle{}}\NormalTok{ {-}f3}\VariableTok{)}\NormalTok{ \textbackslash{}} \NormalTok{ {-}Dsonar.gitlab.ref\_name=}\VariableTok{$(}\FunctionTok{git}\NormalTok{ rev{-}parse {-}{-}abbrev{-}ref HEAD}\VariableTok{)}\NormalTok{ \textbackslash{}} \NormalTok{ {-}Dsonar.gitlab.project\_id=}\OperatorTok{\textless{}}\NormalTok{project id}\OperatorTok{\textgreater{}}\NormalTok{ \textbackslash{}} \NormalTok{ {-}Dsonar.branch.name=}\VariableTok{$BRANCH\_NAME}\NormalTok{ \textbackslash{}} \NormalTok{ {-}Dsonar.gitlab.user\_token=}\OperatorTok{\textless{}}\NormalTok{gitlab access toekn}\OperatorTok{\textgreater{}}\NormalTok{\textbackslash{}} \end{Highlighting} \end{Shaded} Analysiert Projekt mit Hilfe von SonarQube. \end{itemize} \hypertarget{stage-promote-buildpack-maven-1}{% \subsubsection{Stage: Promote (Buildpack Maven)}\label{stage-promote-buildpack-maven-1}} In dieser Stage werden die erzeugten Artefakte in die zugehörigen Artefaktarchivierungssysteme hochgeladen und eine temporäre Previewumgebung erstellt um die Anwendung kurzzeitig zu testen. \textbf{Befehle:} \begin{itemize} \tightlist \item \texttt{jx\ step\ changelog\ -\/-version\ v\textbackslash{}\$(cat\ ../../VERSION)} Fügt dem Tag und dem Release in GitLab Changelogs aus den Commitnachichten hinzu. \item \texttt{jx\ step\ helm\ release} Veröffentlich das Helmchat aus dem \texttt{charts} Ordner unter einer neuen Version im Chartmuseum. \item \texttt{jx\ promote\ -b\ -\/-all-auto\ -\/-timeout\ 1h\ -\/-version\ \textbackslash{}\$(cat\ ../../VERSION)} Modifiziert oder Erstellt die Umgebunskonfigurationen bei denen in Jenkins X \emph{Autodeploy} aktiviert wurde. \end{itemize}