README.md 4.59 KB
Newer Older
Nane Kratzke's avatar
Nane Kratzke committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Lab: Deployment Pipelines as Code

Deployment Pipelines sind ein wesentlicher Baustein im DevOps Ansatz um Entwicklungszyklen kurz und agil zu halten.
Ziel ist es, Code der in ein Code Repository eingebracht wird, möglichst automatisiert zu integrieren, bauen, testen
sowie ggf. in eine Umgebung (häufig Test, Staging, Production) auszubringen.

Gemäß dem Everything as Code Ansatz versucht man auch Deployment Pipelines als versionierbaren Code ausdrücken zu können.
Es gibt diverse solcher Managed oder Self-hosted Services die als kommerzielle oder auch als Open Source bereitstehen. Z.B.:

- GitLab CI
- Circle CI
- Travis CI
- Jenkins
- Bitbucket Pipelines
- und mehr

Da Gitlab als Open Source Lösung einfach installiert werden kann, werden wir das Prinzip einer Deployment Pipeline
Nane Kratzke's avatar
Nane Kratzke committed
18
as Code am Typvertreter Gitlab CI demonstrieren. Die Ansätze anderer CI/CD Dienste funktionieren aber nach sehr
Nane Kratzke's avatar
Nane Kratzke committed
19
20
21
vergleichbaren Konzepten. Die Wahl auf Gitlab CI als Typvertreter erfolgt schlicht und ergreifend auf Basis der
guten Verfügbarkeit von Gitlab als Open Source Software und dessen häufigen Einsatz in Cloud-native Kontexten.

Nane Kratzke's avatar
Nane Kratzke committed
22
23
24
25
26
27
28
29
Wer mag, kann dieses Lab auch mittels des Managed Service Gitlab.com nachvollziehen. Hierzu müssen Sie sich allerdings
registrieren.

## Inhalt

- Erzeugung einer Build-Pipeline mittels einer Sequenz von Stages
- Parallele Ausführung von Jobs innerhalb einer Stage, sequentielle Ausführung der einzelnen Stages
- Weiterreichen von Artifacts zwischen Stages
Nane Kratzke's avatar
Nane Kratzke committed
30
31
32
- Informationen in die Build-Pipeline mittels [Environment Variables](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html) geben.
- Nutzung von Images
- Bereitstellung von Images
Nane Kratzke's avatar
Nane Kratzke committed
33
- Deployments to Kubernetes
Nane Kratzke's avatar
Nane Kratzke committed
34
- Deployments to Serverless Environments
Nane Kratzke's avatar
Nane Kratzke committed
35

Nane Kratzke's avatar
Nane Kratzke committed
36
37
### Übung 1: Erzeugung von Buildpipelines

Nane Kratzke's avatar
Nane Kratzke committed
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
Eine Deployment Pipeline besteht aus einer Sequenz von Stages. Jede Stage kann ein oder mehrere Jobs haben. Alle Jobs innerhalb einer
Stage werden parallel und isoliert voneinander ausgeführt. Eine Stage wird nur dann ausgeführt, wenn alle Jobs der vorherigen Stage
erfolgreich ausgeführt werden konnten.

Eine typische Pipeline umfasst häufig die folgenden Stages:

- build (zum Erzeugen von Executables)
- test (zum Testen von Executables)
- deploy (zum Ausbringen von Executables)

Solch eine einfache Deployment Pipeline wollen wir nun bauen. Indem Sie die folgenden Schritte ausführen:

__Aufgaben:__

1. Forken Sie hierzu bitte dieses Repository in Gitlab.
2. Legen Sie in diesem Repository eine `.gitlab-ci.yml` Datei an. Diese Datei definiert Ihre Pipeline, die Gitlab mit jedem Push in das Repository automatisch anstößt.
3. Fügen Sie in diese Datei nun bitte folgende Inhalte ein und committen/pushen Sie diese in das Repository:

    ```yaml
    stages:
        - build
        - test
        - deploy

    job1:
        stage: build
        script:
            - echo "Hello I am job 1"

    job2:
        stage: build
        script:
70
            - echo "Hello I am job 2"
Nane Kratzke's avatar
Nane Kratzke committed
71
72
73
74

    job3:
        stage: test
        script:
75
            - echo "Hello I am job 3"
Nane Kratzke's avatar
Nane Kratzke committed
76
77

    job4:
78
        stage: deploy
Nane Kratzke's avatar
Nane Kratzke committed
79
        script:
80
            - echo "Hello I am job 4"
Nane Kratzke's avatar
Nane Kratzke committed
81
    ```
Nane Kratzke's avatar
Nane Kratzke committed
82
4. Gitlab führt dann automatisch, die so definierte [Pipeline](../../../pipelines) aus.
Nane Kratzke's avatar
Nane Kratzke committed
83
   
Nane Kratzke's avatar
Nane Kratzke committed
84
   ![Pipeline](pipeline.png)
Nane Kratzke's avatar
Nane Kratzke committed
85
86
5. Klicken Sie auf einen dieser Jobs, dann erhalten Sie den Konsolenoutput des Jobs.
   
87
   ![Job console output](job-console.png)
Nane Kratzke's avatar
Nane Kratzke committed
88
89
90
91
92
93
94

Eine Pipeline ist also sehr einfach mit einer YAML Datei definierbar. YAML Dateien wiederum sind gut durch Code Versionssysteme versionierbar.
Das ist das Prinzip von einer Deployment Pipeline as Code. Sie sehen an diesem Beispiel weitere Aspekte.

- Jobs können einer Stage zugeordnet werden (z.B. mittels `stage: test`).
- Jobs sind eigentlich nichts weiter als Shellskripte, die in einem isolierten Container ausgeführt werden.
- Können alle Jobs einer Stage erfolgreich ausgeführt werden, (exit code == 0) werden die Jobs der nächsten Stage gestartet.
95
- Schlägt ein Job fehl (exit code != 0), wird die nächste Stage nicht gestartet. Sie können das ganz einfach ausprobieren, indem Sie den Befehl `exit 1` in job3 ergänzen.
Nane Kratzke's avatar
Nane Kratzke committed
96
97
98
99
100
101
102
    ```yaml
    job3:
        stage: test
        script:
            - echo "Hello I am job 3"
            - exit 1
    ```
103
104
105
    Die Pipeline schlägt dann in job3 in Stage `test` fehl.

    ![Pipeline job failed](pipeline-job-failed.png)
Nane Kratzke's avatar
Nane Kratzke committed
106
107


Nane Kratzke's avatar
Nane Kratzke committed
108
109

## Quellen für weitergehende Informationen:
Nane Kratzke's avatar
Nane Kratzke committed
110
111

- Youtube: [Gitlab CI pipeline tutorial for beginners](https://youtu.be/Jav4vbUrqII)
Nane Kratzke's avatar
Nane Kratzke committed
112
113
- Youtube: [Automating Kubernetes Deployments](https://youtu.be/wEDRfAz6_Uw)
- Youtube: [Continuous Integration with GitLab CI](https://youtu.be/EuwLdbCu3DE)
Nane Kratzke's avatar
Nane Kratzke committed
114

Nane Kratzke's avatar
Nane Kratzke committed
115