お客さんが2社になった瞬間、「コードをどう管理するか」という問題が生まれた。
🤔 お客さんごとに別リポジトリにしたら、あっという間に詰む
タイムカードのWebアプリを複数のお客さんに使ってもらうことになった。最初はシンプルに「お客さんごとにリポジトリ(コードの保管庫)を分ける」という作戦で行こうとしていた。でもよく考えると、これはマズい。バグを1つ直したら全部のリポジトリに同じ修正を入れなきゃいけない。新機能を追加したら全部にコピーしなきゃいけない。3社、4社と増えたら……想像するだけで気が重くなる。
🗂️ まず「何が違うのか」を整理してみた
お客さんによって違う部分を書き出してみると、意外とたくさんあった。
- サーバー環境の違い:ロリポップ、XREA、開発用XAMPP(自分のPC)——DB接続先やパスの書き方がそれぞれ違う
- 機能の違い:管理者画面あり/なし、CSV出力あり/なし、残業計算あり/なし
- UIの違い:会社名・ロゴ、ボタンの色、画面に表示する項目
- ユーザーデータの違い:従業員リストの形式、ユーザーIDの採番ルール
- 運用ルールの違い:打刻可能な時間帯、休憩時間の自動計算方式、締め日
「えっ、こんなにあるの」と自分でも少し驚いた。でもよく考えれば、会社ごとに勤怠ルールが違うのは当たり前の話だ。
⚙️ 解決策:違いはconfig.phpに全部まとめる
アプリ本体のコードは1つのリポジトリで管理して、お客さんごとの「違い」だけをconfig.phpという設定ファイルに切り出す——これが今回採用した設計だ。フォルダ構成はこんな感じ:
_clients/お客さんA/config.php(A社専用の設定一式)_clients/お客さんB/config.php(B社専用の設定一式)_server_template/ロリポップ/(サーバー別のデプロイ設定テンプレート)_server_template/XREA/(同上)
アプリ本体は「config.phpを読み込んで動く」という作りにしておく。デプロイ(サーバーへの設置)のときに、そのお客さん用のconfig.phpを置いてあげれば、自動的にそのお客さん仕様のアプリになる。スイッチ一つで全部が切り替わる、というイメージだ。
🏷️ でも、デプロイだけは慎重に——Gitタグで「固定」する
ここで一つ落とし穴がある。ソースが共通だからこそ、デプロイは超慎重にやらないと致命的な影響が出る。あるお客様用の機能追加やバグフィックスが、他のお客様のシステムでデグレードを起こしていたら……複数のお客さんの業務が同時に止まりかねない。
そこで使うのがGitの「タグ」という仕組みだ。タグとは、コードの特定の時点に名前をつけて固定するもの。「この状態がv1.2の正式版」「このコミットがA社向けリリース済み」というベースライン(基準点)を明示的に打っておける。
たとえばこんな運用になる:
- お客さんAには
v1.2タグのソースをデプロイ済み - お客さんBには
v1.3タグのソースをデプロイ済み(新機能あり) - 開発中の最新コードは
develブランチで進行中
「スイッチ一つで切り替わる」からこそ、どのスイッチ設定のどのバージョンを誰に出したかをちゃんと管理する必要がある。config.phpで差分を吸収しつつ、Gitタグでデプロイ済みの状態を固定する——この2つがセットになって初めて、安全に複数のお客さんへ提供できる体制ができる。
💡 気づいたこと
「共通化してスイッチ一つ」は開発効率の話で、「タグで固定してデプロイ」はリリース管理の話だ。この2つは車の両輪で、片方だけではうまく回らない。一人でやっているからこそ、こういう仕組みを最初から作っておかないと、後で自分が困るのも自分なのだ。
コードの整理は、頭の整理でもある。今日もAIと二人三脚で、少しずつ設計を磨いている。

コメント