# Создание и тестирование для Go

Узнайте, как создать рабочий процесс непрерывной интеграции (CI) для создания и тестирования проекта Go.

> \[!NOTE]
> GitHub Enterprise Serverразмещенные в данный момент средства выполнения не поддерживаются в GitHub.

## Введение

В этом руководстве описано, как создать, протестировать и опубликовать пакет Go.

GitHub-размещенные средства запуска имеют кэш средств с предварительно установленным программным обеспечением, которое включает зависимости для Go. Полный список актуального программного обеспечения и предварительно установленных версий Go см. в разделе [Средства выполнения тестов, размещенные в GitHub](/ru/enterprise-server@3.22/actions/concepts/runners/github-hosted-runners#preinstalled-software-for-github-owned-images).

## Необходимые компоненты

Вы уже должны быть знакомы с синтаксисом YAML и его использованием GitHub Actions. Дополнительные сведения см. в разделе [Синтаксис рабочего процесса для GitHub Actions](/ru/enterprise-server@3.22/actions/reference/workflows-and-actions/workflow-syntax).

Рекомендуется иметь базовое представление о пакете SDK для языка Go. Дополнительные сведения см. в разделе [Приступая к работе с Go](https://golang.org/doc/tutorial/getting-started).

## Использование шаблона рабочего процесса Go

Чтобы быстро приступить к работе, добавьте шаблон рабочего процесса в `.github/workflows` каталог репозитория.

GitHub предоставляет шаблон рабочего процесса Go, который должен работать для большинства проектов Go. В последующих разделах этого руководства приведены примеры настройки этого шаблона рабочего процесса.

1. На GitHubперейдите на главную страницу репозитория.

2. Под именем репозитория щелкните **<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**.

   ![Снимок экрана: вкладки для репозитория github/docs. Вкладка "Действия" выделена оранжевым контуром.](/assets/images/help/repository/actions-tab-global-nav-update.png)

3. Если в вашем репозитории уже используется рабочий процесс, нажмите кнопку **Создать рабочий процесс**.

4. На странице "Выбор рабочего процесса" показан выбор рекомендуемых шаблонов рабочих процессов. Найдите "go".

5. Отфильтруйте выбор рабочих процессов, щелкнув **"Непрерывная интеграция**".

6. В рабочем процессе "Перейти по GitHub Actions" нажмите кнопку **"Настроить**".

   ![Снимок экрана: страница "Выбор рабочего процесса". Кнопка "Настроить" в рабочем процессе Go выделена оранжевым контуром.](/assets/images/help/actions/starter-workflow-go.png)
   Если вы не найдете шаблон рабочего процесса "Go - by GitHub Actions", скопируйте следующий код рабочего процесса в новый файл, вызываемый `go.yml` в `.github/workflows` каталоге репозитория.

   ```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. Измените рабочий процесс по мере необходимости. Например, измените версию Go.

8. Щелкните **Зафиксировать изменения**.

## Указание версии Go

Самый простой способ указать версию Go — использовать `setup-go` действие, предоставленное GitHub. Дополнительные сведения см. в описании [действия `setup-go`](https://github.com/actions/setup-go/).

Чтобы использовать предустановленную версию Go в GitHubразмещенном средстве выполнения, передайте соответствующую версию `go-version` свойству `setup-go` действия. Это действие находит определенную версию Go из кэша инструментов в средстве выполнения и добавляет необходимые двоичные файлы в переменную `PATH`. Эти изменения будут сохранены для остальной части задания.

Это `setup-go` рекомендуемый способ использования Go GitHub Actions, так как он помогает обеспечить согласованное поведение в разных бегунах и различных версиях Go. При использовании локального средства выполнения необходимо установить Go и добавить его в `PATH`.

### Использование нескольких версий 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
```

### Использование определенной версии Go

Вы можете настроить задание для использования конкретной версии Go, например `1.20.8`. Кроме того, можно использовать синтаксис семантической версии, чтобы получить последний дополнительный выпуск. В этом примере используется последний выпуск исправлений go 1.21:

```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'
```

## Установка зависимостей

Можно использовать для `go get` установки зависимостей:

```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
```

### Кэширование зависимостей

Можно кэшировать и восстанавливать зависимости с помощью [`setup-go` действия](https://github.com/actions/setup-go). По умолчанию кэширование включено при использовании `setup-go` действия.

Действие `setup-go` выполняет поиск файла зависимостей в `go.sum`корневом каталоге репозитория и использует хэш файла зависимостей в составе ключа кэша.

Параметр можно использовать `cache-dependency-path` для случаев, когда используются несколько файлов зависимостей или когда они находятся в разных подкаталогах.

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

Если у вас есть особые требования или вам нужно управлять кэшированием более детально, можно использовать [действие `cache`](https://github.com/marketplace/actions/cache). Дополнительные сведения см. в разделе [Справочник по кэшированию зависимостей](/ru/enterprise-server@3.22/actions/reference/workflows-and-actions/dependency-caching).

## Создание и тестирование кода

Вы можете использовать те же команды, которые используются для создания и тестирования кода в локальной среде. В этом примере рабочего процесса показано, как использовать `go build` и `go test` в задании:

```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
```

## Упаковка данных рабочего процесса в виде артефактов

После завершения рабочего процесса можно отправить полученные артефакты для анализа. Например, может потребоваться сохранить файлы журналов, основные дампы, результаты теста или снимки экрана. В следующем примере показано, как использовать действие `upload-artifact` для отправки результатов теста.

Дополнительные сведения см. в разделе [Хранение и предоставление общего доступа к данным с артефактами рабочего процесса](/ru/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
```