Neuigkeiten von trion.
Immer gut informiert.

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.

Drone CI Kubernetes Pipeline Beispiel
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 *.

Beispiel einer globalen Variable in YAML
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.

Referenzierung einer globalen Variable in Drone CI YAML
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.

Feedback oder Fragen zu einem Artikel - per Twitter @triondevelop oder E-Mail freuen wir uns auf eine Kontaktaufnahme!

Zur Desktop Version des Artikels