byteleaf logo
← zurück zum Blog

Anchors: DRY YAMLs für CI/CD-Pipelines

Pipelinekonfigurationen beinhalten oftmals viele wiederholte Steps. In diesem Guide wird erklärt, wie man dieses Problem mit YAML Anchors verhindern kann und gleichzeitig die Konfigurationsdatei übersichtlicher und weniger fehleranfällig gestaltet.
Markus Heer
Markus Heer
15. August 2020

Einführung

Die YAML-Konfigurationen für CI/CD-Pipelines sind selbst für kleine Projekte oft durch wiederholte Steps geprägt. Meist sind diese Steps für alle Umgebungen gleich oder enthalten lediglich minimale Änderungen. Um diesen Misstand zu beseitigen, können sogenannte Anchors verwendet werden. Dies wird in diesem Artikel am Beispiel von Bitbucket Pipelines demonstriert, lässt sich aber problemlos auch auf andere konfigurationsbasierte Pipelines - wie etwa die von GitLab - anwenden.

Eine typische Pipelinekonfigu­ration

In einem üblichen JavaScript-Projekt könnte eine Pipeline mit Installations-, Test- und Build-Step wie folgt aussehen:

1image: node:latest
2
3pipelines:
4  develop:
5    - step:
6        name: Install
7        caches:
8          - node
9        script:
10          - npm i
11    - step:
12        name: Test
13        caches:
14          - node
15        script:
16          - npm test
17  master:
18    - step:
19        name: Install
20        caches:
21          - node
22        script:
23          - npm i
24    - step:
25        name: Test
26        caches:
27          - node
28        script:
29          - npm test
30    - step:
31        name: Build
32        caches:
33          - node
34        script:
35          - npm run build

Vermeiden von Wiederholungen mit Anchors

Hier sieht man schnell das Optimierungspotential. Master und Develop-Branch teilen sich identische Steps. Mittels Anchors (&Anchor) können wir diese Steps ein Mal definieren und dann in beiden Steps ausgeben (*Referenz). Dieses würde in obigem Beispiel wie folgt aussehen:

1image: node:latest
2
3definitions:
4  steps:
5    - step: &Install
6        name: Install
7        caches:
8          - node
9        script:
10          - npm i
11    - step: &Test
12        name: Test
13        caches:
14          - node
15        script:
16          - npm run build
17
18pipelines:
19  develop:
20    - step: *Install
21    - step: *Test
22  master:
23    - step: *Install
24    - step: *Test
25    - step:
26        name: Build
27        caches:
28          - node
29        script:
30          - npm run build

Wie man sehen kann, wurde ein definitions Map hinzugefügt. Hier werden alle Anchors gehalten. Dies ist eine Bitbucket-Spezialität, für Anchors im generellen tut das aber nichts zur Sache. Definiert man einen Anchor (z.B. &Install) wird dieser Konfigurationsblock verfügbar gemacht, sobald man auf ihn referenziert (z.B. mit *Install).

Verändern von Anchor-Werten

Möchten wir nun beispielsweise auf mehreren Branches den selben Step ausführen, ihn jedoch leicht verändern, kann man dies wie folgt tun:

1image: node:latest
2
3definitions:
4  steps:
5    - step: &Install
6        name: Install
7        caches:
8          - node
9        script:
10          - npm i
11
12pipelines:
13  develop:
14    - step: *Install
15  master:
16    - step: 
17        <<: *Install
18        name: Install for Master

Wie man sieht, kann man mit dem << Operator Konfigurationen übernehmen und im Anschluss Werte von bestimmten Keys überschreiben.

Fazit

Wer bereits an Konfigurationen für viele Umgebungen gearbeitet hat, weiß, dass leicht Fehler passieren, wenn man an vielen Stellen den gleichen Step bearbeiten muss. Mittels YAML-Anchors können Konfigurationen übersichtlicher gestaltet und vor allem Fehler vermieden werden.

Kontakt

E-Mail

info@byteleaf.de

Telefon

+49 89 21527370

Links

Code

GitHub

Wo wir sind

Adresse

byteleaf GmbH
Barthstraße 16
80339 München

ImpressumDatenschutzCookie-Einstellungen
© 2021 - Code: byteleaf - Design: Michael Motzek