CI/CD für Go-Projekte mit GitHub Actions: Vollständige Anleitung
Die Automatisierung von Build-, Test- und Bereitstellungsprozessen ist ein wesentlicher Bestandteil der modernen Go-Entwicklung (Golang). GitHub Actions bietet ein leistungsstarkes und flexibles Toolkit zur Erstellung von CI/CD-Pipelines direkt in Ihrem Repository. In diesem Artikel erläutern wir, wie Sie einen vollständigen Zyklus der kontinuierlichen Integration und Bereitstellung für ein Go-Projekt einrichten, vom einfachen Testen bis zur automatischen Bereitstellung.
Was ist CI/CD und warum ist es für Go wichtig?
CI (Continuous Integration) ist die Praxis des häufigen Zusammenführens von Code in den Hauptzweig mit automatischem Build und Test. CD (Continuous Delivery/Deployment) ist die automatische Bereitstellung der fertigen Anwendung.
Für Go-Projekte ist CI/CD besonders nützlich, da:
- Go in eine statische Binärdatei kompiliert wird, was die Bereitstellung vereinfacht
- Schnelles Testen dank der nativen Geschwindigkeit von Go
- Automatische Überprüfung durch Linter und Formatierung (
gofmt,golangci-lint) - Möglichkeit des Multiplattform-Builds (Linux, macOS, Windows)
Grundlagen von GitHub Actions für Go
GitHub Actions verwendet YAML-Dateien im Verzeichnis .github/workflows. Jede Datei beschreibt einen oder mehrere Workflows (Pipelines).
Betrachten wir einen grundlegenden Workflow für ein Go-Projekt:
name: Go CI
on: push: branches: [ main, develop ] pull_request: branches: [ main ]
jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 with: go-version: '1.22' - name: Cache Go modules uses: actions/cache@v4 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: Run tests run: go test -v -race -coverprofile=coverage.out ./... - name: Upload coverage uses: actions/upload-artifact@v4 with: name: coverage path: coverage.outDieser Workflow wird bei einem Push in main/develop und bei Pull Requests ausgelöst. Er installiert Go, cached Abhängigkeiten, führt Tests mit den Flags -race (Race-Detektor) und -coverprofile (Codeabdeckung) aus.
Fortgeschrittene Einstellungen: Linter und Multiplattform-Build
Um die Codequalität zu erhalten, fügen wir eine Linter-Überprüfung hinzu. golangci-lint ist der De-facto-Standard für Go.
lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 with: go-version: '1.22' - name: golangci-lint uses: golangci/golangci-lint-action@v6 with: version: latest args: --timeout=5m ./...Ein Multiplattform-Build ist nützlich, wenn Ihre Anwendung auf verschiedenen Betriebssystemen laufen soll:
build: needs: [test, lint] strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] goarch: [amd64, arm64] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 with: go-version: '1.22' - name: Build run: | GOARCH=${{ matrix.goarch }} go build -v -o myapp-${{ matrix.os }}-${{ matrix.goarch }} ./cmd/appHinweis: Für Windows muss der Name der Ausgabedatei angepasst werden (.exe hinzufügen). Verwenden Sie if runner.os == 'Windows' oder legen Sie den Namen über Variablen fest.
Automatische Bereitstellung einer Go-Anwendung
Für die Bereitstellung betrachten wir zwei gängige Szenarien: Veröffentlichung eines Docker-Images und Hochladen der Binärdatei auf einen Server.
Blogs
Buchempfehlungen
Lesen Sie auch
Sicherheit von PHP-Anwendungen: Top-10-Schwachstellen für Anfänger
So meistern Sie das Rust-Vorstellungsgespräch: Top-Fragen von A bis Z
SOLID-Prinzipien in PHP: Theorie und Praxis für sauberen Code
Erstes Python-Projekt: Ideen für Anfänger
Concurrency in PHP: Threads, Goroutinen und async/await – Praxisbeispiele
Blogs
Buchempfehlungen
Lesen Sie auch
Erstes Python-Projekt: Ideen für Anfänger