FuelPHPのプロジェクトをGithubでバージョン管理する

f:id:watass:20141214211533p:plain

今回の記事もFuelPHPです。以前からコードを書いてはいましたが、プログラミングするなら、今の時代はgitでバージョン管理したいですよね。
インフラはみんなだいすきAWSなので、gitサーバを立てるのは難しくないけど、いちいちインスタンス立ち上げるのももったいない、別に隠すものでもないし、Github使おう。
というか、FuelPHP自体がgitでバージョン管理されてるの?え?じゃあ管理しにくくね?え?モデル、コントローラー、ビュー別にそれぞれリポジトリ作るの?え?え?
・・・このように、フレームワークのプロジェクトのバージョン管理って結構面倒くさいらしいんですが、色々ググって、とりあえずこれでいいか、というところまで辿りつけたので記事にまとめておきます。


今回のゴール

今回の目的は、もちろんFuelPHPのプロジェクトをGithubでバージョン管理することにあるのですが、バージョン管理する理由の背景にある「ソースコード管理」についての理想像もちょっと触れておこうかと思います。
今後のFuelPHPを使うプロジェクトでは、ソースコード管理は以下の要件を満たします。

  • コーディングはOS、エディタを問わずクライアントPCで行う。
  • FuelPHPのバージョンアップはサーバ上で行い、リポジトリへプッシュする。
  • リポジトリはプルしてくるだけで別サーバ上でも同様のプログラムを再現できる。
図にするとこんな感じ。

f:id:watass:20150102184152p:plain

なお、gitの運用モデルは勉強不足もあって、まだ固めてません。後日まとめる予定です。
リポジトリをプルすれば再現可能、と書いていますが、実際にはそうはいかないです。その辺りはデプロイ自動化やインフラ管理でやっていく予定です。なるべく自動化したいですよね。

今回は「プルしてくるだけ」の部分を除いて、実現できるように準備します。


開発環境について

開発環境は以下のバージョンのツールを利用します。
サーバ側のGitのバージョンが古いとか、MacのOSが古いとかその辺は目をつむってください。

・サーバサイド
OS : Amazon Linux AMI 2014.09
PHP : version 5.3.29
FuelPHP : version 1.7.2
Git : version 1.7.1

・クライアントサイド
OS : Mac OS X Mavericks 10.9.5
Git : version 1.9.3
SourceTree : version 2.0.4

ちなみに、サーバ上には既にFuelPHPをインストールしてあるものとします。
インストール方法は以下の記事を参照してください。


Githubリポジトリを作成

まずGithubFuelPHPのプロジェクトを管理するための空のリポジトリを作成します。手順はこちらのエントリに書いてあるので、その通りに進めてください。

なお、作成時にはREADMEや.gitignoreは作成しないようにしておきましょう。後々、サーバ側からプッシュするときに競合が起こる可能性があります。まぁプルしてからやればいいんですけどね。


FuelPHPリポジトリを初期化

FuelPHPのコアクラスはgitで管理されており、プロジェクトの直下(この場合は~/welcome/)には既に.gitディレクトリが存在します。このリポジトリFuelPHPの配布元を参照しているので、リポジトリを削除し、新しいリポジトリを作成しなくてはいけません。
以下のコマンドで削除、リポジトリの初期化を行います。

# rm -rf .git .gitmodules *.md
# git init

とはいえ、これだとFuelPHPのコアクラスアップデートにgitで対応できません。
そこで、既にインストールされているコアクラスなどは削除し、Githubで公開されているFuelPHPのオフィシャルプロジェクトから参照するようにします。

# rm -rf docs fuel/core fuel/package
# git submodule add -f git://github.com/fuel/core.git fuel/core
# git submodule add -f git://github.com/fuel/oil.git fuel/packages/oil
# git submodule add -f git://github.com/fuel/auth.git fuel/packages/auth
# git submodule add -f git://github.com/fuel/parser.git fuel/packages/parser
# git submodule add -f git://github.com/fuel/orm.git fuel/packages/orm
# git submodule add -f git://github.com/fuel/email.git fuel/packages/email

これによって

# git submodule foreach 'git pull’

の一発でコアクラスが更新できるらしいです。後々試したいですね。
後は現在作成したリポジトリの参照先をgithubリポジトリに変更して準備完了です。

# git remote add origin http://github.com/wata727/welcome.git


.gitignoreを設定してプッシュ

後はFuelPHPの本体ごとリポジトリへプッシュするだけですが、ここで注意点があります。
そう、db.phpですね。前回の記事でRDSへの接続のためのパスワードをdb.phpに記述したことを覚えているかと思います。このパスワードは公開したくないですし、Githubで露出プレイを楽しむような性癖も持ちあわせていませんので、考えなしにgit add .をしてはいけません。
このようなケースで役立つのは.gitignoreというファイルです。プロジェクトの直下に生成されている隠しファイルで、ここに記述されたファイルはgitの管理対象外になります。
fuel/app/config配下に色々な設定ファイルが入ってくるので、これらは無視するようにしましょう。.gitignoreには以下の記述を追加してください。

# config files
fuel/app/config/*.php
fuel/app/config/*/*.php

.gitignoreを更新したら、プロジェクト配下でgit addしてコミット、プッシュまでやっちゃいましょう。不安な方はgit addした後にgit statusで一覧を見てみるのもいいと思います。

# git add .
# git commit -m "FuelPHP installed 1.7.2"
# git push origin master:master

正常に完了したらGithubリポジトリ画面を見てみてください。FuelPHPの中身が反映されていると思います。これで完了です。


リポジトリをプルしてみる

とはいえ、本当にリポジトリを引っ張ってくるだけで別サーバでもプログラムを再現できるのか?というところは確認しなくてはいけません。新しいインスタンスを立ち上げましょう。
基本的なプログラムをインストールし、リポジトリをクローンしてきます。

# yum install git
# yum install php
# yum install php-mysql
$ git clone --recursive https://github.com/wata727/welcome.git

後はまぁ、Apache起動したり、シンボリックリンクはったりしましょう。詳細は冒頭にも挙げたFuelPHPの導入手順に書いてあります。これでアクセスすると・・・

f:id:watass:20150102195018p:plain

む、読みにくいですが、Composerが入っていない、とのこと。じゃあインストールしましょう。ついでにアップデートとディレクトリへの書き込みを可能にするためにoil refine installもやっておきます。
なお、階層はちゃんとプロジェクト配下でやっておくことをおすすめします。

$ curl -sS https://getcomposer.org/installer | php
$ php composer.phar self-update
$ php composer.phar update
$ php oil refine install
Error - date_default_timezone_get(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'UTC' for 'UTC/0.0/no DST' instead in COREPATH/classes/fuel.php on line 167

なんか見覚えのあるエラーが出てますが気にしない。
これでアクセスすると・・・

f:id:watass:20150102195613p:plain

タイムゾーンのエラーかな?見覚えがあるような・・・と思ったら、そもそもconfig.phpねぇじゃん。FuelPHPをインストールしたサーバからfuel/app/configディレクトリをコピーしてきて配置します。
これでアクセスすると・・・

f:id:watass:20150102195830p:plain

おかえり。
後はホームディレクトリのパーミッション変更に伴うsshd_configの変更とか、httpd.confのAllowOverRideを更新すれば、前作ったRDSを参照するプログラムもしっかり動きます!


クライアント側からプッシュ

さて、これで完了ですが、一応クライアントPC側から問題なくプッシュして反映させられるか確認しておきましょう。SourceTreeを起動して、Githubリポジトリをクローンしてきます。
GithubのアカウントをSourceTreeに登録しておけば以下のようにGithub上のリポジトリを簡単にクローンできるようになっていますので、クローンしてきましょう。

f:id:watass:20150102200435p:plain

クローンしてきたファイルを確認して、お気に入りのエディタでlogin_view.phpを以下のように編集します。

<html>
<head>
<title>Welcome!</title>
</head>
<body>
<h1>Welcome! <?php echo $name; ?> !</h1>
This is top page.
</body>
</html>

わかりにくいですけど、"This is top page."の一文を追加しました。
あとはいつもどおり、コミットしてプッシュします。

f:id:watass:20150102201156p:plain

こんな感じにGithub上でもコミットが反映されているのがわかります。
後はサーバにログインして、プルするだけ。

$ git pull origin master:master

これでブラウザからアクセスすると・・・?

f:id:watass:20150102201536p:plain

変更が反映されました!


まとめ

  • FuelPHPのプロジェクト管理はサブモジュールだけオフィシャルから参照
  • fuel/app/config配下は.gitignoreで無視するように設定
  • リポジトリを参照したら、Composerのインストールを忘れずに


AWS CodeCommitに期待してます

AWS上でリポジトリ管理、といえば、AWS CodeCommitを意識せざるを得ませんよね。
まだリリース前ということで、利用できませんが、今年の頭にはリリース予定とのことです。出たら試してみたいですね〜。結局EC2インスタンスからのプッシュはパスワード手動入力でやってるので、IAMとかでさくっとリポジトリ認証できたらスマートそうです。なにより、configディレクトリがリポジトリに入れられないのはちょっと・・・
他にも、CodeCommitはCodeDeployやCodePipelineとの連携で、デプロイ自動化なども推進できる、なんていう話もありますので、その辺にも手を伸ばしていきたいですね。クライアントPCからプッシュするたびにgit pullするのも面倒ですし、Travis CIとかで自動デプロイはできるらしいですが、その辺のことがAWS内で完結するのが理想です。

残る課題としては、インフラの自動化やCIの自動化ですね。ChefやCloudFormationとかを考えてますが、未だにイメージがうまく湧いてこないです。インフラもコード化してgitでバージョン管理したいところですが、その辺の仕組みづくりのゴールはいつ見えてくるのやら・・・
少なくとも、現在のリポジトリを引っ張ってくるだけではプログラムが再現できない状況は改善したいので、各種設定は自動化したいです。ついでにデプロイしたらServerspecとかでテストの自動化も。もしかしたらソースコード管理なんかしなくてもAMIで管理したほうが的確かもしれませんけど。

近い話題としては、まずgitの運用モデルを固めないといけませんね。もう少しがっちりgitの勉強をしなくては・・・


参考にした記事

FuelPHP + Gitで幸せになれた。 - 個人的チラ裏
# こちらの記事をベースにやらせていただきました。ありがとうございます。
fuelphpアプリのgit管理
# remoteの設定を参考にさせていただきました。
gitで管理しないファイルを無視させる .gitignore|misc|@OMAKASE
# .gitignoreの設定について参考にさせていただきました。
[超簡単]FuelPHPをgit(github)で管理する方法 - Qiita
# Composerインストールのくだりを参考にさせていただきました。
FuelPHP1.7をUbuntu12.10にsudoを使わずインストール
# リポジトリからプルしてきたときのエラーのトラブルシューティングで参考にさせていただきました。