Jenkins + GitBucketなインスタンスでFuelPHPをバージョン管理する環境構築してみた

f:id:watass:20150201153144p:plain

以前までの記事でデプロイ、テストの自動化ができたわけですから、これで後はゴリゴリコーディングするだけ、ということで、Route 53でドメイン購入までしたわけですが、いまさらになってGitHubリポジトリホストに使うのはちょっと厳しいなと。
できればAWSVPC内にGitサーバ立てて、プライベートなリポジトリホストを使用するつもりだったのですが、そのためにインスタンス立ち上げるのはもったいない、という理由からGitHubを採用していました。しかし、Jenkinsサーバを立てている現状、Jenkinsサーバにリポジトリホストとしての役割を兼任させればいいじゃんという結論に。
HTTP経由でリポジトリを参照するようにしようかなと思っていたところ、社内でGitBucketというGitHubのクローンでサーバ立てたという話を聞き、すごく良さそうだったので試してみることにしました。



GitBucketとは

GitBucketとは、@takezoen氏が開発したGitHubクローンです。GitHubクローンといえば、GitLabが有名ですが、非常に導入が面倒と聞きます。最近でこそrpmで簡単にインストールできるようになったそうですが、NginxやらPostgreSQLやらRedisなどが色々インストールされるので、JenkinsやFuelPHPのコア部分のテストを行うサーバには少し大げさすぎる気がします。
対して、GitBucketはwarファイルで提供されており、TomcatやJettyなどのサーブレットコンテナ上で簡単に動くというメリットがあります。機能もGitHubを意識しつつ、非常に洗練されているので、使用感が大変いいです。
もちろんGitLabに比べると機能面では劣るのですが、現状の利用規模を想定するとGitBucketがほどよいです。プロジェクト本体はGitHub上で公開されているので、見てみてください。


目標とするAWS上の環境イメージ

インフラ運用について

基本的には以前の構成と同じで、GitHubがJenkinsの乗っているインスタンス上のGitBucketに切り替わるだけです。ただ、今回の環境構築は勉強用ではなく、ウェブサービス運用を前提としていくため、もう少し情報を書き込んでいきます。以下の図のような感じです。

f:id:watass:20150201154035p:plain

なお、図では本番環境と開発環境でインスタンスを分けていますが、最初のリリースを果たすまでは本番環境と開発環境は同一インスタンスでブランチを分けるだけにとどめます。節約のためです。

ブランチ運用について

ブランチ運用については上図にも書いたように、masterブランチと開発者の数と同じだけのdevelopブランチで運用します。コアの設定変更などはなるべくdevelopブランチで行い、developブランチの内容をmasterとマージさせた後は、必ずmasterブランチをdevelopブランチにマージさせてから開発を進めるようにします。
現在、ぼっち開発なのでこのスタイルで何とかなると思っていますが、開発者が増えるとちょっとやりにくくなりそうなブランチモデルです。その際にはfeatureブランチなどを設け、テスト環境として1インスタンスではなく、ローカルにvagrantなどでテスト環境を構築する形になりそうですね。
なお、SourceTreeによるブランチ運用は以下の記事で書いています。


バージョンについて

今回のサーバ構成ではJenkinsやGitBucketのインスタンスをマスターサーバ、FuelPHPのアプリケーションを配置するサーバを本番サーバとしますが、マスターサーバでもFuelPHPのインストールを行い、コアの設定変更などを確認できるようにしておきます。
各サーバごとに動いているアプリケーションのバージョンは以下の通りです。

・マスターサーバ
OS:Amazon Linux AMI 2014.09
Git:version 2.1.0
Java:version 1.7.0_71
Jenkins:version 1.596
Tomcat:version 7.0.57
GitBucket:version 2.7

・本番サーバ
OS:Amazon Linux AMI 2014.09
Git:version 2.1.0
PHP:version 5.3.29
FuelPHP:version 1.7.2
PHPUnit:version 3.7.38


FuelPHPのインストール

FuelPHPのダウンロードと基本設定

第一の前提として、まずFuelPHPをマスターサーバにインストールする必要があります。このサーバはFuelPHPのコア部分の動作確認などにも用います。インストールの後の設定確認で躓くこともあると思うのですが、基本的には以下の記事で何とかなるはずですので、こちらをご参照ください。

PHPUnitのインストール

テスト自動化を行いたいため、PHPUnitはもちろん導入しておきます。Composerからインストールできるようにcomposer.jsonを編集しておけばそれごとバージョン管理されて、別のインスタンスに環境構築する際にもスムーズにPHPUnitがインストールできますので、早めにやっておきましょう。手順は以下の記事の通りです。

Jenkinsのインストール

デプロイやテストの自動化を行うためにJenkinsを入れておきます。以下で自動デプロイまで書いてありますが、SSH鍵をサーバにおいておくのはやはりセキュリティ的にバッドプラクティス感が強いので、できればデプロイについてはこの手順は外したいですね。Jenkins導入はyumリポジトリ登録を済ませればyum install jenkinsでインストールできますので簡単です。


GitBucketのインストール

Tomcat7のインストール

さて、ここからが新しいネタになります。JenkinsサーバにGitBucketをインストールするのですが、GitBucketはwar形式で提供されており、サーブレットコンテナが必要になるので、Tomcat7をインストールします。

# yum install tomcat7 tomcat7-webapps

ちなみに、Tomcat6だと動作しない、という話を聞いたので、とりあえず7系をインストールしています。CentOSだとスムーズに行かないような話をちらっと聞きましたが、Amazon AMIならyumリポジトリとか気にせずともインストールできたのでよしとします。
ちなみに、数あるサーブレットコンテナからTomcatを選んだのは、既にインストールしてあるJenkinsが組み込みJettyの上で走っていることを聞いたのと、個人的に馴染みがあるからです。他にもサーブレットコンテナは種類があるので、馴染みのあるものや使いたいものがあればそれを使ってもいいと思います。

Tomcatのポート変更

さて、インストールされたTomcatはデフォルトだと8080番ポートでアクセス可能ですが、既にJenkinsが8080番ポートを使用しているので、Tomcatのポートを8090番に変更します。
/etc/tomcat7/server.xmlを以下のように編集します。

    <Connector port="8090" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

Connector portを8090番に変更すればOKです。
起動して、chkconfigをonにしておきます。

# service tomcat7 start
# chkconfig tomcat7 on

8090番ポートを指定してブラウザからアクセスしてみると・・・?

f:id:watass:20150126004439p:plain

Tomcatの画面が表示されました!これでGitBucketを動かす準備は完了です。


※2015年2月11日追記
8080番ポートだけ変更した場合、起動順によってはJenkinsだけ正しく起動しないことがあるようです。一部のポートがJettyと衝突していると思われます。
以下のようにしてTomcatのリジェクトポートを8443から9443に、AJPのポートを8009から8010に、シャットダウンに用いるポートを8005から8015に変更しておきます。

<Server port="8015" shutdown="SHUTDOWN">
/* 中略 */
    <Connector port="8090" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="9443" />
/* 中略 */
    <Connector port="8010" protocol="AJP/1.3" redirectPort="9443" />

とりあえず、これで問題なく動作することが確認できましたが、ポートの衝突やプロセスの競合はセキュリティ上の問題を生む可能性がありますので、慎重に設定するようにしましょう。お前が言うなって感じですが。

※追記終わり



GitBucketのwarファイルを展開

Tomcatの準備ができましたので、/var/lib/tomcat7/webappsにgitbucket.warを配置するだけでGitBucketを利用することができます。最新板のGitBucketはGithubのリリースページからダウンロードできますので、URLは適宜確認してください。
ちょうど本日(2/1)に2.8をリリースされたようですが、今回は2.7をインストールしています。

# cd /var/lib/tomcat7/webapps
# wget https://github.com/takezoe/gitbucket/releases/download/2.7/gitbucket.war
# service tomcat7 restart

これでhttp://サイトURL:8090/gitbucketへアクセスすると・・・

f:id:watass:20150126004457p:plain

できました!
これで80番ポートならFuelPHPのコア動作確認、8080番ならJenkins、8090番ならGitBucketが利用できるインスタンスのできあがりです。
なお、各サービスは外から参照できる必要がありませんので、SecurityGroupでは各ポートにIP制限をかけておくことを推奨します。このような設定がGUIからスムーズにできてしまうのもAWSのいいところですね。


GitBucketにFuelPHPリポジトリを登録

GitBucketの初期設定

インストール後はユーザ名root、パスワードrootでrootユーザとしてログインできますが、いくらSecurityGroupを設けているとはいえ、少し不安なので別の管理者ユーザを作成して、rootユーザでのログインを禁止しましょう。
rootユーザログイン後、右上のAdministrationから新規管理者ユーザ作成を行います。作成できたら、作成した管理者ユーザでログインし、以下のようにrootのユーザの権限を一般に変更、ユーザ名の下のDisableにチェックを入れましょう。

f:id:watass:20150126004524p:plain

これでユーザ一覧からrootユーザが消え、rootユーザでのインストールができなくなります。これで初期設定は完了です。

FuelPHPプロジェクト配下でリポジトリを作成

次はインストールしたFuelPHPのコア部分をGitBucketにリポジトリ登録します。GitBucketでリポジトリを新規作成し、URLをFuelPHPリポジトリ上でgit remote addするだけです。詳細な手順は以下の記事で。

ただ、今回はなぜかサブモジュールの追加はfuel/core.gitをaddしただけで大丈夫でした。FuelPHP側の仕様が変わったのでしょうか?
ちなみに、remote addするときのURLはIPアドレスだったりするかもしれませんが、再起動時にIPアドレスが変わって面倒臭いことにならないように、Route53でドメインから引けるようにしておくことが望ましいです。手順は以下の記事が詳しいので参考にしてみてください。

本番サーバのセットアップ

リポジトリの登録ができたら、後はこのリポジトリをクローンしてくることで、別インスタンスでも同様の環境を再現できることまで確かめたいですね。早速手順を確認します。
まず、インスタンスを新規に作成したら、基本的なプログラムをインストールします。

# yum install php
# yum install git
# yum install php-mbstring php-mysql php-xml
# service httpd start
# chkconfig httpd on

インストールができたら、プロジェクト配下へ移動してクローンし、各種設定を済ませます。

$ git clone -recursive http://hostname:8090/gitbucket/git/username/project.git
$ cd /var/www/html
$ sudo ln -s ~/project/public project
$ sudo chmod 755 /home/ec2-user
$ sudo vi /etc/httpd/conf/httpd.conf [setting mod_rewrite]
$ sudo vi /etc/ssh/sshd_config [setting StrictModes]

最後に、Composerの設定を済ませ、PHPUnitのパスを設定します。

$ php composer.phar self-update
$ php composer.phar update
$ vi fuel/package/oil/config/oil.php [setting phpunit-path]

以上でブラウザからのアクセス、およびテストの実施ができるようになります。自動デプロイやテストの設定はマスターサーバ上で行いますので、これでFuelPHPのバージョン管理ができるようになりましたね。


まとめ

  • GitBucketはサーブレットコンテナにwarファイルを配置するだけで利用可能
  • Jenkinsは組み込みJetty、GitBucketはTomcat7の上で走らせる
  • ポート番号の衝突を防ぐため、Tomcatのポートは8090番に変更する


デプロイ自動化ツールの導入を検討してます

ここまででバージョン管理はできましたが、後はデプロイ自動化など、Jenkins側の設定を進める必要があります。先ほどの記述でもありましたように、秘密鍵をサーバに配置してシェルベースでデプロイ操作をするのは、セキュリティ的にもバッドプラクティスに感じます。
幸いなことにデプロイ自動化ツールは非常に多く存在していますので、これを使わない手はありません。色々試してみようとは思いますので、いい感じの構成ができたら記事にしようかなと思っています。できれば、CodeDeployの東京リージョン開放が理想的なんですけどね・・・

ところで、今回の記事は過去記事参照が非常に多くて、新規性に乏しいですね。次はもう少し新しい情報を組み込んだ記事を書きたいなぁと思います。


参考にした記事

ビーキョウのIT Tomcat 7 インストール
# Tomcat7のインストールとポート番号変更設定で参考にさせていただきました。
GitBucketを5分で導入する方法 | りぐん怪獣じゃないもん!
# GitBucketのインストール方法として参考にさせていただきました。
Tomcat7の環境でGitBucketをインストールしてみる - yk5656 diary
# 同じくGitBucketのインストール方法として参考にさせていただきました。