読者です 読者をやめる 読者になる 読者になる

レガシーな開発環境を少しずつ改善している話

いくつかのチームやメンバーを経由して今度は自分が担当することになった。
言語はphpで、仕様書もドキュメントも当然単体テストも無いプロジェクト。
よくある話であると思う。

もう少し詳しく書くと

  • バージョン管理はsvnでブランチは無くtrunkという概念もない状態。
  • デプロイは更新ファイルを何らかの手段で記録しておき、FTPで転送という状態。
  • 動作確認環境は1つのみという状態。
  • 本番サーバーに何がインストールされているのかは謎という状態。

まぁよくある話であると...ここまで来るとさすがに最近は無い気がする。

現在、アサインされて3ヶ月程になる。
リリースの頻度が高いためなかなか思ったように改善時間が取れない日々が続いたが
1名の増員により少しずつ改善することができ、現在以下の形になっている。

  • 言語はphpで、仕様書もドキュメントも当然単体テストも無い状態。
  • バージョン管理はgit。運用はgit-flow。
  • デプロイはgitから手動でpull。
  • 動作確認環境は各自のローカルマシン上でvagrant+chefを使用。

これだけでもかなり良くなった。
具体的には、
git-flow運用をすることで複数人開発でのバージョン管理の質が上がった。
これにより、各開発者のローカルに存在していた謎の差分ファイルの数々が消え失せた。
デプロイにgitを使用することで機能開発時に変更を加えたファイルを記録しておく必要が無くなった。
これにより、デプロイ時のファイル転送漏れといったヒューマエラーが消え失せた。
vagrantを使用することで、誰かが動作チェック中のファイルを上書きし謎の挙動に悩まされることが無くなった。ファイル変更後の確認が楽になった。

これらの改善を運用しながらどのように行ったかという話。

svnからgitへの移行

1日で完了。丁度メンテナンス日だったためアサインされたその日にやった。
svnの履歴は全て引き継がないことにしたのでリポジトリを移すのは簡単だった。
配信サーバーへログインし、ドキュメントルートでgit initし社内のgitサーバーへpush。
各開発者でpullして完了。ついでに本番DBからデータをダンプし丸っと開発へぶち込んだ。
その上でユーザーデータを全てtruncate。まっさらな本番環境が開発環境上へ構築された。

問題は、〜本番.phpや〜開発.phpというナンセンスな設定ファイルだった。
gitでデプロイを行いたいし設定ファイルもバージョン管理から外したく無かった。
何より開発環境と本番環境でソースが違うことが許せなかった。
これらは全て環境変数によって切り替わるように書き換えた。ここに調査含め半日以上はかかった。
ENVIRONMENTという環境変数でdevelopment, testing, productionという3種類を切り替えられるようにしそれぞれ手元のvagrant、動作確認環境、本番環境とした。

設定ファイルはメンテまでに用意しておき、リポジトリはメンテ中に丸っと入れ替えここでデプロイまで試す...予定だったが設定ファイルが間に合わずリポジトリを入れ替えてリリース作業でメンテ明け。
設定ファイルは本番運用中にこっそり差し替えた。マジで怖かった。

git-flow運用についてはまた別でまとめることにする。現状採用して正解だと思っている。

デプロイ

これまで、謎の更新ファイルリストというものが共有サーバー上で共有されており、
開発者はリリースに必要なファイルを全てそこにメモしていた。凄まじいとしか言いようがなかった。
今はgitを採用したこともあり、開発環境、本番環境へログイン後git pullでデプロイが完了するようになってここが今回の改善のハイライトだと思う。
マスタープッシュで自動デプロイとかをしない理由は単に自動化に慣れないという人が多いというだけで徐々にそちら方面に進めていけそうではある。

vagrant + chef

3日ほどで完了。アサインされたその日から手をつけた。
本番サーバーがどのように構築されたのかがわからないという点が解決できそうになかったので本番と同じ環境をローカルに構築することは早い段階であきらめた。
とにかくプロダクトコードが動作する環境をchefで作り上げていった。
これはひたすらトライ&エラーの繰り返し。エラーが出る度にレシピを追加修正しvagrant provisionを叩きまくる。目処が立ったところでvagrant destroy && vagrant up。そんなループ。
まぁこれでいつかは完成するという気持ちで夜な夜な地道にやった。
しかし落とし穴が一点。
この時僕はメモリ8Gのosxで作業していて気づかなかったが、同じチームの開発者はメモリ4Gのwindows 7しかも32bit home edition...。vagrant upで落ちる落ちる。
スペックがネックになることを考慮しておらず。
まぁそもそもosxで作業すればいいと思うんだけど会社支給は受けれないし僕も自前なのでこんな感じになってしまっている。まぁ割とひどい。
仕方がないのでOSとメモリを買ってもらって彼らはメモリ8GのWindows 7 64bitへリプレイス。
ひとまず問題は回避できた。

現在

というわけで、大体3〜4日くらいでここまでは持ってこれている。
じゃあそれ以降の3ヶ月はまったく改善を放置していたのかというとそんなわけは無く、
単体テストの導入をずっと検討していて失敗続きなわけです。
理由は色々あって最近ようやく突破口が見つかった感?かな?どうなの?くらいのとこまで来た。
これについては次回以降に。