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

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

## Введение

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

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

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

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

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

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

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

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

1. На GitHubперейдите на главную страницу репозитория.
   данных repositories.repositories.actions-tab %} 1. Если в вашем репозитории уже используется рабочий процесс, нажмите кнопку **Создать рабочий процесс**.

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

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

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

   ![Снимок экрана: страница "Выбор рабочего процесса". Кнопка "Настроить" в рабочем процессе Go выделена оранжевым контуром.](/assets/images/help/actions/starter-workflow-go.png)

5. Измените рабочий процесс по мере необходимости. Например, измените версию Go.

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

Файл `go.yml` рабочего процесса добавляется в `.github/workflows` каталог репозитория.

## Указание версии 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@v5
      - 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@v5
      - 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/actions/using-workflows/caching-dependencies-to-speed-up-workflows).

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

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

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

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v5
      - 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/actions/using-workflows/storing-workflow-data-as-artifacts).

```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@v5
      - 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@v4
        with:
          name: Go-results-${{ matrix.go-version }}
          path: TestResults-${{ matrix.go-version }}.json
```