# Go でのビルドとテスト

Go プロジェクトのビルドとテストのための継続的インテグレーション (CI) ワークフローを作成する方法について説明します。

## はじめに

このガイドは、Go パッケージのビルド、テスト、公開の方法を紹介します。

GitHub ホステッド ランナーにはプリインストールされたソフトウェアのあるツール キャッシュがあり、Go 用の依存関係が含まれています。 最新のソフトウェアの完全な一覧と、プレインストールされたバージョンの Go については、「[GitHub ホステッド ランナー](/ja/actions/using-github-hosted-runners/about-github-hosted-runners#preinstalled-software)」を参照してください。

## 前提条件

YAMLの構文と、GitHub ActionsでのYAMLの使われ方に馴染んでいる必要があります。 詳しくは、「[GitHub Actions　のワークフロー構文](/ja/actions/using-workflows/workflow-syntax-for-github-actions)」をご覧ください。

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. 「Go - by GitHub Actions」ワークフローで、**構成**をクリックします。

   ![「ワークフローの選択」ページのスクリーンショット。 「Go」ワークフローの \[設定\] ボタンは、オレンジ色のアウトラインで強調されています](/assets/images/help/actions/starter-workflow-go.png)

7. 必要に応じてワークフローを編集します。 例えば、Go のバージョンを変更します。

8. ```
          **[Commit changes]** をクリックします。
   ```

`go.yml` ワークフロー ファイルが使用中リポジトリの `.github/workflows` ディレクトリに追加されます。

## Go バージョンの指定

最も簡単に Go のバージョンを指定する方法は、GitHub によって提供される `setup-go` アクションを使用することです。 詳細については、「[`setup-go` アクション](https://github.com/actions/setup-go/)」を参照してください。

GitHub ホストランナーでプレインストールされたバージョンの Go を使うには、`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 の使用

```
          `1.20.8` のような特定のバージョンの Go を使うようにジョブを構成できます。 あるいは、最新のマイナーリリースを取得するためにセマンティックバージョン構文を使うこともできます。 この例では、最新のパッチ リリースである 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)を使用できます。 詳しくは、「[依存関係キャッシュのリファレンス](/ja/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` アクションを使ってテスト結果をアップロードする方法を示します。

詳しくは、「[ワークフロー成果物を使ったデータの格納と共有](/ja/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
```