バラバラだったコードを一か所にまとめた話

なかま活動

お客さんが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と二人三脚で、少しずつ設計を磨いている。

コメント

タイトルとURLをコピーしました