Als Alternative zu Github und Github Actions gibt es für kleinere Teams/Projekte/Organisationen oder private Projekte viele Möglichkeiten, welche selber gehostet werden können. Ich habe die Kombination von Gitea (als Git Service) mit Drone (als CI/CD Service) getestet, insbesondere weil beide einen relativ kleinen Footprint bezüglich CPU und Memory haben. Sie lassen sich gut auf einem kleinen VPS (Virtual Private Server) oder sogar einem Raspberry Pi betreiben.

Für ein privates Projekt, dass ich in Golang entwickelt habe hatte ich folgende Anforderungen:

  • Ein Push in den Master Branch soll nachfolgende Schritte vollautomatisch auslösen
  • Ein Docker Image bauen, auf einer Registry ablegen und anschliessend die laufende Instanz mit der neuen Version ersetzen
  • Die Binaries sollen für gängige Betriebssysteme (Linux, Windows) und gängige Architekturen (amd64, i386, arm64 und armv7) kompiliert und als Releases in Git zur Verfügung gestellt werden

Beim Gitea Release Plugin habe ich ein eigenes Image verwendet, bis mein Pull Request in das offizielle angenommen wird. use tag as title if not user provided fixes #26 by pheelee · Pull Request #28 · drone-plugins/drone-gitea-release (github.com)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
kind: pipeline
name: build
platform:
  arch: amd64
steps:
- name: publish-image
  image: plugins/docker
  settings:
    repo: registry.dockernet.ch/pheelee/cat
    username:
      from_secret: docker_username
    password:
      from_secret: docker_password
    registry: registry.dockernet.ch
    tags: latest
- name: deploy
  image: appleboy/drone-ssh
  settings:
    host: p2.irbe.ch
    username: deploy
    password: 
      from_secret: ssh_password
    port: 22
    script:
      - cat.irbe.ch prod
trigger:
  branch:
  - master
  event:
  - push
---
kind: pipeline
name: artifacts
steps:
- name: build
  image: golang
  environment:
    CGO_ENABLED: 0
  commands:
  - GOOS=linux GOARCH=amd64 go build -o dist/Cat-linux-amd64 ./cmd/Cat/
  - GOOS=linux GOARCH=386 go build -o dist/Cat-linux-386 ./cmd/Cat/
  - GOOS=linux GOARCH=arm64 go build -o dist/Cat-linux-arm64 ./cmd/Cat/
  - GOOS=linux GOARCH=arm GOARM=7 go build -o dist/Cat-linux-armv7 ./cmd/Cat/
  - GOOS=windows GOARCH=amd64 go build -o dist/Cat-win-amd64.exe ./cmd/Cat/
  - GOOS=windows GOARCH=386 go build -o dist/Cat-win-386.exe ./cmd/Cat/
  
- name: publish-artifacts
  image: pheelee/drone-gitea-release
  settings:
    api_key: 
      from_secret: gitea_api_key
    base_url: https://git.dockernet.ch
    files: dist/*
trigger:
  event:
  - tag

Secrets

Gewisse Parameter gehören nicht in ein Version Control System (Git) wie Passwörter, Tokens und unter Umständen Benutzernamen. Dafür bietet Drone die Möglichkeit Secrets pro Repository zu hinterlegen. Entsprechend wird in der .drone.yml der Parameter mit from_secret gelesen.

drone_secrets-865x1024.png

Git push

Nach dem aktivieren des Repositories in Drone und der Eingabe der Secrets kann der Sourcecode auf Gitea pushed werden und die Pipeline führt die entsprechenden Aufgaben aus. Wichtig ist das der Parameter --follow-tags bei git push mitgegeben wird. Ich habe zusätzlich --set-upstream origin master mitgegeben, weil es sich um den ersten Push handelt.

git_push.png

Drone Pipelines

Gemäss meinen Angaben in .drone.yml werden nun 2 Pipelines ausgeführt, eine um das Docker Image zu bauen und auf die Registry pushen. Die andere Pipeline kompiliert die Binaries und lädt sie in das Git Repository als Release hoch.

drone_pipelines.png

Referenzen