こんにちは!はらちゃん(@harachan)です!
AIを使ったコーディングが身近になってきた昨今、開発のスタイルも大きく変化してきていますね。 今回は、AIを活用した並列開発で生じる問題と、それを解決するために作成したOSSツールについて紹介したいと思います。
はじめに
AIエージェントを複数使った並列開発が一般的になってきている中で、さまざまな新しい課題に直面するようになりました。 特にDocker ComposeやGitHub Discussionなど、AI時代の開発スタイルに合わせた環境整備が重要になってきています。
今回は、実際に開発中に遭遇した問題と、その解決策として作成した2つのOSSツールについてお話ししていきたいと思います。
AIを使ったコーディングの変化と新しい課題
1. AI agentを複数使用した並列開発の一般化
AI agentを複数使って並列で開発を進める手法が一般的になってきました。 これにより開発効率は大幅に向上したのですが、同時に新たな問題も発生しています。
Docker Composeでのポート衝突問題
git worktree
やDockerを使った並列開発において、課題となるポイントの一つがポート衝突です。
Docker Composeでホストとのポートバインディングを設定している場合、複数の開発環境を同時に立ち上げようとするとポートが衝突して環境が立たないという問題が発生します。
従来の解決法とその課題。
例えば、以下のようなdocker-compose.yml
があったとします:
services:
web:
build: .
ports:
- "3000:3000"
この設定で複数のプロジェクトを同時に開発しようとすると、ポート3000が競合してしまい、2つ目以降の環境が起動できません。
これまでは以下のような方法での対応が考えられると思います:
方法1: 各環境でcompose.ymlを手動書き換え
- 並列開発のそれぞれの環境でcompose.ymlの書き換えを行い、手動で衝突しないようにポート番号を調整
- メリット: シンプルで理解しやすく、既存の設定をベースに柔軟に調整できる
- デメリット: 手間がかかる上、余計な変更をコミットしてしまう懸念がある
方法2: 並列開発専用のcompose.ymlを準備
- ポートバインディングをしない並列開発専用のcompose.ymlファイルを別途用意
- メリット: 元のファイルを汚さず、並列開発用の設定を明確に分離できる
- デメリット: 管理するymlファイルが増え、メンテナンスが煩雑になる
どちらの方法も一長一短があり、特にAI agentを使った自動化された並列開発では、人間の手動介入が必要な部分がボトルネックとなっていました
2. AIにコンテキスト情報を効率的に読み込ませる需要
AIを使ってコーディングを行う際、GitHub IssueやPR、Notionなどからコンテキストや情報を読み込ませることが重要になってきました。
情報取得の現状
- GitHub IssueやPR:
gh
コマンドで情報の取得が簡単にできる - Notion: MCP(Model Context Protocol)で取得できる(公式のNotion MCPが利用可能)
- GitHub Discussion:
gh
コマンドでは取得できない
この中で課題となるポイントの一つが、GitHub Discussionの情報取得です。私たちのチームでは、GitHub Discussionで技術的な議論を活発に行い、重要な設計決定やアーキテクチャの選択理由を経緯も含め記録しています。これにより、後から「なぜこの実装になったのか」「どんな議論があったのか」をたどれるようにしているのですが、GitHub CLIのgh
コマンドではDiscussionの情報を取得する機能が提供されていないため、AIにこれらの重要なコンテキスト情報を読み込ませることが困難でした。
解決策:2つのOSSツールの開発
上記の問題を解決するために、以下の2つのOSSツールを開発しました。
gopose:Docker Composeポート衝突解決ツール
https://github.com/harakeishi/gopose
gopose
は、Docker Composeのポート衝突を自動的に検出して解決するツールです。
主な機能
- 非破壊的な解決: 元の
docker-compose.yml
を変更せず、docker-compose.override.yml
を生成して衝突を回避 - 自動ポート衝突検出: システムで使用中のポートを検出し、Docker Composeの設定と照らし合わせて衝突を特定
- 自動ポート割り当て: 空きポートを自動で割り当て、最適化された解決案を提供
- 並列処理による高速スキャン: ポートスキャンを並列処理で高速化
- 構造化ログ出力: 豊富なログ出力でデバッグが容易
- 柔軟なオプション: ポート範囲指定、特定composeファイル指定、ドライラン実行など
使い方
# インストール
go install github.com/harakeishi/gopose@latest
# 基本的な使用
cd your-project
gopose up
# ポート範囲を指定して実行
gopose up --port-range 9000-9999
# 特定のcomposeファイルを指定
gopose up -f custom-compose.yml
# ドライランで実行内容を確認
gopose up --dry-run
実行すると、以下のような流れで自動的に問題を解決してくれます:
gopose up
ポート衝突解決を開始
Docker Composeファイル検出開始
Docker Composeファイル発見
Docker Composeファイル検出完了
Docker Composeファイルを自動検出
Docker Composeファイル解析開始
Docker Composeバージョンが指定されていません
Docker Composeファイル解析完了
ポート衝突検出開始
netstatを使用してポートスキャンを開始
ポートスキャン完了
システムポート衝突検出
ポート衝突検出完了
ポート衝突検出完了
ポート衝突解決開始
netstatを使用してポートスキャンを開始
ポートスキャン完了
範囲内ポートフィルタリング完了
ポート割り当て成功
解決案最適化開始
解決案最適化完了
ポート衝突解決完了
ポート解決
Override生成開始
ポートマッピング更新
Override生成完了
Override検証開始
Overrideのバージョンが指定されていませんが、Docker Composeの最新バージョンでは非推奨のため許可します
Override検証完了
Overrideファイル書き込み開始
Overrideファイル書き込み完了
Override.ymlファイルが生成されました
既存のコンテナを停止してからDocker Composeを起動
[+] Running 2/2
✔ Container gopose-web-1 Removed 0.0s
✔ Network gopose_default Removed 0.2s
Docker Composeを起動
Docker Composeを実行
[+] Running 2/2
✔ Network gopose_default Created 0.0s
✔ Container gopose-web-1 Created 0.0s
Attaching to web-1
特にマイクロサービスを複数立ち上げる場合、ポートの重複を毎回手動で修正するのは骨が折れる作業ですが、goposeなら差分用のoverride.ymlを自動生成してくれるので、元のcomposeファイルを汚すことなく解決できます。
これにより、複数のAI agentが並列で開発環境を構築する際も、ポート衝突を気にすることなく作業を進められるようになりました。
gh-discussion:GitHub DiscussionのCLI管理ツール
https://github.com/harakeishi/gh-discussion
GitHub CLIの拡張機能として、GitHub DiscussionをCLIから管理できるツールを開発しました。
主な機能
- Discussion一覧表示: リポジトリ内のDiscussion一覧を表形式で表示
- 詳細表示: Discussionの内容とコメントを詳細表示
- ネストコメント対応: 階層化されたコメントも適切に表示
インストールと使用方法
# GitHub CLI拡張としてインストール
gh extension install harakeishi/gh-discussion
# Discussion一覧を表示
gh discussion list
# 特定のDiscussionを詳細表示
gh discussion view 13
# コメントも含めて表示
gh discussion view 13 -c
出力例
NUMBER TITLE AUTHOR CATEGORY ANSWERED COMMENTS UPDATED
───────────────────────────────────────────────────────────────────────────────────────────────────
13 test1 harakeishi Q&A Yes 2 28 minutes ago
詳細表示では、Discussionのメタデータからコメントまで、すべての情報を確認できます:
Discussion #13
test1
Author: harakeishi
Category: Q&A
Repository: harakeishi/gh-discussion
Created: 29 minutes ago
Updated: 28 minutes ago
Answered: Yes
Comments: 2
URL: https://github.com/harakeishi/gh-discussion/discussions/13
─────────────────────────────────────────────────────────────────────────
test1
─────────────────────────────────────────────────────────────────────────
Comments
Comment #1
harakeishi • 28 minutes ago
test1-comment1
┌─
Comment #1 Answer
harakeishi • 28 minutes ago
test1-comment1-child1
Comment #2
harakeishi • 28 minutes ago
test1-comment2
これにより、AIにGitHub Discussionの情報を効率的に読み込ませることができるようになりました。
AIでの使用について
これらのツールは、特にAIエージェントとの連携を想定して設計しています。
goposeの場合
複数のAIエージェントが並列で開発環境を構築する際、それぞれが独立してポート衝突を解決できるため、人間の介入なしで開発を進められます。
gh-discussionの場合
AIがGitHub Discussionから情報収集を行う際、標準的なCLIインターフェースを通じて情報を取得できるため、自動化スクリプトやAIワークフローに組み込みやすくなっています。
今後の展望
gopose
- Fuzzy Searchによる検索機能の追加
- より柔軟なポート割り当てロジックの実装
- 他のコンテナオーケストレーションツールへの対応
gh-discussion
- 新しいDiscussionの作成機能
- Discussionへのコメント投稿機能
まとめ
AIを使ったコーディングが当たり前になってきた今、従来の開発フローでは想定していなかった新しい課題が生まれています。
今回紹介したgopose
とgh-discussion
は、そうした課題を解決するためのツールです。
特に並列開発やAIとの連携を重視した設計になっているので、同様の課題に直面している方はぜひ試してみてください!
どちらのツールもMITライセンスで公開しているので、バグ報告や機能要望、Pull Requestなど、どんなフィードバックでも大歓迎です。
AIを活用した開発がより効率的になるよう、今後も改善を続けていきたいと思います!
詳しい紹介記事もあります!
今回紹介したツールについて、より詳しい解説記事も公開しています。気になる方はぜひチェックしてみてください!
- gopose: Docker Composeのポート衝突を自動解決するgoposeを作った話 - Zenn
- gh-discussion: GitHub DiscussionをCLIで管理できるgh-discussionを作りました! - Zenn