# Erstellen und Testen von Go

Hier erfährst, du, wie du einen CI-Workflow (Continuous Integration) erstellst, um dein Go-Projekt zu erstellen und zu testen.

> \[!NOTE]
> Auf GitHub Enterprise Server gehostete Runner werden aktuell nicht auf GitHub unterstützt.

## Einführung

In dieser Anleitung erfährst du, wie du ein Go-Paket erstellst, testest und veröffentlichst.

GitHub gehostete Runner verfügen über einen Tools-Cache mit vorinstallierter Software, der auch die Abhängigkeiten für Go enthält. Eine vollständige Liste der aktuellen Software und der vorinstallierten Versionen von Go findest du unter [Von GitHub gehostete Runner](/de/enterprise-server@3.22/actions/concepts/runners/github-hosted-runners#preinstalled-software-for-github-owned-images).

## Voraussetzungen

Sie sollten bereits mit der YAML-Syntax und damit vertraut sein, wie sie mit GitHub Actions verwendet wird. Weitere Informationen finden Sie unter [Workflowsyntax für GitHub Actions](/de/enterprise-server@3.22/actions/reference/workflows-and-actions/workflow-syntax).

Du solltest über grundlegende Kenntnisse in Bezug auf die Go-Programmiersprache verfügen. Weitere Informationen findest du unter [Erste Schritte mit Go](https://golang.org/doc/tutorial/getting-started).

## Verwenden einer Go-Workflowvorlage

Fügen Sie für einen schnellen Einstieg dem Verzeichnis `.github/workflows` Ihres Repositorys eine Workflowvorlage hinzu.

GitHub stellt eine Go-Workflowvorlage bereit, die für die meisten Go-Projekte funktionieren sollte. In den nachfolgenden Abschnitten dieser Anleitung finden Sie Beispiele dafür, wie diese Workflowvorlage angepasst werden kann.

1. Navigieren Sie auf GitHub zur Hauptseite des Repositorys.

2. Klicke unter dem Repositorynamen auf **<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-play" aria-label="play" role="img"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path></svg> Actions**.

   ![Screenshot: Registerkarten für das Repository „github/docs“. Die Registerkarte „Aktionen“ ist mit einem orangefarbenen Rahmen hervorgehoben.](/assets/images/help/repository/actions-tab-global-nav-update.png)

3. Wenn du bereits über einen Workflow im Repository verfügst, klicke auf **Neuer Workflow**.

4. Auf der Seite „Workflow auswählen“ wird eine Auswahl empfohlener Workflowvorlagen angezeigt. Suchen Sie nach „go“.

5. Filtern Sie die Auswahl von Workflows, indem Sie auf **Continuous Integration** klicken.

6. Klicken Sie im Workflow "Go - by GitHub Actions" auf **Konfigurieren**.

   ![Screenshot: Seite „Einen Workflow auswählen“ Die Schaltfläche „Konfigurieren“ im Workflow „Go“ ist mit einem orangefarbenen Umriss hervorgehoben.](/assets/images/help/actions/starter-workflow-go.png)
   Wenn Sie die Workflowvorlage „Go - by GitHub Actions“ nicht finden, kopieren Sie den folgenden Workflow-Code in eine neue Datei mit dem Namen `go.yml` im Verzeichnis `.github/workflows` Ihres Repositorys.

   ```yaml copy
   name: Go

   on:
     push:
       branches: [ "main" ]
     pull_request:
       branches: [ "main" ]

   jobs:
     build:

       runs-on: self-hosted
       steps:
         - uses: actions/checkout@v6

         - name: Set up Go
           uses: actions/setup-go@v5
           with:
             go-version: '1.20'

         - name: Build
           run: go build -v ./...

         - name: Test
           run: go test -v ./...
   ```

7. Bearbeiten Sie den Workflow nach Bedarf. Ändern Sie zum Beispiel die Version von Go.

8. Klicke auf **Änderungen übernehmen**.

## Angeben einer Go-Version

Am einfachsten lässt sich eine Go-Version angeben, indem Sie die von `setup-go` bereitgestellte GitHub-Aktion verwenden. Weitere Informationen findest du unter der [`setup-go`-Aktion](https://github.com/actions/setup-go/).

Um eine vorinstallierte Version von Go auf einem von GitHub gehosteten Runner zu verwenden, übergeben Sie die entsprechende Version an die Eigenschaft `go-version` der Aktion `setup-go`. Mit dieser Aktion wird im Toolcache der jeweiligen Runner nach einer bestimmten Version von Go gesucht, und die erforderlichen Binärdateien werden zu `PATH` hinzugefügt. Diese Änderungen bleiben für den Rest des Auftrags beibehalten.

Die `setup-go` Aktion ist die empfohlene Methode der Verwendung von Go mit GitHub Actions, da sie hilft, ein konsistentes Verhalten für verschiedene Läufer und verschiedene Versionen von Go sicherzustellen. Wenn du einen selbstgehosteten Runner verwendest, musst du Go installieren und zu `PATH` hinzufügen.

### Verwenden mehrerer Versionen von Go

```yaml copy
name: Go

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      matrix:
        go-version: [ '1.19', '1.20', '1.21.x' ]

    steps:
      - uses: actions/checkout@v6
      - name: Setup Go ${{ matrix.go-version }}
        uses: actions/setup-go@v5
        with:
          go-version: ${{ matrix.go-version }}
      # You can test your matrix by printing the current Go version
      - name: Display Go version
        run: go version
```

### Verwenden einer bestimmten Version von Go

Du kannst einen Auftrag so konfigurieren, dass eine bestimmte Version von Go verwendet wird, z. B. `1.20.8`. Alternativ kannst du auch Syntax für semantische Versionierung verwenden, um die neuste Nebenversion abzurufen. In diesem Beispiel wird das neueste Patchrelease von Go 1.21 verwendet:

```yaml copy
      - name: Setup Go 1.21.x
        uses: actions/setup-go@v5
        with:
          # Semantic version range syntax or exact version of Go
          go-version: '1.21.x'
```

## Installieren von Abhängigkeiten

Du kannst `go get` zum Installieren von Abhängigkeiten verwenden:

```yaml copy
    steps:
      - uses: actions/checkout@v6
      - name: Setup Go
        uses: actions/setup-go@v5
        with:
          go-version: '1.21.x'
      - name: Install dependencies
        run: |
          go get .
          go get example.com/octo-examplemodule
          go get example.com/octo-examplemodule@v1.3.4
```

### Abhängigkeiten „cachen“ (zwischenspeichern)

Du kannst Abhängigkeiten mithilfe der [Aktion `setup-go`](https://github.com/actions/setup-go) zwischenspeichern und wiederherstellen. Bei Verwendung der `setup-go`-Aktion ist das Zwischenspeichern standardmäßig aktiviert.

Die `setup-go`-Aktion sucht nach der Abhängigkeitsdatei `go.sum` im Repositorystamm und verwendet den Hash der Abhängigkeitsdatei als Teil des Cacheschlüssels.

Du kannst den `cache-dependency-path`-Parameter in Fällen verwenden, in denen mehrere Abhängigkeitsdateien verwendet werden, oder wenn sie sich in verschiedenen Unterverzeichnissen befinden.

```yaml copy
      - name: Setup Go
        uses: actions/setup-go@v5
        with:
          go-version: '1.17'
          cache-dependency-path: subdir/go.sum
```

Wenn du eine benutzerdefinierte Anforderung hast oder genauere Steuerungsmöglichkeiten zum Zwischenspeichern benötigst, kannst du die [`cache` Aktion](https://github.com/marketplace/actions/cache) verwenden. Weitere Informationen finden Sie unter [Referenz zum Zwischenspeichern von Abhängigkeiten](/de/enterprise-server@3.22/actions/reference/workflows-and-actions/dependency-caching).

## Deinen Code bauen und testen

Du kannst die gleichen Befehle verwenden, die du auch lokal verwendest, um deinen Code zu bauen und zu testen. In diesem Beispielworkflow wird gezeigt, wie `go build` und `go test` in einem Job verwendet werden.

```yaml copy
name: Go
on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v6
      - name: Setup Go
        uses: actions/setup-go@v5
        with:
          go-version: '1.21.x'
      - name: Install dependencies
        run: go get .
      - name: Build
        run: go build -v ./...
      - name: Test with the Go CLI
        run: go test
```

## Workflow-Daten als Artefakte paketieren

Nach Abschluss eines Workflows kannst du die resultierenden Artefakte für die Analyse hochladen. Zum Beispiel kann es notwendig sein, Logdateien, Core Dumps, Testergebnisse oder Screenshots zu speichern. Im folgenden Beispiel wird gezeigt, wie die Aktion `upload-artifact` zum Hochladen von Testergebnissen verwendet werden kann.

Weitere Informationen finden Sie unter [Speichern und Freigeben von Daten mit Workflowartefakten](/de/enterprise-server@3.22/actions/tutorials/store-and-share-data).

```yaml copy
name: Upload Go test results

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      matrix:
        go-version: [ '1.19', '1.20', '1.21.x' ]

    steps:
      - uses: actions/checkout@v6
      - name: Setup Go
        uses: actions/setup-go@v5
        with:
          go-version: ${{ matrix.go-version }}
      - name: Install dependencies
        run: go get .
      - name: Test with Go
        run: go test -json > TestResults-${{ matrix.go-version }}.json
      - name: Upload Go test results
        uses: actions/upload-artifact@v3
        with:
          name: Go-results-${{ matrix.go-version }}
          path: TestResults-${{ matrix.go-version }}.json
```