wir sind auf dem weg nach finale
This commit is contained in:
+2
-2
@@ -174,7 +174,7 @@ Richtlinien genutzt werden.
|
||||
|
||||
Beispielsweise kann durch technische Maßnahme verhindert werden, dass
|
||||
eine ungetestete Softwareversion in einer Produktionsumgebung ungewollt
|
||||
verwendet wird: Mit Hilfe eines Artefakt-Archivierungssystems können
|
||||
verwIO-et wird: Mit Hilfe eines Artefakt-Archivierungssystems können
|
||||
passende Einstellungen vorgenommen werden, welche gewährleisten, dass
|
||||
nur getestete Softwareversionen in die Produktion übertragen werden.
|
||||
\emph{(\ref{B06} \nameref{B06})}
|
||||
@@ -195,7 +195,7 @@ Weitere Maßnahmen könnten die Einführung einer \textbf{Hardwarequote} um
|
||||
für eine ungewollte Hardwarebeanspruchung für einzelne Nutzer
|
||||
vorzubeugen.
|
||||
|
||||
Das \textbf{vier-Augenprinzip} klingt zunächst nach einer
|
||||
Das \textbf{vier-Augenprinzip} klingt zunächst nach einer \todo{rewrite}
|
||||
organisatorischen Maßnahme und kann für unterschiedliche Prozessschritte
|
||||
als Qualitätssicherungsmaßnahme vorgesehen werden. Die technische
|
||||
Komponente dieser Maßnahme wäre die Dokumentation und
|
||||
|
||||
@@ -263,7 +263,7 @@ Der Betrieb eines \cicd Systems kann auch in Bezug auf Speicherplatz
|
||||
zu Engpässen führen. Für jede kleineste Codeänderung wird das ganze Set
|
||||
von Artefakten generiert und abgespeichert. Dazu gehören der z.B. der
|
||||
Code, die Testprotokolle, Reports zur Codeanalyse, Compilerlogs, die
|
||||
Software selbst und ihr Containerimage.\cite{plonski_herausforderungen_Leo_2020}
|
||||
Software selbst und ihr Containerimage.\cite{plonski_herausforderungen_Leo_2020} \ref{be:jx}
|
||||
|
||||
~
|
||||
|
||||
@@ -349,7 +349,7 @@ Häufig gibt es Richtlinien, welche die Löschung von Artefakten einer
|
||||
Software nach einem vorgegebenen Zeitraum veranlassen, solange sie
|
||||
keinem offiziellem Release zugeordnet sind. Bei Unkenntnis über eine
|
||||
solche Richtlinie kann der Zugriff auf die Version der Software durch
|
||||
diese Löschung verloren gehen. \cite{plonski_herausforderungen_Leo_2020}
|
||||
diese Löschung verloren gehen. \cite{plonski_herausforderungen_Leo_2020,shahin2017continuous}
|
||||
|
||||
~
|
||||
|
||||
|
||||
@@ -0,0 +1,233 @@
|
||||
# CI/CD Dokumentation
|
||||
|
||||
Dies ist die Dokumentation für die CI/CD Pipeline von dem <RANDOM JAVA WEBSERVICE>
|
||||
|
||||
|
||||
## Was wird Automatisiert ?
|
||||
Durch das CI/CD System werden Folgende Prozesse Automatisiert durchgeführt :
|
||||
|
||||
- **Build**: Build Prozess der Software
|
||||
- Automatische Generierung von API-Server Boilercode
|
||||
- Kompilierung und Verpacken der Software in eine **.jar*
|
||||
- **Test**: Automatisierte Tests
|
||||
- Modul-Test mit angebundenen externen Test Datenbank
|
||||
- Code-Coverage Report
|
||||
- **Analyse**: Analyse von Sourcecode und Test Reports
|
||||
- Statische Code Analyse durch SonarQube mit Qualitätsprofil **Sonar-Way**
|
||||
- Analyse des Code-Coverage Reports
|
||||
- Analyse des Modul-Test Ergebnisses
|
||||
- **Package**: Cloudgerechte Verpackung des Software
|
||||
- Containerisierung in einem Container-Image für die Cloudnutzung
|
||||
- Linting des Helm-Charts für Kubernetes
|
||||
- **Deploy**: Deployment der Software
|
||||
- Deployment auf einem Kubernetes Cluster durch Helm
|
||||
|
||||
## Welche Komponenten/Tools werden verwendet
|
||||
|
||||
Folgende Komponenten/Tools werden im CI/CD Prozess verwendet:
|
||||
|
||||
- **Build**
|
||||
- OpenAPI Codegenerator
|
||||
- Maven
|
||||
- **Test**
|
||||
- JUnit-5
|
||||
- JaCoCo
|
||||
- **Analyse**
|
||||
- Static Code Analysis
|
||||
- SonarQube 7
|
||||
- **Package**
|
||||
- Kaniko
|
||||
- Helm
|
||||
- **Deploy**
|
||||
- Helm
|
||||
- Kubernetes
|
||||
|
||||
**CI/CD Engine**: Serverless Jenkins X
|
||||
|
||||
# CI/CD In-,Outputs
|
||||
|
||||
|
||||
|
||||
## Trigger
|
||||
Jenkins X erhält verschiedene Inputs,Trigger und Signale durch einen Webhook-Server namens *Lighthouse*. An ihn werden Eventbenachichtigungen durch GitLab gesendet um anschließend ein **CI-Run** zu starten.
|
||||
|
||||
Dabei wird ein **CI-Run** durch folgende Trigger und Konditionen gestartet:
|
||||
|
||||
- Push auf den **master** branch auf GitLab
|
||||
- Push auf einen branch mit offenen *Merge Request*
|
||||
- Ausführen des Befehlt ``jx start pipeline``
|
||||
|
||||
## Inputs und Kontexte Daten
|
||||
|
||||
Diese Daten fliesen und beeinflussen den **CI-Build**:
|
||||
|
||||
- Source-Code
|
||||
- Branch von den die Pipeline getriggert wurde
|
||||
- User, der die Pipeline ausgelöst hat.
|
||||
- Offene Mergerequests
|
||||
- Prow-Konfiguration
|
||||
- Jenkins X Projekt Konfiguration
|
||||
- HMAC Secret des Webhookrequestes
|
||||
# Pipeline Definitionen
|
||||
|
||||
Es existieren zwei verschiedene Pipelines die durch die Trigger ausgelöst werden können:
|
||||
|
||||
- Release
|
||||
- Preview
|
||||
|
||||
## 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.
|
||||
|
||||
**Trigger**: Push oder Merge auf den **master** Branch.
|
||||
|
||||
### Stage: Setup (Buildpack Maven)
|
||||
|
||||
In dieser Stage wird der Buildprozess vorbereitet und eingeleitet.
|
||||
|
||||
Befehle:
|
||||
|
||||
- `echo \$(jx-release-version) > VERSION`
|
||||
Schreiben der neuen Software Version in eine Temporäre `VERSION` Datei um diese in späteren Schritten wieder abrufen zu können
|
||||
- `mvn versions:set -DnewVersion=\$(cat VERSION)`
|
||||
Setzen der Software Version in Maven um die neuen Software-Artefakte direkt mit richtigen namen und Tags zu versehen.
|
||||
- `jx step tag --version \$(cat VERSION)`
|
||||
Setzen der Software Version in Jenkins X und in Git als Tag.
|
||||
|
||||
### 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.
|
||||
|
||||
**Befehle**:
|
||||
|
||||
- ` 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.
|
||||
**Phasen**:
|
||||
|
||||
- `clean`
|
||||
Bereinigt den Projekt Ordner von überresten eines vorherigen buildprozesses.
|
||||
|
||||
- `generate-sources`
|
||||
Erstellt mithilfe von **openapi-generator.tech** Serverboilercode und API Schnittstellendefinitionen aus einer *OpenAPI-Definitions Datei*.
|
||||
Diese liegt unter `src/main/resources/api.yaml` und ist in *OpenAPI v3* formatiert.
|
||||
|
||||
Der generierte Code ist unter `target/generated-sources/openapi` abgelegt und wird automatisch in den *Classpath* eingebunden.
|
||||
|
||||
- `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.
|
||||
|
||||
- `test`
|
||||
Führt UnitTests mithilfe von *JUnit 5* aus. *JUnit* scannt nach Aktivierten und Relevanten Tests und führt diese aus. Die Ergebnisse werden in Form eines XML-Reports in den `target` Ordner abgelegt. Bei der Ausführung der Tests wird zusätzlich die Code Coverage durch *JaCoCo* erhoben und ebenfals ein Report unter `target` abgelegt.
|
||||
|
||||
- `package`
|
||||
Erzeugt eine ausführbare `.jar` Datei mit allen benötigten Dependencys um diese zu Containerisieren.
|
||||
|
||||
- `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
|
||||
|
||||
- Sonarqube Analyse (Custom addition)
|
||||
|
||||
```bash
|
||||
mvn --batch-mode sonar:sonar \
|
||||
-Dsonar.projectKey=<sonarqube projekt key> \
|
||||
-Dsonar.host.url=<sonarqube host> \
|
||||
-Dsonar.login=<sonarqube login key> \
|
||||
-Dsonar.gitlab.commit_sha=$(git rev-parse HEAD) \
|
||||
-Dsonar.gitlab.ref_name=$(git rev-parse --abbrev-ref HEAD) \
|
||||
-Dsonar.gitlab.project_id=<project id> \
|
||||
-Dsonar.branch.name=$BRANCH_NAME \
|
||||
-Dsonar.gitlab.user_token=<gitlab access toekn>\
|
||||
```
|
||||
|
||||
Analysiert Projekt mit Hilfe von SonarQube und bricht die Pipeline ab wenn Qualitätsprobleme gefunden wurden.
|
||||
|
||||
|
||||
|
||||
### Stage: Promote (Buildpack Maven)
|
||||
|
||||
In dieser Stage werden die erzeugten Artefakte in die zugehörigen Artefaktarchivierungssysteme hochgeladen und die verschiedenen Umgebungskonfigurationen modifiziert um den *CD-Prozess* zu starten.
|
||||
|
||||
**Befehle:**
|
||||
|
||||
- `jx step changelog --version v\$(cat ../../VERSION)`
|
||||
Fügt dem Tag und dem Release in GitLab Changelogs aus den Commitnachichten hinzu.
|
||||
- ` jx step helm release`
|
||||
Veröffentlich das Helmchat aus dem `charts` Ordner unter einer neuen Version im Chartmuseum.
|
||||
- `jx promote -b --all-auto --timeout 1h --version \$(cat ../../VERSION)`
|
||||
Modifiziert oder Erstellt die Umgebunskonfigurationen bei denen in Jenkins X *Autodeploy* aktiviert wurde.
|
||||
|
||||
## 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.
|
||||
|
||||
**Trigger**: Push oder Merge auf einen Branch, der Quelle eines offenen *Merge-Request* ist.
|
||||
|
||||
### 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.
|
||||
|
||||
**Befehle**:
|
||||
|
||||
- ` 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.
|
||||
**Phasen**:
|
||||
|
||||
- `clean`
|
||||
Bereinigt den Projekt Ordner von überresten eines vorherigen buildprozesses.
|
||||
|
||||
- `generate-sources`
|
||||
Erstellt mithilfe von **openapi-generator.tech** Serverboilercode und API Schnittstellendefinitionen aus einer *OpenAPI-Definitions Datei*.
|
||||
Diese liegt unter `src/main/resources/api.yaml` und ist in *OpenAPI v3* formatiert.
|
||||
|
||||
Der generierte Code ist unter `target/generated-sources/openapi` abgelegt und wird automatisch in den *Classpath* eingebunden.
|
||||
|
||||
- `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.
|
||||
|
||||
- `test`
|
||||
Führt UnitTests mithilfe von *JUnit 5* aus. *JUnit* scannt nach Aktivierten und Relevanten Tests und führt diese aus. Die Ergebnisse werden in Form eines XML-Reports in den `target` Ordner abgelegt. Bei der Ausführung der Tests wird zusätzlich die Code Coverage durch *JaCoCo* erhoben und ebenfals ein Report unter `target` abgelegt.
|
||||
|
||||
- `package`
|
||||
Erzeugt eine ausführbare `.jar` Datei mit allen benötigten Dependencys um diese zu Containerisieren.
|
||||
|
||||
- `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
|
||||
|
||||
- Sonarqube Analyse (Custom addition)
|
||||
|
||||
```bash
|
||||
mvn --batch-mode sonar:sonar \
|
||||
-Dsonar.projectKey=<sonarqube projekt key> \
|
||||
-Dsonar.host.url=<sonarqube host> \
|
||||
-Dsonar.login=<sonarqube login key> \
|
||||
-Dsonar.gitlab.commit_sha=$(echo $PULL_REFS | cut -d':' -f3) \
|
||||
-Dsonar.gitlab.ref_name=$(git rev-parse --abbrev-ref HEAD) \
|
||||
-Dsonar.gitlab.project_id=<project id> \
|
||||
-Dsonar.branch.name=$BRANCH_NAME \
|
||||
-Dsonar.gitlab.user_token=<gitlab access toekn>\
|
||||
```
|
||||
|
||||
Analysiert Projekt mit Hilfe von SonarQube.
|
||||
|
||||
|
||||
|
||||
### Stage: Promote (Buildpack Maven)
|
||||
|
||||
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.
|
||||
|
||||
**Befehle:**
|
||||
|
||||
- `jx step changelog --version v\$(cat ../../VERSION)`
|
||||
Fügt dem Tag und dem Release in GitLab Changelogs aus den Commitnachichten hinzu.
|
||||
- ` jx step helm release`
|
||||
Veröffentlich das Helmchat aus dem `charts` Ordner unter einer neuen Version im Chartmuseum.
|
||||
- `jx promote -b --all-auto --timeout 1h --version \$(cat ../../VERSION)`
|
||||
Modifiziert oder Erstellt die Umgebunskonfigurationen bei denen in Jenkins X *Autodeploy* aktiviert wurde.
|
||||
+477
@@ -0,0 +1,477 @@
|
||||
\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}
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
\input{classicthesis-config}
|
||||
\input{begriffe}
|
||||
\usepackage{todonotes}
|
||||
\usepackage{fancyvrb}
|
||||
%\usepackage{cite}
|
||||
%*************************************************************************
|
||||
% Bibliographies
|
||||
@@ -122,6 +123,7 @@
|
||||
\cleardoublepage
|
||||
\part{Appendix}
|
||||
\include{chapters/experience}
|
||||
%\include{pandoc/doku}
|
||||
%\include{chapters/examples/appendix01}
|
||||
%\include{chapters/examples/appendix02}
|
||||
%*************************************************************************
|
||||
|
||||
Reference in New Issue
Block a user