🎄 はじめに
今日から始まるアドベントカレンダー企画
「クリスマスまでに『俺の考えた✝️最強のCMS✝️をつくる』」
2日目は、いちばん重要で、そして地味に心を折る作業——環境構築です。
まずは 「毎日触れる開発環境をストレスなく作る」 を目標に、CodexとClaude Codeに全力で働いてもらった話を書きます。
⚙️ 今日やったこと:Monorepo の初期セットアップ
今回は以下のようなマイクロサービスに分ける性質上、普段の個人開発以上に初期セットアップが複雑でした。
- Frontend(Next.js)
- Auth Service(Go)
- Core API(C#)
- Publisher(Rails)
- Upload(Rails)
- AI Gateway(Rust)
- 監視スタック(Grafana + Prometheus + Loki)
普通にやると、初日で心が折れます。
今回は、下のような機能を備えた最低限動く雛形を作ることを目標に実装しました。
- 全アプリの /ping を叩けること
- 監視スタックが最低限起動していること
- docker composeコマンド一発で環境が起動すること
✍️ Codex に渡したプロンプト
ふたつの点を意識してプロンプトを書きました。
- アーキテクチャーを考えていたChatGPTと連携して、構成を正確に渡す
- もうひとつは、小さな雛形から始める
Codex に渡したプロンプト(抜粋):
Monorepo を作りたいので、以下のサービス構成の
ディレクトリと初期ファイルを生成してください。
- frontend (Next.js)
- auth (Go)
- core (C#)
- publisher (Rails)
- upload (Rails)
- ai-gateway (Rust)
- infra (docker, grafana, prometheus)
最低限動作する Dockerfile と docker-compose.yml も生成してください。
このプロンプトで作られたものをベースに、まずはCIで docker compose buildが通ることと、各サービスのコンテナが/pingのエンドポイントを叩いたときに返せる状態を目指しました。
🐳 難敵 Docker Build
CI上で試してみたところ、案の定Docker Buildの段階で失敗していました。
ログを見る限りどうやら、RustのBuildで失敗したようです。
--------------------
10 | # docker layer can be reused when only Rust files change.
11 | COPY Cargo.toml Cargo.lock ./
12 | >>> RUN cargo fetch --locke
13 |
14 | COPY src ./src
--------------------
target ai-gateway: failed to solve: process "/bin/sh -c cargo fetch --locked" did not complete successfully: exit code: 101
0.659 error: failed to parse manifest at `/src/Cargo.toml`
0.659
0.659 Caused by:
0.659 no targets specified in the manifest
0.659 either src/lib.rs, src/main.rs, a [lib] section, or [[bin]] section must be present
みた感じはdocker-buildの段階の初歩的なerrorなので、このエラーを明示的にCodexに教えてあげればうまくいきそうですね…
なんてことはなく、docker-build をするところで詰まってしまいました。おそらく、試行錯誤した結果、CIがうまく動いているかみたいな部分に関しては試行錯誤をすることがClaude Codeに比べてCodex(web版)は苦手なのかなという感触がありました。
🐝ClaudeCode debugの際意識したこと
一番意識したことは、再現性を高めるためにmakefileへ書かせる方針を基本としたことです。これによって、makefileへの記載 = 利用実績のあるコマンドの状態に持ち込むことができコンテキストをわざわざ伝えなくても良い状態にすることができたと思っています。
また、PRのCI結果ベースで判断したかったためPRのエラーメッセージやPRのURLをコンテキストに含めてCI結果をソースに判断させたことで確実に実行まで持ってきてくれました。
プロンプト面ではあまり工夫できなかったので claude-code-logを活用し、このアドカレを通してプロンプトを洗練できればなと思います。
📦 今の状態(Day2終了時点)
- Monorepo の骨組みが完成
- 全サービスの Dockerfile が仮でも揃った
-
docker compose upがエラーなく実行できる - Grafana / Prometheus / Loki が起動し、後でメトリクスを繋げる準備OK
- 各サービスの
/pingを叩ける
実装はまだ何も始まっていませんが、この状態に一気に持ってこれたのは正直快挙。
📝 今日の気づき
- Codex には「全部理解してもらう」より「命令を細かく切る」ほうが伝わる
- scaffolding は AI に任せたほうが早い
- プロンプトを「claude-code-log」等を活用してPCDAを回してより効率化させる
🎅 明日は…
Day3: タスク分けしてAIで分業開発 〜仕様をChatGPT・実装をClaudeCode・チェックをCodexで〜
システムを1PR に棚卸しするため、仕様書・実装・検品を別なAIに任せてみた話を書きます。PCがなくても仕様書や簡単な実装を勧められるようにChatGPT・Codexをがっつりと開発はClaudeCodeに補助をもらいながら分業しているDay3時点のAIの使い分けを紹介します。