引き続き個人開発で Go を使って開発を進めている。
Linter として golangci-lint の実行環境を整えた。
今回は GitHub Actions で golangci-lint とテストの実行環境を整えたので、その設定を整理する。
GitHub Actions は push するか Pull Request の作成/更新をトリガーとしている。
ランナーはハッシュ値を指定し、サプライチェーン攻撃の対策を施した。
追々 Renovate も導入していきたく、バージョンをコメントとして記載することで、Renovate が自動で更新作業を行えるようにしてある。
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 ./...name: CIGitHub Actions の Actions タブに表示されるワークフロー名。

on:
push:
pull_request:GitHub Actions の起動トリガー。
すべての 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 ./...ci というジョブを ubuntu-latest というランナー上で実行する。
golanci-lint とテストを1つのジョブにまとめているのは、共通のチェックアウトと Go のセットアップを1回で済ませるため。
4.1. ステップ1:Checkout
- name: Checkout
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0リポジトリのコードをランナーにチェックアウトする。
ハッシュ値でバージョンを指定しつつ、末尾のコメントで人間が読めるかたちでバージョンを指定。
前述したが、これにより Renovate による自動更新に対応できるようにしている。
4.2. ステップ2:Set up Go
- name: Set up Go
uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5.6.0
with:
go-version-file: go.modGo 実行環境をセットアップする。go-version-file: go.mod により go.mod の go 1.26を自動で読み取るので、バージョンをワークフロー側にハードコードせず、go.mod 更新時に CI 側の追従漏れが起きない。setup-go はデフォルトで Go モジュールキャッシュも有効にしてくれるため、ビルド高速化にも寄与する。
4.3. ステップ3:Run tests
- name: Run tests
run: go test ./...リポジトリ全体(ユニットテスト・機能テストの両方を含む internal/… と test/functional/… )を対象にテストを実行する。
Makefile に make test-unit / make test-functional といった、テストを簡潔に実行できるコマンドを用意している。
CI では、そのような Docker 経由のコマンドではなく、CI ランナー上でネイティブに go test を直接呼ぶ形にした。
この記事では個人開発を行っている Go プロダクトの CI の設定を紹介した。
プロダクトコードはまだ存在しないが、CI 環境を整えておくことで品質を担保して開発が進められるようにしておくことに大きな意義があると考えている。
今後の開発での活躍に期待したい。
