ローカル開発環境を作ることがめちゃくちゃ多くて(というかジョインしたサービスで整備されていないことが多くて…w)自分が作ったり改善していることが多いのだが、何をやっているのか、どういうことに気をつけているのかを書いてみる。
Dockerによるローカル開発環境構築
開発環境構築ツールは色々あれど、現状ではDockerコンテナでアプリケーションを動かすのが無難な感じはしている。
docker-compose.ymlを作っておきApp/DBサーバーを立ち上げれるようにしておく。 AWSやメールなどはモックサーバー( localstack や Mailpit )を入れておく。
開発環境のDockerfileには各言語のランタイム以外には
- vim
- git
- curl
- procps
- less
あたりは入れるようにしている。日本語化やタイムゾーン設定も忘れずに。
Makeタスクの整理
賛否両論あるが、Makeコマンド・タスクは便利だと思っていて、Makefileは必ず用意している。
- 言語に依存しないのでコンテキストスイッチがかからない
- 構文が簡単で必要十分な機能を備えている
- タスクの依存関係を簡単に記述できる
- 複数コマンド実行を改行区切りで記述できて読みやすい
- 分岐や変数が使える
- 並列実行
- 動くREADMEでコメントも自由に書ける
だいたいこんな感じなものを作っている。
.PHONY: help
help: ## ヘルプ
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z0-9_\/-]+:.*?## / {printf "\033[36m%-15s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)
.PHONY: up
up: ## Dockerコンテナの立ち上げ
docker compose up -d
.PHONY: init
init: ## 初期化
# ...
.PHONY: install
install: ## ライブラリのインストール
docker compose exec web composer install
docker compose exec web npm install
.PHONY: test
test: ## テスト実行
docker compose exec web ./vendor/bin/phpunit
.PHONY: console
console: ## Webのコンテナに入る
docker compose exec -it web /bin/bash
.PHONY: db/console
db/console: ## DBのMySQLのコンソールに入る
docker compose exec -it db /bin/bash -c 'mysql -h {host} -u{user} -p{password} {database}'
.PHONY: logs/web
logs/web: ## Webコンテナのログを表示
docker compose logs -f web
初期構築は make init
だけで済ませれるようにしておくとよいのだが、必要なツールやファイルのダウンロードなどが必要になったりするので、あまりワン・コマンドにこだわらないようにしている。
ただ、開発中にクリーンな初期化をしたいケースもあるため、ツールのインストールやファイルのダウンロードを前提とした自動初期化処理をワン・コマンドでできるようしておくと便利ではある。
具体的には
- 環境変数の設定(.envなど)
- ライブラリのインストール
- DBマイグレーション
- シード実行
あたりをinitで一気に実行するようにしている。
余談: 環境構築に必要なツール
組織や環境に依存するが、だいたい以下のあたりが必須になってきがち。
- Docker
- AWS / Google Cloud へのアクセス権限
- 1pass cli
ローカル開発環境といえどエミュレーターなどすべてローカルで完結させるには厳しかったりするので、必要に応じて実際のクラウド環境やサービスを使うことがある。1pass cliはそのサービスに対するクレデンシャルを取得するためのもので、テンプレートの.envファイルを置き換えたりできて便利。
READMEの整備
上記をまとめたREADMEファイルを作る。今はだいたい生成AIが良い感じに作ってくれたりする。
- アーキテクチャ
- 環境構築に必要なツール・権限
- 環境構築に必要な作業
- 自動テスト
- デプロイ方法
- 各種リンク
- メトリクスのダッシュボード
- エラー管理ツール
- その他wiki
あたりを入れている。
その他
開発用のデータを用意する
シードでも良いのだがそれなりに揃ったデータがほしいケースもあるので、
- 開発環境からデータをダンプしたものを投入する
- 本番環境からマスキングしてダンプしたものを投入する
あたりも必要に応じてできるようにしている。
開発しやすくするためのアプリケーション変更
localstackやモックサービスを使うと、どうしてもアプリケーション側の分岐が必要になるのでそちらも実装していく。 どうしてもモックできないサービスもアプリケーション側で処理を差し替えれるようにしておく(これはDIによる差し替えでもif文の原始的な分岐でもどちらでも良い)
デバッグしやすい環境づくり
開発環境で便利なライブラリは積極的に導入している。 また、クエリログを出すようにしたりログを見やすくしたり、デバッグをしやすくなる仕組みも入れる。