Drone CI global environment Variable
Bei Drone CI handelt es sich um einen OpenSource continuous integration (CI) Server. Dabei setzt Drone CI auf die Ausführung des Builds mittels Containern. Typischerweise werden dabei Docker oder Kubernetes als Container Plattform eingesetzt.
Eine Buildpipeline wird in YAML definiert, dabei können sowohl services
definiert werden, die im Build verwendet werden, als auch persistente volumes
und natürlich die Buildabläufe als steps
.
kind: pipeline
type: kubernetes
name: build-demo
platform:
os: linux
arch: arm64
volumes:
- name: cache
temp: {}
- name: docker
host:
path: /var/tmp/docker
services:
- name: docker
image: docker:20.10-dind
environment:
DOCKER_TLS_CERTDIR: ""
resources:
requests:
cpu: 1
memory: 2Gi
limits:
memory: 2Gi
privileged: true
ports:
- 2375
volumes:
- name: docker
path: /var/lib/docker
steps:
- name: publish
image: docker
environment:
DOCKER_HOST: "tcp://localhost:2375"
resources:
requests:
cpu: 1
memory: 128Mi
privileged: true
commands:
- cd frontend && sleep 10 # docker sidecar needs time for startup
- docker build -t registry.docker-registry:5000/demo/frontend .
- docker push registry.docker-registry:5000/demo/frontend
Leider bietet Drone CI keine Möglichkeit, gemeinsame Umgebungsvariablen zu definieren.
Motivation dafür kann z.B. die Auswahl einer Build-Variante sein, die man in mehreren Buildartefakten gleichartig konfigurieren will.
Im Beispiel wird ein Angular Frontend und ein Spring Boot Backend gebaut.
Für beide gibt es Varianten, die durch ein Buildargument oder eine Environment Variable konfiguriert werden können.
Drone CI Kubernetes Pipeline mit globaler Umgebungsvariable
Abhilfe kann hier das verwendete YAML Format schaffen:
In YAML können globale Variablen definiert und dann referenziert werden.
Die Definition einer globalen Variable in YAML erfolgt durch &
, die Referenzierung durch *
.
global-variables:
VARIANT: &variant debug
An anderer Stelle kann dieser Wert nun referenziert und als Umgebungsvariable bereitgestellt werden.
Wichtig ist dabei, dass bei den Build Kommandos darauf geachtet wird, die Umgebungsvariable durch $${…}
aufzulösen, da das Dollarzeichen in YAML eine besondere Bedeutung hat.
steps:
- name: publish
image: docker
environment:
DOCKER_HOST: "tcp://localhost:2375"
VARIANT: *variant
commands:
- cd frontend && sleep 10 # docker sidecar needs time for startup
- docker build --build-arg VARIANT=$${VARIANT} -t registry.docker-registry:5000/demo/frontend
- docker push registry.docker-registry:5000/demo/frontend
Analog kann der Wert dann auch für weitere Buildsteps in Drone CI referenziert werden.
Zu den Themen Kubernetes, Docker und Cloud Architektur bieten wir sowohl Beratung, Entwicklungsunterstützung als auch passende Schulungen an:
Auch für Ihren individuellen Bedarf können wir Workshops und Schulungen anbieten. Sprechen Sie uns gerne an.