MonoによってVisual Studioで作成したアプリがほぼそのままLinux上で動作できるとはいえ、ファイル・パスやライブラリのバージョンなどによって、挙動に差異も発生し得る。そういった差異による動作不具合をなるべく防ぎ、発生しても手戻りを小さくするためには、小まめにLinux上で動作確認をするのが一番だ。だからといって、そのたびにサーバにデプロイしていたのでは、効率が悪い。そのような問題を解決してくれるのが、継続的インテグレーション・ツールだ。
継続的インテグレーション・ツールは、定期的に(もしくは、バージョン管理ツールを使っている場合はコミットしたタイミングで)、最新版のソースを自動的にビルド&テストし、その結果を報告してくれる。本稿で使用するJenkinsは、Javaで作成された継続的インテグレーション・ツールだが、ビルド・コマンドを指定できるので、Mono環境でも問題なくビルド可能だ。
Jenkinsにビルド・コマンドを設定する前に、Monoにより手動でビルドできることを確認しておこう。
Monoでは、xbuildコマンドを使用することで、Visual Studioのプロジェクト・ファイルやソリューション・ファイルをビルドすることができる。ただ、残念ながらそのままでは最新のVisual Studio 2012のプロジェクトをビルドできないので、少々細工が必要となる。まずは次のコマンドを実行してほしい。
# ln -s /usr/local/lib/mono/xbuild/Microsoft/VisualStudio/v9.0 /usr/local/lib/mono/xbuild/Microsoft/VisualStudio/v10.0
一度、v9.0用の設定をv10.0にコピー(厳密にはリンク)してやることで、取りあえずビルドは通るようになる。もちろん正式な対応ではないし、これによってどのような弊害が出るかも分からないので、早い正式対応を待ちたいところだ。環境さえ整えば、次のコマンド例のようにプロジェクト・ファイルを指定することで、ビルドが行える。
# /usr/local/bin/xbuild sampleapp2.csproj
Mono環境でのビルドが確認できたら、実際にJenkinsをインストールして設定してみよう。Jenkinsは活発に更新されているので、最新版はプロジェクトのページを確認してほしい。本稿では以下のコマンドを実行した。
yum install java-1.7.0-openjdk
wget http://pkg.jenkins-ci.org/redhat/jenkins-1.514-1.1.noarch.rpm
rpm -i jenkins-1.514-1.1.noarch.rpm
service jenkins start
上記のコマンドの実行が完了すると、サーバの8080ポート(つまり「http://〜:8080/」)でJenkinsが起動するはずだ。
Jenkinsのダッシュボードが表示できたら、[新規ジョブ作成]でMonoアプリを登録してみよう(参考:「.NET開発者のためのJenkins入門」)。本稿の例では「sampleapp」というジョブを作成した。
ソース・コード管理などは使用している環境に合わせて設定してほしい。特に使っていなければ、「なし」として設定すればよい。本稿の例では「Subversion」を設定した。
Monoでビルドする場合は、[ビルド手順の追加]から「シェルの実行」を選択する。ここで、上記のxbuildコマンドを実行するスクリプトを指定すればよい。筆者の環境では、下記のpost-commitスクリプトを作成して、Subversionのコミットがあると、(下記のスクリプトが実行されることにより)Jenkinsが動き出すように設定している。
#!/bin/sh
/usr/bin/wget http://localhost/jenkins/job/sampleapp/polling -O /dev/null -q >> /tmp/nc_postcommit.log
上記のスクリプトが実行されることにより、下記の「ビルド&デプロイ&テストを実施するスクリプト」がJenkinsによって実行される。
#!/bin/sh
# ビルド
cd /var/lib/jenkins/jobs/sampleapp/workspace/trunk
/usr/local/bin/xbuild /property:DEBUG=0 sampleapp2.csproj
if [ $? -gt 0 ]; then exit 1; fi
# ビルド結果をApacheにデプロイ
echo Deploying...
cd /var/lib/jenkins/jobs/sampleapp/workspace/trunk
cp -r sampleapp/bin sampleapp/Views sampleapp/Contents sampleapp/Global.asax /var/www/sampleapp
echo Waiting for reload...
sleep 3
# Homeページにアクセスできるかテスト
echo Testing...
export baseUrl="http://localhost/sampleapp";
wget -O /dev/null "$baseUrl/Home"
if [ $? -gt 0 ]; then exit 1; fi
echo Done.
ここからさらにテスト項目を充実させることで、デグレードを避けながら開発を進めるための環境を構築できる。Jenkinsに限らず、テスト系なども含めて豊富なツール類を柔軟に組み合わせて環境を構築できることもMonoを利用するメリットになるのではないだろうか。
以上、MonoとMySQL Connectorというオープンソース環境を駆使して、Linux上に本格的なASP.NET MVCアプリを運用する方法を、前後編に分けて解説した。特にLinuxサーバを運用しているが、.NETが得意な開発者がいる会社には、本稿の手法は勧めである。そのような方に本稿の内容が一助となれば幸いだ。
Copyright© Digital Advantage Corp. All Rights Reserved.