【入門編】GitHub Actionsで自動化するGo言語のCI/CDパイプライン構築術 – 実行環境・ランタイム・コンパイラ生産性向上バイブル

こんにちは!日々の開発、本当にお疲れ様です。
新しい言語やツールに触れるとき、「自分の手元だけでなく、クラウド上でも正しく動くか?」を確認する自動化の仕組みがあると、開発のスピードと安心感が何倍にも跳ね上がりますよね。

今回は、プログラミング言語「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プロジェクトでも試してみてくださいね!

タイトルとURLをコピーしました