GitHub Actions で Go 言語プロジェクトの CI 環境を構築

引き続き個人開発で Go を使って開発を進めている。
Linter として golangci-lint の実行環境を整えた。

golangci-lint を使って個人開発プロジェクトを進めるので設定を紹介

今回は GitHub Actions で golangci-lint とテストの実行環境を整えたので、その設定を整理する。

1. GitHub Actions の CI 設定の全体像

GitHub Actions は push するか Pull Request の作成/更新をトリガーとしている。
ランナーはハッシュ値を指定し、サプライチェーン攻撃の対策を施した。
追々 Renovate も導入していきたく、バージョンをコメントとして記載することで、Renovate が自動で更新作業を行えるようにしてある。

.github/workflows/ci.yml
name: CI

on:
  push:
  pull_request:

jobs:
  ci:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0

      - name: Set up Go
        uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5.6.0
        with:
          go-version-file: go.mod

      - name: Run golangci-lint
        uses: golangci/golangci-lint-action@9fae48acfc02a90574d7c304a1758ef9895495fa # v7.0.1
        with:
          version: v2.11.4

      - name: Run tests
        run: go test ./...

2. name

.github/workflows/ci.yml > name
name: CI

GitHub Actions の Actions タブに表示されるワークフロー名。

GitHub Actions の Actions タブに表示されるワークフロー名

3. on

.github/workflows/ci.yml > on
on:
  push:
  pull_request:

GitHub Actions の起動トリガー。
すべての push と Pull Request の作成・更新で実行される。

4. jobs

.github/workflows/ci.yml > jobs
jobs:
  ci:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0

      - name: Set up Go
        uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5.6.0
        with:
          go-version-file: go.mod

      - name: Run golangci-lint
        uses: golangci/golangci-lint-action@9fae48acfc02a90574d7c304a1758ef9895495fa # v7.0.1
        with:
          version: v2.11.4

      - name: Run tests
        run: go test ./...

ci というジョブを ubuntu-latest というランナー上で実行する。
golanci-lint とテストを1つのジョブにまとめているのは、共通のチェックアウトと Go のセットアップを1回で済ませるため。

4.1. ステップ1:Checkout

.github/workflows/ci.yml > jobs.ci.steps
      - name: Checkout
        uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0

リポジトリのコードをランナーにチェックアウトする。
ハッシュ値でバージョンを指定しつつ、末尾のコメントで人間が読めるかたちでバージョンを指定。
前述したが、これにより Renovate による自動更新に対応できるようにしている。

4.2. ステップ2:Set up Go

.github/workflows/ci.yml > jobs.ci.steps
      - name: Set up Go
        uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5.6.0
        with:
          go-version-file: go.mod

Go 実行環境をセットアップする。
go-version-file: go.mod により go.modgo 1.26を自動で読み取るので、バージョンをワークフロー側にハードコードせず、go.mod 更新時に CI 側の追従漏れが起きない。
setup-go はデフォルトで Go モジュールキャッシュも有効にしてくれるため、ビルド高速化にも寄与する。

4.3. ステップ3:Run tests

.github/workflows/ci.yml > jobs.ci.steps
      - name: Run tests
        run: go test ./...

リポジトリ全体(ユニットテスト・機能テストの両方を含む internal/…test/functional/… )を対象にテストを実行する。
Makefile に make test-unit / make test-functional といった、テストを簡潔に実行できるコマンドを用意している。
CI では、そのような Docker 経由のコマンドではなく、CI ランナー上でネイティブに go test を直接呼ぶ形にした。

5. まとめ

この記事では個人開発を行っている Go プロダクトの CI の設定を紹介した。
プロダクトコードはまだ存在しないが、CI 環境を整えておくことで品質を担保して開発が進められるようにしておくことに大きな意義があると考えている。

今後の開発での活躍に期待したい。