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

オープンソースこねこね

Webプログラミングなどについてあれこれ。

JenkinsをCentOSにインストールしたときのメモ

f:id:kohkimakimoto:20131120194039p:plain

Githubで公開しているプロジェクトのCIにはTravisが使えて便利なのですが、 仕事で開発しているWebアプリとかは公開するわけには行かなかったりするので、Travisは使えません。

そんなわけで、仕事でもCIの環境が欲しくなったので、今更ながらjenkinsをインストールしてみましたので、メモを残しておきます。

目的

PHPのWebアプリのユニットテスト

環境

ローカルのVirtualBox上に構成したCentOS6。

Jenkinsのインストール

Javaが必要なので先にyumとかで入れておきます

$ yum install java-1.7.0-openjdk

http://pkg.jenkins-ci.org/redhat/

redhat,centos用のRPMがあるのでそれをダウンロードしてインストールします。

$ rpm -ivh jenkins-1.540-1.1.noarch.rpm

実際はchefのレシピを用意してインストールしているので以下のようなrecipeを書いて実行しています。

jenkins/attributes/default.rb

default['jenkins']['rpm'] = "jenkins-1.540-1.1.noarch.rpm"
default['jenkins']['rpm_url'] = "http://pkg.jenkins-ci.org/redhat/jenkins-1.540-1.1.noarch.rpm"

jenkins/recipes/default.rb

remote_file '/tmp/' + node['jenkins']['rpm'] do
  source node['jenkins']['rpm_url']
  owner "root"
  group "root"
  mode "0755"
  not_if "test -e " + '/tmp/' + node['jenkins']['rpm']
end

package "jenkins" do
  action :install
  source '/tmp/' + node['jenkins']['rpm']
  provider Chef::Provider::Package::Rpm
  not_if "rpm -q jenkins"
end

service "jenkins" do
  action [:enable, :start]
end

インストールすると

/usr/lib/jenkins/jenkins.war

にjenkins本体のwarが

/var/lib/jenkins/

にデータディレクトリが作成されます。

WebUIにアクセス

http://xx.xx.xx.xx:8080/

仮想サーバの8080ポートにブラウザでアクセスするとjenkinsの画面が表示されます。

設定

ローカル環境なので、セキュリティとか気にしない。というわけで特に環境設定なし。デフォルトのまま。

ジョブ

ジョブはjenkinsに実行させたい処理を定義します。今回はリポジトリからPHPアプリのソースをとってきて、PHPUnitでテストを実行させたいと思います。まず、

  • 左メニューの[新規ジョブ作成]→[ジョブ名]に適当な名前をつけて[フリースタイル・プロジェクトのビルド]を選択して[OK]。

その後、最低限の設定だけします。

  • [ソースコード管理]は使っているVCSを選択します。お仕事ではsvnを使っているので[Subversion]。[リポジトリURL]を入力します。

  • [ビルド・トリガ]は[SCMをポーリング]を選択。スケジュールには1分ごとにチェックさせたいので以下のようにしました。

      */1 * * * *
    
  • [ビルド]の箇所では[ビルド手順の追加]→[シェルの実行]を選んで、svnからソースを落としてきたあとに行う実際のタスクを書きます。私の場合は以下のようになりました。

      /usr/local/bin/composer install --no-interaction
      php vendor/bin/phpunit -c phpunit-ci.xml.dist
    

なんでかJenkinsからの実行だと/usr/local/bin/にパスが通っていないので、グローバルインストールしてあるcomposerをフルパスで実行してます。 composer installのあとにphpunitを実行していますが、jenkins用のテストの設定(カバレッジをとるなど、後述します)を使いたいので-cオプションで専用のphpunitの設定ファイルを指定しています。

これで[保存]をクリックして完了。トップに戻って、時計アイコンをクリックして、試しに実行してみます。

カバレッジ

テストがうまくできたら、カバレッジもとりたくなりました。PHPカバレッジをとるには、Clover PHP pluginを使います。 左メニューの[Jenkinsの管理]→[プラグインの管理]から

  • Jenkins Clover PHP plugin

をインストール。Jenkinsを再起動。

ジョブの設定画面に行くと[ビルド後の処理の追加]に[Clover PHP カバレッジレポートを集計]という項目が増えているので、これをクリックして処理を追加します。

  • Clover XMLパス:reports/coverage/coverage.xml
  • Clover HTMLレポート ディレクトリ:reports/coverage

のように設定します。その後phpunit実行時に指定する設定ファイルphpunit-ci.xml.distに、以下のようなカバレッジを出力する設定を追加します。

<?xml version="1.0" encoding="UTF-8"?>
<phpunit colors="true" berbose="true" bootstrap="test/bootstrap.php">

  ...いろいろ設定

  <logging>
    <log type="coverage-clover" target="reports/coverage/coverage.xml"/>
    <log type="coverage-html"   target="reports/coverage" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70"/>
  </logging>
</phpunit>

以上でOK。テストとともにカバレッジを出力してくれるようになります。

終わりに

というわけで開発作業中、ローカルPCに開発環境用とCI用の2つのVMを常時起動させて作業するようになりました。 なんでもできることはローカルで、というのが最近の作業スタイルになっています。 基本一人で作業している身なので、サーバが外にある必要がないんですよね、あんまし。

あと、Jenkinsのジョブの設定とかもWebからやらないでchefでやりたいのですが、このへんは今後調べようかと思っています。