CI/CD für Go-Projekte: GitHub Actions von A bis Z

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

CI/CD für Go-Projekte: GitHub Actions von A bis Z

\n\n

In der modernen Softwareentwicklung ist die Automatisierung von Build-, Test- und Bereitstellungsprozessen (CI/CD) nicht nur eine Annehmlichkeit, sondern eine Notwendigkeit. Für Projekte in Go (Golang) ist die Verwendung von GitHub Actions eine der einfachsten und effektivsten Möglichkeiten, kontinuierliche Integration und Bereitstellung zu organisieren. In diesem Artikel werden wir den gesamten Zyklus der Einrichtung einer CI/CD-Pipeline für Go-Anwendungen durchgehen, von der Basiskonfiguration bis zum automatischen Deployment.

\n\n

Was ist GitHub Actions und warum ist es wichtig für Go?

\n\n

GitHub Actions ist eine integrierte Plattform zur Automatisierung von Arbeitsabläufen (Workflows) in GitHub-Repositories. Sie ermöglicht die Erstellung von Pipelines, die auf bestimmte Ereignisse ausgelöst werden: Push in einen Branch, Erstellung eines Pull Requests, Veröffentlichung eines Releases usw.

\n\n

Für Go-Projekte bietet GitHub Actions mehrere entscheidende Vorteile:

\n
    \n
  • Schnelle Kompilierung — Go kompiliert sehr schnell, was die Ausführungszeit der Pipeline verkürzt.
  • \n
  • Statisches Linken — Go-Binärdateien benötigen keine externen Abhängigkeiten, was das Deployment vereinfacht.
  • \n
  • Integriertes Testen — Das Dienstprogramm go test lässt sich hervorragend in CI-Systeme integrieren.
  • \n
  • Plattformunabhängigkeit — Binärdateien für verschiedene Betriebssysteme und Architekturen lassen sich leicht erstellen.
  • \n
\n\n

Einrichtung einer grundlegenden CI-Pipeline

\n\n

Beginnen wir mit der Erstellung eines einfachen Workflows, der Tests ausführt und den Code auf Einhaltung der Go-Standards überprüft. Erstellen Sie dazu im Stammverzeichnis Ihres Repositorys das Verzeichnis .github/workflows und die Datei ci.yml.

\n\n

Beispiel einer Basiskonfiguration:

\n\n
name: CI Pipeline for Go\n\non:\n  push:\n    branches: [ main, develop ]\n  pull_request:\n    branches: [ main ]\n\njobs:\n  build-and-test:\n    runs-on: ubuntu-latest\n    \n    steps:\n    - name: Checkout code\n      uses: actions/checkout@v4\n\n    - name: Setup Go\n      uses: actions/setup-go@v5\n      with:\n        go-version: '1.22'\n\n    - name: Cache Go modules\n      uses: actions/cache@v4\n      with:\n        path: ~/go/pkg/mod\n        key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}\n        restore-keys: |\n          ${{ runner.os }}-go-\n\n    - name: Download dependencies\n      run: go mod download\n\n    - name: Run vet\n      run: go vet ./...\n\n    - name: Run tests\n      run: go test -v -race -count=1 ./...\n\n    - name: Build\n      run: go build -o myapp ./cmd/app
\n\n

Dieser Workflow führt die folgenden Schritte aus:

\n
    \n
  • Klont das Repository.
  • \n
  • Installiert Go Version 1.22.
  • \n
  • Cachet die Module, um nachfolgende Ausführungen zu beschleunigen.
  • \n
  • Lädt Abhängigkeiten über go mod download herunter.
  • \n
  • Führt go vet für die statische Analyse aus.
  • \n
  • Führt Tests mit dem Flag -race zur Erkennung von Datenrennen durch.
  • \n
  • Erstellt die Binärdatei.
  • \n
\n\n

Erweiterte Konfiguration: Plattformübergreifender Build und Linter

\n\n

Go ermöglicht es, Anwendungen einfach für verschiedene Plattformen zu erstellen. Fügen wir der Pipeline eine Build-Matrix und die Ausführung des Linters golangci-lint hinzu.

\n\n

Aktualisierte Datei ci.yml:

\n\n
name: Advanced Go CI/CD\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n\njobs:\n  lint:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n    - uses: actions/setup-go@v5\n      with:\n        go-version: '1.22'\n    - name: golangci-lint\n      uses: golangci/golangci-lint-action@v4\n      with:\n        version: latest\n        args: --timeout=5m\n\n  test:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n    - uses: actions/setup-go@v5\n      with:\n        go-version: '1.22'\n    - run: go test -v -race -coverprofile=covera                

Blogs

Buchempfehlungen