🦔

Go × Github Copilot Agent の開発環境とツールセット紹介

に公開

このエントリでは、「どんな用途に、どのツールを使っているか」 にフォーカスして、私の Go 開発環境まわりを用途別にざっと紹介します。

リポジトリ: https://github.com/naka-sei/tsudzuri

  • 言語・ランタイム
  • ローカル開発(ホットリロード / Docker / Make)
  • DB / ORM
  • Observability(ログ・トレース)
  • API 定義 / コード生成
  • フォーマット / Lint
  • DI / テスト補助
  • CI(GitHub Actions)
  • VS Code の拡張と設定例
  • MCP / Serena

言語・ランタイム

Go

  • Go
    • 用途: バックエンド API の実装全般
    • 特徴: 単一バイナリでデプロイしやすく、標準ライブラリだけでも Web/API 開発に必要な機能が揃っている。
    • 公式: https://go.dev/

ローカル開発・ホットリロード

air

  • air
    • 用途: Go アプリのホットリロード(make dev で利用)
    • 特徴: ファイル変更を監視して自動ビルド・再起動してくれるので、API を触りながら素早く動作確認ができる。
    • 公式: https://github.com/air-verse/air

Docker / Docker Compose

  • Docker

    • 用途: アプリ本体のコンテナイメージをビルドし、ローカルでもコンテナで実行
    • 特徴: 本番用イメージをそのままローカルでも使えるので、「本番だけ動かない」を減らしやすい。
    • 公式: https://www.docker.com/
  • Docker Compose

    • 用途: API / DB / Swagger UI / テスト用 DB など複数コンテナの起動
    • 特徴: docker-compose.yaml 一つで「API + Postgres + Swagger UI」をワンコマンドで立ち上げられる。
    • 公式: https://docs.docker.com/compose/

Make

  • GNU Make
    • 用途: ローカル開発タスクのラッパー(make dev, make up, make test, make lint, make generate など)
    • 特徴: 複雑なコマンド列を Makefile に隠しておき、開発者は短いコマンドだけ覚えれば良いようにする。
    • 公式: https://www.gnu.org/software/make/

DB・ORM・マイグレーション

PostgreSQL

  • PostgreSQL
    • 用途: 永続化層のメイン RDB(本番・ローカル・テスト)
    • 特徴: OSS でメジャー。JSONB や拡張機能も多く、小さなサービスから大規模まで対応しやすい。
    • 公式: https://www.postgresql.org/

ローカルでは Docker Compose で Postgres コンテナを立ち上げ、テスト用には testdb サービスを用意しています。make test でテスト用 DB が自動起動し、pg_isready で起動待ち合わせしてから go test ./... を実行する構成です。

ent

  • ent
    • 用途: ORM / スキーマ定義(infrastructure/db/ent 以下)
    • 特徴: Go のコードでスキーマを書き、型安全なクエリやマイグレーションコードを生成できる。クエリも Go のコードとして完結するので、補完が効きやすい。
    • 公式: https://entgo.io/

スキーマ定義は ent に寄せつつ、ドメイン層ではリポジトリインタフェースだけを見るようにして、ORM への依存を infrastructure に閉じ込めています。


Observability(ログ・トレース)

OpenTelemetry

  • OpenTelemetry (otel)
    • 用途: 分散トレーシング・メトリクスの収集(cmd/api/otel.go, pkg/trace/ など)
    • 特徴: ベンダーロックインを避けつつトレース・メトリクスを集約できる標準的な仕組み。gRPC / HTTP 用のミドルウェアも揃っていて組み込みやすい。
    • 公式: https://opentelemetry.io/

zap / zapdriver

  • zap

    • 用途: 構造化ログの出力(pkg/log/
    • 特徴: 高速な構造化ロガー。JSON 形式でログを出して、後段のログ基盤で扱いやすくする。
    • 公式: https://github.com/uber-go/zap
  • zapdriver

    • 用途: GCP 系のログスタックと相性の良いフィールド(severity / trace など)を簡単に付与
    • 特徴: ログとトレースを紐づけるためのフィールドをきれいに整えてくれる。
    • 公式: https://github.com/blendle/zapdriver

API 定義・コード生成

Protocol Buffers / gRPC / gRPC-Gateway

  • Protocol Buffers (protobuf)

    • 用途: API のスキーマ定義(api/protobuf/
    • 特徴: 1 つのスキーマから gRPC / REST / OpenAPI など複数のインターフェースを生成できる。
    • 公式: https://protobuf.dev/
  • gRPC

    • 用途: バックエンドの RPC プロトコル
    • 特徴: HTTP/2 ベースで高速・型安全な通信を行える。サービス間通信にもそのまま流用しやすい。
    • 公式: https://grpc.io/
  • gRPC-Gateway

    • 用途: gRPC サービスから HTTP/JSON エンドポイントを自動生成
    • 特徴: 同じ proto から gRPC と REST を両対応させるためのブリッジとして使える。
    • 公式: https://github.com/grpc-ecosystem/grpc-gateway

buf

  • buf
    • 用途: protobuf の管理・コード生成(api/protobuf/buf.yaml, buf.gen.yaml
    • 特徴: 依存管理 / Lint / 生成をまとめて扱える Proto 用ツールチェーン。buf generate ひとつで gRPC / gRPC-Gateway / OpenAPI などを生成可能。
    • 公式: https://buf.build/

私の場合は make generate/protobuf/go から buf を呼び出し、proto の更新からコード生成までをまとめて回しています。


フォーマット・Lint・依存管理

gofumpt

  • gofumpt
    • 用途: Go コードの整形(make fmt
    • 特徴: gofmt をベースにした、より厳しめのフォーマッタ。プロジェクト全体で一貫したスタイルを維持しやすくなる。
    • 公式: https://github.com/mvdan/gofumpt

golangci-lint

  • golangci-lint
    • 用途: 静的解析・スタイルチェック(make lint や CI で実行)
    • 特徴: たくさんの Linters をまとめて走らせられる。CI での「最低限の品質ライン」を定義しやすい。
    • 公式: https://golangci-lint.run/

go modules / vendoring

  • go modules / go mod / vendoring
    • 用途: 依存関係管理(go.mod, go.sum, vendor/
    • 特徴: Go 標準の依存管理。go mod tidy や vendoring で再現性のあるビルドを目指す。
    • 公式: https://go.dev/ref/mod

make depsgo mod tidy / go mod verify / go mod vendor をまとめて実行し、依存関係の整合性を保つようにしています。


DI・テスト補助

wire

  • wire
    • 用途: 依存性注入のコード生成(cmd/api/wire.go
    • 特徴: コンパイル時 DI。Go のコードとして依存グラフを生成するので、ランタイムのリフレクションを避けつつ DI を活用できる。
    • 公式: https://github.com/google/wire

go-cmp / mock

  • go-cmp

    • 用途: テストでの構造体比較・差分表示
    • 特徴: 「どこが違うか」を見やすく表示してくれるので、テスト失敗時の原因特定がしやすい。
    • 公式: https://github.com/google/go-cmp
  • go.uber.org/mock

    • 用途: モック生成・テストダブル
    • 特徴: インターフェースからモックを自動生成し、ユースケースやドメインのテストを組みやすくする。
    • 公式: https://github.com/uber-go/mock

CI(GitHub Actions)

GitHub Actions

  • GitHub Actions
    • 用途: Lint / Test を自動で実行する CI
    • 特徴: .github/workflows に YAML を書くだけで、ブランチやタグに応じたパイプラインを柔軟に組める。
    • 公式: https://docs.github.com/actions

私の場合は、feature/** ブランチへの push をトリガーに:

  • make install-tools
  • make lint
  • make test

を自動で回すワークフローを用意しています。


VS Code の開発環境

私はプライベートでは VS Code を前提に開発しており、主に次の拡張を使っています。

  • Go (golang.go)
  • GitHub Copilot
  • GitHub Copilot Chat
  • Prettier SQL VSCode

VS Code 設定例 (settings.json)

{
    "terminal.integrated.suggest.enabled": true,
    "files.autoSave": "afterDelay",
    // Format on Save (保存時に整形) を有効化
    "editor.formatOnSave": true,
    "editor.insertSpaces": false,
    "editor.codeActionsOnSave": {
        "source.organizeImports": "explicit"
    },
    "go.lintOnSave": "package", // ファイル保存時にパッケージ全体をLintする
    "go.lintTool": "golangci-lint", // 使用するLinterツールを指定
    "go.useLanguageServer": true, // goplsを使用
    "go.formatTool": "gofumpt", // goplsに整形を任せる
    "go.lintFlags": [
        "--config=${workspaceFolder}/.golangci.yaml",
        "--fast" // 高速モードで実行
    ],
    "gopls": {
        // goplsが提供する一部の機能(静的解析)を無効化し、golangci-lintに任せる
        "analyses": {
            "unusedparams": false,
            "shadow": false
        },
        "completeUnimported": true // インポートされていないパッケージの補完を有効化
    },
    "github.copilot.nextEditSuggestions.enabled": true,
    "go.testEnvFile": "${workspaceFolder}/.env.local",
    "go.toolsEnvVars": {
        // goplsが使用する環境変数を設定
        "GOFLAGS": "-tags=wireinject"
    }
}

MCP / Serena

GitHub Copilot Chat に加えて Model Context Protocol (MCP) を利用し、リポジトリを横断したコードリーディングやリファクタリング支援を行います。

  • Serena (MCP サーバー)
    • 用途: コードベース全体のシンボル検索・参照検索・部分編集などを、Copilot から対話的に行うための MCP サーバー
    • 特徴: 「このユースケースに関連するドメイン・インフラ・テストをまとめて追いたい」といったときに、IDE 内でコードナビゲーションと編集をまとめて依頼できる。

.vscode/mcp.json に Serena の設定を置くことで、VS Code の Copilot Chat から「このプロジェクトを理解した状態の AI エージェント」として使えるようにしています。


まとめ

このエントリでは、私が Go の開発で使っているツールや VS Code の拡張機能を、用途別にざっと紹介しました。

  • 言語は Go、DB は PostgreSQL、ORM は ent
  • ローカル開発は Docker / Docker Compose + Make + air
  • Observability は OpenTelemetry + zap
  • API 定義は protobuf / gRPC / gRPC-Gateway を buf で管理
  • 品質管理は gofumpt / golangci-lint
  • DI / テスト補助に wire / go-cmp / mock
  • エディタは VS Code + Go 拡張 + Copilot + Prettier SQL
  • 裏側で MCP / Serena を使い、Copilot Chat からリポジトリ全体に対する操作を行っている

同じように Go で API を作るとき、「このあたりのツールを組み合わせるとこんな感じになる」というカタログとして使ってもらえたらうれしいです。

Discussion