Continuous Integration / Continuous Delivery für BitBucket

Drone-CI 0.8 und BitBucket 5.6 warten ein spitzen Team

Es ist nun schon etwas her, da war ich auf der Suche nach möglichen Alternativen zu der Anwendung Jenkins.
Bei meinem Arbeitgeber existiert(e) zu der Zeit ein On-Premises Atlassian Bitbucket v5.6.1. Nach etwas suchen fand ich ein Tool, welches mich überzeugte. Es war von Grund auf ein anderen Ansatz zu dem den ich bis dato vom Jenkins kannte.

 

Drone-CI nutzt für alles Docker Container. Auch für die eigentlichen Schritte einer Pipeline. Man bediente sich einfach der öffentlichen Docker Container von Java, Maven oder node.js.

Anders als andere Tools, wie Gitlab-CI, reicht drone-CI ein Docker-Volume von einem Container an den nächsten weiter. In diesem Volume befindet sich der Git Checkout und alles was beim Bauen so entsteht während der Pipeline.
Ist eine Pipeline abgeschlossen wird das Volume anschließend wieder verworfen, so hat man immer einen clean Build.

Die Pipeline schreibt man in YAML Form, aber eigentlich besteht sie nur aus der Abfolge von den CLI-Befehlen, die man währende der Pipeline zum Bauen und Testen benötigt. Man wechselt lediglich ab und an das Docker-Image, welches dann die jeweiligen Befehle auch beherrscht.

Jeder Step (Container) bekommt zusätzlich Environment Variablen (ENVs) gesetzt. Es gibt feste, gut dokumentierte ENVs, wie zum Beispiel den Namen des Branches. Dazu kann Drone-CI Secrets verwalten und diese ebenfalls als ENVs im Ablauf bereitstellen. Als Erweiterung gibt es Plugins, welche komplexere Aufgaben übernehmen können.

 

Zum Hosting brauchte man nicht viel. Man benötigt lediglich eine VM mit Docker. In meinem Fall lief die Anwendung hinter dem Proxy-Server Traefik 2.0, damit auf der VM noch andere Anwendungen parallel gehostet werden können.

Der Login in die Anwendung, um die Build Logs einzusehen, erfolgt mit dem OAuth 1 Standard, der sich zwar nicht wirklich durchgesetzt hat, aber nur diese ältere Version von OAuth wird vom BitBucket Server in dieser Version unterstützt.
Dank OAuth 1 brauchte man sich um die Nutzerverwaltung keine große Gedanken machen, jeder Kollege konnte sich direkt an der Anwendung anmelden.

Damit der Quelltest aus dem BitBucket geladen werden konnte, benötigte man einen technischen Account, dem in dem jeweiligen Repo Leserechte eingeräumt werden mussten.

Die gesamte Dokumentation ist einfach und verständlich geschrieben und so war es relativ leicht möglich, die App im BitBucket einzurichten.

 

Das nachfolgende Docker-Compose File war so mehre Jahre bei meinem Arbeitgeber intern im Einsatz.

version: '2' 

services:

  drone-db:
    image: postgres
    restart: always
    environment:
      POSTGRES_PASSWORD: ******
      POSTGRES_USER: droneci
      POSTGRES_DB: dronecidb
    networks:
      - drone-internal
    volumes:
      - /srv/drone/postgres-db:/var/lib/postgresql/data
    # only for developer access (e.g. via pgAdmin)
    ports:
      - "127.0.0.1:15432:5432"

  drone-server:
    image: drone/drone:0.8
    restart: always
    volumes:
      - ./keys/key.pem:/path/to/key.pem
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=web"
      - "traefik.http.routers.drone_08_router.entrypoints=web"
      - "traefik.http.routers.drone_08_router.rule=Host(`drone.{yourdomain}`)"
      - "traefik.http.routers.drone_08_router.service=drone_08_service@docker"
      - "traefik.http.services.drone_08_service.loadbalancer.server.port=8000"
    networks:
      - web
      - drone-internal
    environment:
      - DRONE_DATABASE_DRIVER=postgres
      - DRONE_DATABASE_DATASOURCE=postgres://droneci:******@drone-db:5432/dronecidb?sslmode=disable
      - DRONE_OPEN=true
      - DRONE_HOST=http://drone.{yourdomain}
      - DRONE_STASH=true
      - DRONE_STASH_GIT_USERNAME=********
      - DRONE_STASH_GIT_PASSWORD=********
      - DRONE_STASH_CONSUMER_KEY=********
      - DRONE_STASH_CONSUMER_RSA=/path/to/key.pem
      - DRONE_STASH_URL=https://bitbucket.{yourdomain}
      - DRONE_SECRET=********
      - DRONE_ADMIN=********
      # - DRONE_DEBUG=true

  drone-agent:
    image: drone/agent:0.8
    command: agent
    restart: always
    depends_on:
      - drone-server
    networks:
      - drone-internal
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_SERVER=drone-server:9000
      - DRONE_SECRET=********
      - DRONE_MAX_PROCS=7
      # - DRONE_DEBUG=true


networks:
  web:
    external: true

  drone-internal:
    external: false

Der Herausgeber von Drone-CI ist so freundlich und stellt noch weiterhin die Dokumentation zur Version 0.8 online zur Verfügung. https://0-8-0.docs.drone.io/

 

In einem folgenden Betrag möchte ich noch etwas auf die unterschiedlichen Versionen von Drone-CI und die Besonderheiten mit BitBucket eingehen. Auch wird es fertige Setups geben die man dann selbst probieren kann.

Alternativ können Sie etwas mehr zu der Geschichte hinter Drone-CI in meinem letzten Post erfahren.

Ein Gedanke zu „Continuous Integration / Continuous Delivery für BitBucket

Kommentare sind geschlossen.