こんにちは!日々の開発、本当にお疲れ様です。
新しい言語やツールに触れるとき、「自分の手元だけでなく、クラウド上でも正しく動くか?」を確認する自動化の仕組みがあると、開発のスピードと安心感が何倍にも跳ね上がりますよね。
今回は、プログラミング言語「Go(Golang)」を学び始めたあなたに向けて、GitHub Actionsを使った最高にモダンなCI/CD(継続的インテグレーション/継続的デリバリー)パイプラインの構築術を徹底解説します。
「CI/CDなんて、まだ早いよ……」なんて思っていませんか?
ご安心ください。これをマスターすれば、あなたがコードを書いてGitHubにプッシュするだけで、クラウド上のロボットが「テストの実行」「コードの綺麗さのチェック(静的解析)」「実行ファイルの作成(ビルド)」を瞬時に、そして自動でやってくれるようになります。
毎日のコーディングが劇的に楽になり、コードの品質も自然と上がっていく体験を、一緒に味わっていきましょう!
—
そもそも、Go言語ランタイムとGitHub Actionsの関係って?
まずは、私たちがこれから扱うツールの役割を整理しておきましょう。
1. Go言語ランタイム
Goは、書いたコードをコンパイルして1つのファイル(バイナリ)にするだけで、他の面倒なランタイムのインストールなしでどこでも高速に動くのが特徴です。そのため、クラウド上のサーバーでも、純粋に「Goの環境さえあれば」すぐに動かすことができます。
2. GitHub Actions
GitHubが提供する最強の自動化機能です。「GitHubにコードがプッシュされたら」「プルリクエストが作られたら」といったタイミングをトリガー(きっかけ)にして、クラウド上の仮想マシン上で様々な作業(テストやビルドなど)を自動実行してくれます。
この2つを組み合わせることで、「自分のPCでは動いたのに、本番環境や他の人のPCでは動かない」という悲劇を完全に防ぐことができるのです。
—
今回作るCI/CDパイプラインの全体像
これから私たちが構築するのは、次のようなフローです。
1. Test(テストの自動実行): コードにバグがないか、自動でテストを走らせます。
2. Lint(静的解析): `golangci-lint`という超優秀なツールを使い、書き方に無駄や危うい箇所がないかを厳しくチェックします。
3. Build & Release(自動ビルドとリリース): 「v」のようなタグ(例: `v1.0.0`)をつけてGitHubにプッシュした時だけ、マルチプラットフォーム(Windows, macOS, Linux)向けの実行ファイルを自動で作成し、GitHubのリリース画面に公開します。
さらに、「キャッシュの活用」というプロの技も組み込みます。これによって、2回目以降のビルド時間が劇的に短縮されます。
—
ステップ1:動作確認用のGoプロジェクトを準備する
まずは、ローカル環境でシンプルなGoのプロジェクトを作り、GitHub Actionsで動かすための土台を整えましょう。
任意のディレクトリで以下のコマンドを実行してください。
プロジェクト用のディレクトリを作成して移動
mkdir go-ci-demo
cd go-ci-demo
Goモジュールの初期化
go mod init github.com/your-username/go-ci-demo
(※ `your-username` の部分はご自身のGitHubアカウント名に書き換えてください)
丁寧な「Hello World」とテストを書く
ただ文字を表示するだけでなく、せっかくなので簡単な足し算の関数と、それに対するテストコードも一緒に作ってみましょう。
まずは `main.go` を作成します。
// main.go
package main
import “fmt”
// Add は2つの整数を足し合わせるシンプルな関数です
func Add(a, b int) int {
return a + b
}
func main() {
result := Add(2, 3)
fmt.Printf(“Hello, Go CI/CD! 2 + 3 = %d\n”, result)
}
続いて、この関数が正しく動くことを保証するためのテストコード `main_test.go` を作成します。
// main_test.go
package main
import “testing”
// TestAdd は Add関数の動作を検証する単体テストです
func TestAdd(t testing.T) {
sum := Add(2, 3)
expected := 5
if sum != expected {
t.Errorf(“expected %d, got %d”, expected, sum)
}
}
ローカルでテストが通ることを確認しておきましょう。
go test -v ./…
`PASS: TestAdd` と表示されれば成功です!ここまでが基礎の土台となります。
—
ステップ2:GitHub Actionsのワークフローを書く
ここからが本番です。GitHub Actionsの設定ファイルを作成します。
プロジェクトのルートディレクトリに `.github/workflows/ci.yml` というファイルを作成してください。
このファイルが、GitHub上のロボットに対する「指示書」になります。
.github/workflows/ci.yml
name: Go CI/CD Pipeline
1. ワークフローを起動するトリガーの設定
on:
push:
branches: [ “main” ] # mainブランチにプッシュされた時
tags: [‘v’] # または「v」で始まるタグがプッシュされた時
pull_request:
branches: [ “main” ] # mainブランチ宛てのプルリクエストが作成された時
jobs:
# 2. テストと静的解析を行うジョブ
test-and-lint:
name: Test and Lint
runs-on: ubuntu-latest # 最新のUbuntu環境で実行
steps:
# リポジトリのコードを仮想マシンにチェックアウト(ダウンロード)
- name: Checkout code
uses: actions/checkout@v4
# Go言語ランタイムのセットアップ
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: ‘1.22’ # 使用するGoのバージョンを指定
cache-dependency-path: ‘./go.sum’ # キャッシュのキー判定に使うファイル
# 【超重要】Goのビルドキャッシュとモジュールキャッシュを有効化
# これにより、依存関係のダウンロードがスキップされ、ビルド時間が数秒に短縮されます
- name: Set up Go cache
uses: actions/cache@v4
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${:hashFiles(‘/go.sum’)}
restore-keys: |
${{ runner.os }}-go-
# 単体テストの実行(-vで詳細表示、-raceでデータ競合を検出)
- name: Run tests
run: go test -v -race ./…
# golangci-lint(静的解析ツール)を実行してコードの不備をチェック
- name: Run golangci-lint
uses: golangci/golangci-lint-action@v6
with:
version: v1.59.0
# 3. リリース用のバイナリをビルドするジョブ(タグプッシュ時のみ実行)
release:
name: Release Binary
needs: test-and-lint # テストとリントが成功した時のみ実行される
if: startsWith(github.ref, ‘refs/tags/v’) # タグがプッシュされた場合のみ
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: ‘1.22’
# Linux向けにバイナリをビルド
- name: Build Binary for Linux
run: |
mkdir -p build
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -v -o build/go-ci-demo-linux-amd64 .
# macOS向けにバイナリをビルド
- name: Build Binary for macOS
run: |
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -v -o build/go-ci-demo-darwin-amd64 .
# 作成したバイナリをGitHub Releasesに自動でアップロード
- name: Release to GitHub
uses: softprops/action-gh-release@v2
with:
files: build/
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
この設定の特に優れたポイント(先輩エンジニアの知見)
- `actions/cache` による圧倒的な高速化
Goは依存関係の解決やコンパイルに少し時間がかかります。キャッシュ機構を入れることで、2回目以降のビルドで「前回から変わっていない部分」を完全にスキップし、CIの実行時間を劇的に短縮(コスト削減&ストレスフリー)しています。
- `needs: test-and-lint` による安全性の担保
リリース(ビルド)のジョブは、必ず「テストと静的解析が100%成功した後」にしか動きません。バグのあるコードや汚いコードが誤ってリリースされる事故を、自動で未然に防ぎます。
- クロスコンパイル(`GOOS`, `GOARCH`)
Linux環境(Ubuntu)で動いているGitHub Actions上で、コマンドを一発叩くだけでmacOS向けのバイナリまで同時に生成しています。これがGoのクロスコンパイルの真骨頂です。
—
ステップ3:実際にGitHub上で動かしてみよう!
作成したファイルをGitHubにプッシュして、実際にこのパイプラインが動くところを見てみましょう。
Gitの初期化とファイル追加
git init
git add .
git commit -m “feat: 初めてのGo CI/CDパイプライン構築”
ご自身のGitHubリポジトリと紐付けてプッシュ
git branch -M main
git remote add origin https://github.com/your-username/go-ci-demo.git
git push -u origin main
1. CI(テストとリント)の確認
GitHubのリポジトリページを開き、「Actions」タブをクリックしてみてください。
「Go CI/CD Pipeline」というワークフローが自動で走り出し、緑色のチェックマーク(✅)がつけば大成功です!クラウド上であなたの書いたテストがパスし、静的解析もクリアしたことが視覚的にわかります。
2. CD(自動リリース)の確認
次に、実際にバイナリをリリースするフローを試してみましょう。ターミナルでタグを作成してプッシュします。
バージョンタグを付与
git tag v1.0.0
タグをGitHubへプッシュ
git push origin v1.0.0
再びGitHubの「Actions」タブを見てみてください。今度は `Test and Lint` が成功した後に、自動的に `Release Binary` のジョブが走るはずです。
それが完了したら、リポジトリのトップページ右側にある 「Releases」 を見てみてください。
`v1.0.0` というタグとともに、Linux向けとmacOS向けのコンパイル済みバイナリが綺麗に添付されているはずです!
—
おわりに
お疲れ様でした!
これで、あなたのGoプロジェクトには「世界中どこからコードをプッシュしても、自動で品質が担保され、ボタン一つで製品として出荷できる」という、プロ顔負けの強力な自動化基盤が整いました。
最初は難しく感じたかもしれませんが、設定ファイルを一度作ってしまえば、今後はコードを書くことに集中するだけで、面倒な作業はすべてGitHub上のロボットが裏で引き受けてくれます。
これをマスターしたあなたなら、毎日のコーディングがぐっと楽しく、そして自信に満ちたものになるはずです。
ぜひ、あなたの次のGoプロジェクトでも試してみてくださいね!