\newcommand{\VerbBar}{|}
\newcommand{\VERB}{\Verb[commandchars=\\\{\}]}
\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}}
% Add ',fontsize=\small' for more characters per line
\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}{%
\chapter{CI/CD Dokumentation}
\section{CI/CD Dokumentation}\label{cicd-dokumentation}}

Dokumentation für die CI/CD Pipeline von dem \textit{<hier Java Webservice Name einsetzen>}

\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 angebundener externen Testdatenbank
  \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}: Cloudgerechtes Packaging der 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
    SonarQube 7
  \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}}
Hier werden die verschiedenen Parameter aufgelistet, die die CI/CD Pipeline beeinflussen könnten.
\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 einen
\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-kontext-daten}{%
\subsection{Inputs und Kontextdaten}\label{inputs-und-kontexte-daten}}

Diese Daten fliesen und beeinflussen den \textbf{CI-Build}:

\begin{itemize}
\tightlist
\item
  Source-Code
\item
  Branch, von dem die Pipeline getriggert wurde
\item
  User, der die Pipeline ausgelöst hat
\item
  Offene Merge Requests
\item
  Prow-Konfiguration
\item
  Jenkins X Projekt Konfiguration
\item
  HMAC Secret des Webhookrequestes \# Pipeline Definitionen
\end{itemize}


\section{Pipeline Definitionen}
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 kompiliert, 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{Masterbranch}.

\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 Softwareversion 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 Softwareversion 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 gehö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
  jeder 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 zu Verfügung. Anschließend
    werden alle Sourcen, die sich in dem Sourcepath befinden kompiliert.
  \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 im
    \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öffentlicht diese in einem Container Registry
\item
  Sonarqube Analyse (Custom addition)


\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}


  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 kompiliert, testet, analysiert, verpackt und bereitet die
Software zum Deployment in eine temporäre Previewenvironment.

Diese Pipeline ist nicht zum Bau einer Releaseversion gedacht und
bereitet die Software nur für ein temporä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 gehö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 zur Verfügung. Anschließend
    werden alle Sourcen, welche sich in dem Sourcepath befinden kompiliert.
  \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 im
    \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{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}


  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}

