Skip to main content

Go でのビルドとテスト

Go プロジェクトのビルドとテストのための継続的インテグレーション (CI) ワークフローを作成できます。

はじめに

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

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

前提条件

YAMLの構文と、GitHub ActionsでのYAMLの使われ方に馴染んでいる必要があります。 詳しくは、「GitHub Actions のワークフロー構文」を参照してください。

Go 言語の基本を理解しておくことをおすすめします。 詳しくは、「Go の概要」をご覧ください。

Go ワークフロー テンプレートの使用

すぐに開始するには、リポジトリの .github/workflows ディレクトリにワークフロー テンプレートを追加します。

GitHub では、ほとんどの Go プロジェクトで動作する Go ワークフロー テンプレートが提供されています。 このガイドの以降のセクションでは、このワークフロー テンプレートをカスタマイズする方法の例を示します。

  1. GitHub で、リポジトリのメイン ページに移動します。

  2. リポジトリ名の下にある [アクション] をクリックします。

    "github/docs" リポジトリのタブのスクリーンショット。 [アクション] タブがオレンジ色の枠線で強調表示されています。

  3. ワークフローが既にリポジトリ内にある場合は、 [新しいワークフロー] をクリックします。

  4. [ワークフローの選択] ページには、推奨されるワークフロー テンプレートの選択が表示されます。 「go」を検索します。

  5. 継続的インテグレーション」をクリックして、ワークフローの選択をフィルター処理します。

  6. [Go - by GitHub Actions] ワークフローで、[構成] をクリックします。

    「ワークフローの選択」ページのスクリーンショット。 「Go」ワークフローの [設定] ボタンは、オレンジ色のアウトラインで強調されています

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

  8. [変更をコミットする] をクリックします。

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

Go バージョンの指定

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

GitHub ホストランナーでプレインストールされたバージョンの Go を使うには、setup-go アクションの go-version プロパティに関連するバージョンを渡します。 このアクションは、各ランナーのツール キャッシュから特定のバージョンの Go を見つけて、必要なバイナリを PATH に追加します。 これらの変更は、ジョブの残りの部分で保持されます。

setup-go アクションは、異なるランナーや異なるバージョンの Go で一貫した動作を保証するのに役立つため、GitHub Actions で Go を使うときに推奨される方法です。 セルフホスト型ランナーを使用している場合は、Go をインストールし、それを PATH に追加する必要があります。

複数のバージョンの Go の使用

YAML
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@v4
      - 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
      - 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
    steps:
      - uses: actions/checkout@v4
      - 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 アクションを使うと、依存関係をキャッシュおよび復元できます。 既定では、キャッシュは setup-go アクションを使うとき、有効になっています。

setup-go アクションによってリポジトリ ルートで依存関係ファイル go.sum が検索され、依存関係ファイルのハッシュをキャッシュ キーの一部として使います。

依存関係ファイルを複数使っている場合、またはそれらが別のサブディレクトリにある場合、cache-dependency-path パラメーターを使うことができます。

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

カスタム要件がある場合、またはキャッシュに対してより細かい制御が必要な場合は、cache アクションを使用できます。 詳しくは、「依存関係をキャッシュしてワークフローのスピードを上げる」を参照してください。

コードのビルドとテスト

ローカルで使うのと同じコマンドを、コードのビルドとテストに使えます。 このワークフローの例では、ジョブで go buildgo test を使う方法を示します。

YAML
name: Go
on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
      - 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 アクションを使ってテスト結果をアップロードする方法を示します。

詳しくは、「ワークフローからのデータの格納と共有」を参照してください。

YAML
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@v4
      - 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