Einführung in CI/CD für Go-Projekte
Moderne Entwicklung mit Go (Golang) erfordert nicht nur qualitativ hochwertigen Code, sondern auch zuverlässige Automatisierung von Build-, Test- und Bereitstellungsprozessen. CI/CD (Continuous Integration / Continuous Deployment) ist ein Ansatz, der es ermöglicht, jede Codeänderung automatisch zu überprüfen, Tests auszuführen und die fertige Anwendung an die Benutzer auszuliefern. In diesem Artikel werden wir im Detail besprechen, wie man eine CI/CD-Pipeline für Go-Projekte mit GitHub Actions einrichtet.
GitHub Actions ist ein integriertes CI/CD-System, mit dem Sie Workflows direkt im GitHub-Repository erstellen können. Für Go-Entwickler ist dies besonders praktisch, da es keine Einrichtung externer Dienste erfordert und sich leicht in die bestehende Infrastruktur integrieren lässt.
Warum gerade GitHub Actions für Go?
- Kostenlos für öffentliche Repositories — bis zu 2000 Build-Minuten pro Monat kostenlos
- Integrierte Go-Unterstützung — offizielle Actions zur Einrichtung der Umgebung
- Flexibilität — kann auf Ubuntu, Windows, macOS ausgeführt werden
- Caching — Beschleunigung von Builds durch Caching von Go modules
- Matrix-Testing — parallele Ausführung mit verschiedenen Go-Versionen
Erstellung einer grundlegenden CI/CD-Pipeline
Beginnen wir mit der Erstellung eines einfachen Workflows, der bei jedem Push in das Repository ausgeführt wird. Dazu muss im Stammverzeichnis Ihres Projekts die Datei .github/workflows/go.yml erstellt werden.
Beispiel für einen grundlegenden Workflow
name: Go CI/CD
on: push: branches: [ main, develop ] pull_request: branches: [ main ]
jobs: build: runs-on: ubuntu-latest strategy: matrix: go-version: [ '1.21', '1.22' ]
steps: - uses: actions/checkout@v4
- name: Setup Go uses: actions/setup-go@v5 with: go-version: ${{ matrix.go-version }}
- name: Cache Go modules uses: actions/cache@v3 with: path: ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go-
- name: Install dependencies run: go mod download
- name: Build run: go build -v ./...
- name: Test run: go test -v -race -coverprofile=coverage.txt ./...
- name: Upload coverage uses: codecov/codecov-action@v3 with: file: ./coverage.txt flags: unittestsDieser Workflow führt Folgendes aus:
- Wird bei Push in main/develop oder bei Erstellung eines Pull Requests ausgelöst
- Testet mit zwei Go-Versionen (1.21 und 1.22)
- Cachet Module zur Beschleunigung nachfolgender Builds
- Baut das Projekt und führt Tests mit den Flags
-race(Race-Detector) und-cover(Codeabdeckung) aus - Lädt den Coverage-Bericht in Codecov hoch
Erweiterte Einstellungen: Linting und Sicherheit
Für ein professionelles Go-Projekt reicht es nicht aus, den Code nur zu bauen und zu testen. Fügen wir statische Analyse und Sicherheitsüberprüfungen hinzu.
Hinzufügen von Linting mit golangci-lint
- name: Lint uses: golangci/golangci-lint-action@v3 with: version: latest args: --timeout=5m --out-format=colored-line-number skip-pkg-cache: truegolangci-lint vereint Dutzende von Lintern (govet, staticcheck, errcheck und andere) und erstellt einen einheitlichen Bericht. Dies hilft, potenzielle Fehler, ungenutzten Code und Stilprobleme zu finden.
Sicherheitsprüfung mit govulncheck
- name: Check vulnerabilities run: | go install golang.org/x/vuln/cmd/govulncheck@latest govulncheck ./...Das Dienstprogramm govulncheck analysiert die Abhängigkeiten des Projekts auf bekannte Schwachstellen aus der Go Vulnerability Database. Dies ist kritisch