開発の足回りi-Willink
お客さんごとの設定値をコードに入れない
サーバーの場所や端末ごとに違う値をスクリプトに直接書くと、端末を入れ替えたとたんに動かなくなります。環境ごとの値を別ファイルに分け、見本だけをリポジトリに残す。私たちの決まりと、値の出どころの決め方を書きます。
お客さんの環境でしか正しくない値は、スクリプトの本体に書かず、別のファイルに分けます。そのファイルはリポジトリの管理から外し、値の入っていない見本だけを残します。本物の値をどこから取るかも、手順として決めておきます。
お客さんのための自動化スクリプトには、ほぼ必ず「その環境でしか正しくない値」が出てきます。共有フォルダの場所、出力先、端末ごとに違うドライブの文字、担当者の名前を含む保存先などです。
こうした値を本体に直接書くと、その場では動きます。困るのは後からです。この記事では、私たちがお客さんの自動化で毎回使っている、設定の分け方を紹介します。
この記事の要点
- 1環境ごとの値を本体に直接書くと、端末の入れ替えやフォルダの変更で必ず動かなくなる
- 2環境ごとの値は config.local のような別ファイルに集め、本体はそれを読むだけにする
- 3実際の値のファイルは .gitignore で管理から外し、値の入っていない見本(example)だけを残す
- 4本物の値の出どころ(動いている端末か、別に保管した控えか)を決めておく
直接書くと、後から必ず詰まる
端末を入れ替えた、フォルダの構成が変わった、別の担当者の環境で動かしたい。そのたびに値が合わなくなって止まり、本体を書き換えるたびに「どこを変えたか」が分からなくなっていきます。
本体を直接書き換える直し方は、1回ならすぐ済みます。けれども繰り返すうちに、どの端末の本体がどの値になっているのか、誰も把握できなくなります。新しい版を配るときも、端末ごとの値を手で戻す作業が毎回発生します。
お客さんの仕事では、納めたあとのこうした小さな詰まりが積み重なって、信頼を少しずつ削ります。
環境ごとの値だけを、別ファイルに集める
環境ごとに変わる値を config.local という別ファイルに集め、本体ではそれを読み込むだけにします。ファイルが無ければ、分かるエラーを出して止まります。
| ファイル | 中身 | リポジトリに入れるか |
|---|---|---|
| 本体(例: sync.ps1) | 処理の中身。環境ごとの値は書かない | 入れる |
| config.local | その端末での本物の値 | 入れない(.gitignore に書く) |
| config.local.example | 項目の一覧と意味。値は空か見本 | 入れる |
新しい端末で使うときは、example を config.local という名前で複製し、その環境の値を埋めるだけです。「何を設定すればよいか」がファイルとして残るので、口頭の引き継ぎに頼らずに済みます。
本物の値は管理から外し、見本だけを残す
config.local は .gitignore に書いて、Git の管理から外します。これで本物のサーバーの場所や端末ごとの値が、リポジトリにも履歴にも残りません。
「本物の値は外し、見本は残す」は、ウェブの開発でも標準的なやり方です。たとえば Next.js の公式ドキュメントは、環境ごとの値を .env.local のようなファイルに置き、Git の管理から外すよう案内しています。名前や仕組みは違っても、環境ごとに変わる値をコードと分けるという考え方は同じです。
一度リポジトリに入れてしまった値は、後からファイルを消しても履歴に残ります。最初から外しておくことが大事です。
本物の値の出どころを決めておく
リポジトリに入れないと決めたら、次は「本物の値はどこから取るか」を決めます。私たちは、動いている端末の設定ファイルか、別に保管した控えのどちらかから取る、と手順で固定しています。
お客さんの現場では、クラウドの秘密の管理サービスをいつでも使えるとは限りません。そこで、すでに動いている端末の config.local を参照するか、別に保管してある控えから値を取り出す、という段取りにしています。
値の出どころが決まっていれば、新しい端末を立ち上げる手順が1本道になります。誰かの記憶やチャットの履歴を掘り返す必要がなくなり、引き継ぎが特定の人に頼らなくなります。ここまで決めて、はじめて設定の分離が運用として回り始めます。
実際にこの分け方を使った例は、「手でやっていたフォルダのコピーを自動にする」に書きました。
よくある質問
config.local と config.local.example は何が違いますか?
config.local はその端末での本物の値を入れるファイルで、リポジトリには入れません。example は項目の一覧と意味だけを書いた見本で、リポジトリに入れて手順書の代わりにします。
一度リポジトリに入れた値は、ファイルを消せば消えますか?
消えません。過去の履歴に残ります。最初から .gitignore で管理から外しておくことが大事です。パスワードなどを入れてしまった場合は、その値自体を変えてください。
本物の値は、どこに保管すればよいですか?
秘密の管理サービスが使えるならそれが確実です。使えない現場では、動いている端末の設定ファイルか、別に保管した控えのどちらから取るかを手順として決めておきます。
参考・出典
- Environment Variables(Next.js 公式ドキュメント)(.env.local を Git の管理から外す)