Drone mit Gitea

Drone

Drone im Zusammenspiel mit Gitea kann als CI/CD Pipeline eingesetzt werden. Dank zahlreicher Plugins, lässt sich so auch ein Continuous Delivery Pipeline für das Deployment aufbauen. Hier in diesem Beispiel soll es aber vielmehr um die Installation und Konfiguration gehen. Es wird ein Java Programm, das mit Gradle als Buildtool übersetzt wird, einen Status in Gitea als sogenanntes Badge anzeigen. Dazu wird nach jedem Commit ein Docker Image als Grundlage verwendet, um das Programm mit Gradle zu bauen und testen.

Vorbereitung

Zunächst habe ich einen DNS Eintrag drone.XXXX.org erstellt, damit der Dienst hinter dem Reverse Proxy (NginX) aus dem Netz erreichbar ist.

1. eine OAuth2 Application erstellen

Damit OAuth2 mit Drone und Gitea funktuiniert, muss man in Gitea eine „Anwendung“ anlegen. Dieser Anwendung wird später die Erlaubnis gegeben, Gitea als Basis für die Git Repositories zu dienen. In den Einstellungen unter Settings –> Applications –> Manage OAuth2 Applications wird nun eine neue Anwendung erstellt.

Der Anwendung geben wir den Namen drone, damit eine Zuordnung später möglich ist. Die redirect URL setzt sich aus der Domain plus dem Path /login zusammen.

Feld Wert
Name drone
Redirect URL https://drone.XXXX.org/login

Mit einem Klick auf create application wird nun die Anwendung in Gitea angelegt.

Notieren Sie sofort die angezeigten Werte, da das Secret später nicht mehr angezeigt wird und bei Verlust ein neues Secret erstellt werden muss. Hier beispielhafte Werte die dann angezeigt werden:

Var Value
ClientID 3fdd3921-22f4-49ab-bcb1-2b15854e936f
Client Secret 6neDCDDVXya5eVCb4JJhNZGGGdG-nSoA3f8QKYyjamk=

Beenden Sie nun die Eingabe mit einem Klick auf den Button Save, um die Anwendung endgültig anzulegen.

2. Secret für die Kommunikation zwischen Drone und und dem Runner erstellen

Damit sich der Docker Runner mit Drone unterhält, muss ein zuvor generiertes Secret ausgetauscht werden. Mit openssl lässt sich ein Secret sehr einfach auf der Kommandozeile generieren. Der Aufruf von

openssl rand -hex 16

spuckt etwas wie

c014d553037b2ab672374684bed79fa0

aus. Dieses Secret muss dem Docker Container als RPC_SECRET übergeben werden (siehe unten).

3. Drone Container starten

Als Vorbereitung laden wir den Container mit docker pull runter.

docker pull drone/drone:1

Konfiguration

Der Docker Container benötigt einige Angaben, damit Drone mit dem Gitea zusammenarbeitet. Es werden die ClientID, ClientSecret und das Secret für den Docker Runner benötigt. Die Adresse des Gitea Server, sowie die Server Host Adresse und das Protokoll müssen angegeben werden. Alle weiteren Parameter sind Standard und bedürfen hier keiner weiteren Erklärung.

Die gesamte Konfiguration sieht dann wie folgt aus:

docker run \
  --volume=/var/lib/drone:/data \
  --env=DRONE_AGENTS_ENABLED=true \
  --env=DRONE_GITEA_SERVER=https://git.XXXX.org \
  --env=DRONE_GITEA_CLIENT_ID=3e2f5dd2-2704-11ea-9f11-00248cbd6e48 \
  --env=DRONE_GITEA_CLIENT_SECRET=6neDCDDVXya5eVCb4JJhNZGGGdG-nSoA3f8QKYyjamk= \
  --env=DRONE_RPC_SECRET=c014d553037b2ab672374684bed79fa0 \
  --env=DRONE_SERVER_HOST=drone.XXXX.org \
  --env=DRONE_SERVER_PROTO=https \
  --publish=80:80 \
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone:1

Achtung: Auch wenn über Port 80 nur HTTP geht, so muss als Protokoll HTTPS angegeben werden, da sonst die Redirect URI nicht korrekt ist und OAuth2 Login nicht funktioniert und eine Fehlermeldung innerhalb von Gitea angezeigt wird.

Grant Access

Durch Aufruf der Seite https://drone.XXXX.org wird man per Redirect auf den Gitea Server weitergeleitet. Hier muss man jetzt noch der Anwendung „drone“ den Zugriff gewähren. Danach wird man auf die Drone Seite weitergeleitet, wo jetzt alle Repositories des Gitea Servers gelistet sein sollten.

4. Docker Runner

Drone benötigt, wie bei GitLab auch, Runner. Es gibt verschiedene Runner, die man nutzen kann, um ein Build durchzuführen. Wie unter https://docker-runner.docs.drone.io/installation/install_linux/ beschrieben, installieren wir nun noch einen Runner auf Docker Basis. Zunächst pullen wir den Runner mit

docker pull drone/drone-runner-docker:1

Den Runner konfigurieren

Der Runner benötigt nicht ganz so viele Parameter wie der Drone Container. Einige werden jedoch dennoch benötigt. Es muss der Host und das Protokoll für den Drone Server angegeben werden. Zusätzlich muss das vorher generierte Secret übergeben werden, so dass sich folgender Aufruf ergibt:

docker run -d \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e DRONE_RPC_PROTO=https \
  -e DRONE_RPC_HOST=drone.XXXX.org \
  -e DRONE_RPC_SECRET=e16578d8ae6306175e49df94ad2c75e4 \
  -e DRONE_RUNNER_CAPACITY=2 \
  -e DRONE_RUNNER_NAME=${HOSTNAME} \
  -p 3000:3000 \
  --restart always \
  --name runner \
  drone/drone-runner-docker:1

Nach dem erfolgreichen Start pollt der Runner den Server https://drone.XXXX.org, welches mit docker logs runner sichtbar wird.

[test@manjaro-server ~]$ docker logs runner
time="2019-12-19T11:06:44Z" level=info msg="starting the server" addr=":3000"
time="2019-12-19T11:06:45Z" level=info msg="successfully pinged the remote server"
time="2019-12-19T11:06:45Z" level=info msg="polling the remote server" arch=amd64 capacity=2 endpoint="https://drone.XXXX.org" kind=pipeline os=linux type=docker

Nun steht der Runner bereit und wartet auf Aufträge die er abarbeiten kann.

Die Projektkonfiguration

Repository aktivieren

In den Settings des Repository muss dieses aktiviert werden, damit Drone auf Events reagieren kann.

Ein Drone YAML Skript erstellen

Drone ließt die Datei .drone.yml im Rootverzeichnis des Repositories aus und handelt nach den dort hinterlegten Anweisungen.

Hier ein sehr einfaches Skript, welches bei jeden Commit einen Test mit Gradle durchführt. Das Skript verwendet ein Archlinux als Basis und installiert Java nach, damit der Gradle Wrapper in dem Repository

kind: pipeline
name: default

steps:
- name: setup
  image: archlinux/base:latest
  commands:
    - echo 'Server = http://cache.XXXX.org:8080/$repo/os/$arch/' > /etc/pacman.d/mirrorlist
    - pacman -Sy --noprogressbar --noconfirm jdk11-openjdk
    - JAVA_HOME=/usr/lib/jvm/java-11-openjdk/ ./gradlew clean build test

Wichtig: –noprogressbar muss angegeben werden, da sonst der Drone Runner sofort das Skript mit SUCCESS beendet. Dieses scheint ein Fehler von Drone zu sein.

Für eine schnellere Verarbeitung der Kommandos habe ich einen lokalen Cache für Pacman eingerichtet. Der Cache ist unter der Domäne cache.XXXX.org auf dem Port zu erreichen. Das Docker Image ist bereits lokal von Docker gecacht und daher ist nun eine Installation der Java und Gradle Pakete innerhalb kurzer Zeit erledigt.

Nun wird Drone beim jedem Commit in das Repository einen eigenständigen Build anstoßen und das Badge entsprechend in Gitea aktualisieren.

Plugins

Für Drone.io gibt es jede Menge Plugins unter https://plugins.drone.io/

Alternativen

Es gibt bereits einen Fork von Drone, der im Wesentlichen eine Erweiterung für Windows Programme mit Cygwin darstellt. Der Fork tea-ci ist unter https://docs.tea-ci.org/usage/overview/ zu finden.