最近、ビルドを伴うプログラム言語で開発しています。
ソースは GitHub で管理していますが、まだリリース前ということもあり稀にビルドが通らないソースコードがプッシュされることも。
そこで、CircleCI を使って GitHub と連携し、プルリクエストをマージする前にビルドが通るかどうかのチェックをさせることにしました。
CircleCIについて
CircleCI はクラウドベースの CI サービスツールです。
Jenkins でも同じことができますし、一昔前だと Continuum が似たようなツールでした。
しかし、この両者はサーバインストール型となっており、どのサーバを使って CI の役割をさせるかを別途考える必要がありました。
CircleCIの設定方法
すごく詳しくまとめられているサイトがあったので、ここでの説明は省略します。
このサイトの通り設定すれば、GitHub との連携まではすぐにできます。
あとはどのようなタスクを登録するか、プロジェクトにあわせて設定ファイルを定義するだけです。
Continuumについて
少し触れた Apache Continuum ですが、2016 年に開発が終了となったようです。
最新のダウンロードバージョンも 2014 年が最後ということで、セキュリティなどを考えると事実上の過去プロジェクトです。
しかし過去に Continuum については記事を書いていたので、以下にまとめておきたいと思います。
Javaの構成管理
Java の構成管理において、Maven と組み合わせることで効果を発揮するツールに Continuum があります。
Continuum で何ができるかというと、Maven などのビルド環境を管理できるのです。
Continuum からソースをビルドさせることもできるし、スケジュールを設定して自動的にビルドもできます。
もちろんビルド結果をブラウザ上で確認でき、自動で Tomcat などにデプロイさせることも可能です。
また、メールの設定をすることで、ビルド結果をメールやメッセンジャーに通知することも可能です。
これによって、常に SCM(Subversion や CVS など)の環境を正常に保つことができ、万が一ビルドの通らないものがコミットされた時も早めに気付くことができます。
Continuumのインストール(Windows)
Continuum は Jetty Web サーバーが組み込まれているので、Apache や Tomcat を必要としないところも導入しやすいところです。
今回は Windows に導入する手順をまとめてみました。
モジュールは下記のサイトからダウンロードできます。Windows 用に zip アーカイブをダウンロードしておきます。
解凍して continuum という名前で C ドライブ直下に配備する。
1 2 3 | C:\continuum # DOS プロンプトから実行 C:\continuum\bin\win32\run.bat |
初回起動が完了したら一旦止めてポート番号を変更。
8080 番ポートを他に使ってなければ変更する必要はありませんが、Apache や Tomcat が使用している場合は変更して下さい。
変更ファイルは下記になります。
1 2 3 4 | C:\continuum\apps\continuum\conf\application.xml <http-listener> <port>8081</port> </http-listener> |
下記の URL にアクセスして設定画面が表示されれば OK です。
http://localhost:8081/continuum/
最初の画面で、アカウントやビルドに使用するディレクトリなどを設定し、その後 Maven 用のプロジェクトを構成していきます。
Maven2 の場合は、プロジェクトを設定するときに pom.xml を指定することになるので、それまでは Maven 環境がなくても Continuum のセットアップはできます。
Continuumのインストール(Linux)
今回は Linux サーバへの導入方法です。
まず、下記のサイトからアーカイブをダウンロードしておきます。
(continuum-1.0.3-bin.tar.gz)
アーカイブを解凍してインストールを勧めます。
1 2 3 4 5 | $ cd /usr/local/src $ tar zxvf continuum-1.0.3-bin.tar.gz $ mv continuum-1.0.3 /usr/local/ $ cd /usr/local $ ln -sf continuum-1.0.3 continuum |
Continuum を起動します。
1 2 | $ cd /usr/local/continuum/bin/linux/ $ ./run.sh console |
コンソールに下記が表示されたら完了です。
1 | jvm 1 | [INFO] The application server has started. |
Tomcat が 8080 で動作するので、Continuum は 8081 ポートに変更します。
Ctrl + C で一旦、Continuum を終了させます。
1 2 3 4 | $ vi /usr/local/continuum/apps/continuum/conf/application.xml <http-listener> <port>8081</port> </http-listener> |
再度起動します。
1 | $ /usr/local/continuum/bin/linux/run.sh start |
ただ毎回、起動コマンドを実行するのも面倒なので起動スクリプトを作成します。
起動スクリプトの作成
起動スクリプトを作成して OS 起動時に立ち上げるようにしてみます。
早速、簡単なスクリプトを作成してみました。
/etc/init.d 配下に、continuum としてサービスを作成します。
実行権限を付けるのをお忘れなく。
2 重起動は run.sh 側で管理してくれているので、細かいプロセス管理はしなくても大丈夫そうです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | $ vi /etc/init.d/continuum #!/bin/bash start() { echo -n "Starting Continuum: "; /usr/local/continuum/bin/linux/run.sh start return 0; } stop() { echo -n "Stopping Continuum: "; /usr/local/continuum/bin/linux/run.sh stop return 0; } usage() { /usr/local/continuum/bin/linux/run.sh } case "$1" in start) start ;; stop) stop ;; *) usage ;; esac exit 0; |
あとは、自動起動するように設定すれば完了です。
1 | $ chkconfig continuum on |
起動スクリプトの実行に失敗した場合
しかし実際に OS(Linux)起動時に start のログは残っているものの、どうやら起動に失敗しているみたいです。
起動スクリプトや起動順序などを調整してみましたが、状況は変わらないのでとりあえず直接起動スクリプトにリンクしてみます。
1 2 | $ cd /etc/init.d $ ln -sf /usr/local/continuum/bin/linux/run.sh continuum |
これで様子を見てみましたがダメだったので本家のドキュメントを漁ったところ、起動スクリプトにとある情報が必要らしいことが判明しました。
ドキュメントを読んで自動起動を再度試してみます。
手動の場合は既存のスクリプトで起動できるので、環境変数などの問題だろうなぁっとは疑っていたのですが、やはりこの辺が怪しそうです。
RedHat や Debian じゃなければ、CONTINUUM_HOME の環境変数のみでうまくいきそうですが・・・。
RedHat の場合は下記のスクリプト使えば起動スクリプトが作れるみたいです。
でも、run.sh を実行するところは、cd ${CONTINUUM_HOME} じゃなくて、cd ${CONTINUUM_HOME}/bin/linux じゃないとダメっぽいけどなぁ・・・。
Continuum のバージョンにもよるのかな。(私が使っているのはcontinuum-1.0.3)
あと、コメントアウトされている下記の行はコメントを外さないと私の環境では環境変数を認識してくれませんでした。
起動スクリプトの順番を最後にしたのが良かったのかも・・・。
1 | export JAVA_HOME=${JAVA_HOME} |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #!/bin/sh # # chkconfig_install.sh - install Continuum on a chkconfig-bases system # # Author: Felipe Leme <felipeal at apache.org> # # figure out what's Continuum's directory CONTINUUM_HOME=`dirname $0` cd ${CONTINUUM_HOME} CONTINUUM_HOME=`pwd` INITD_SCRIPT=/etc/rc.d/init.d/continuum if [ -f ${INITD_SCRIPT} ] then echo "File ${INITD_SCRIPT} already exists. Please remove it and try again." exit 1 fi echo "Creating file ${INITD_SCRIPT}" cat >> ${INITD_SCRIPT} <<EOF #!/bin/sh # chkconfig: 345 90 10 # description: Maven Continuum server # uncoment to set JAVA_HOME as the value present when Continuum installed #export JAVA_HOME=${JAVA_HOME} if [ -z "\${JAVA_HOME}" ] then echo "Cannot manage Continuum without variable JAVA_HOME set" echo " (try to set it on file ${INITD_SCRIPT})" exit 1 fi # run Continuum as root cd ${CONTINUUM_HOME} ./run.sh \$* # run Continuum as user _continuum_user_ #su - _continuum_user_ -c "cd ${CONTINUUM_HOME}; ./run.sh \$*" EOF chmod +x ${INITD_SCRIPT} echo "Adding Continuum to chkconfig" chkconfig --add continuum echo "Enabling Continuum on chkconfig" chkconfig continuum on echo "Continuum set to start on run levels 3, 4 and 5." echo "To start continuum now, run 'service continuum start'" |
Antプロジェクトの登録
次は Continuum で Ant プロジェクトを登録してみたいと思います。
他に、Maven1.x, Maven2.x, shell のプロジェクトが選択できます。
まず、Continuum に管理者ユーザーでログインします。
管理者ユーザーでログインすると、左メニューに「Add Project」のメニューが表示されるようになります。
ここで、「Ant Project」をクリックします。
クリックするとプロジェクトの設定画面になるので、必要な項目を入力して登録します。
下記がサンプルになります。
1 2 3 4 5 6 7 8 | [Add Ant Project] Project Name : saratoga Version : 1.0 Scm Url : scm:svn:http://localhost/svn/saratoga Scm Username : username Scm Password : password Scm Branch/Tag : ※「Scm Url」は「Maven SCM URL 形式」で入力する必要があるので注意です。 |
登録ができたら、「Show Projects」でプロジェクトを確認してみます。
プロジェクト名をクリックすると詳細な設定が参照できます。
ここでビルドのアイコンをクリックすると、実際に Subversion などのリポジトリからソースをチェックアウトしてきて build.xml に従ってビルドが始まります。
ビルド結果も「Build results for JNI」の画面で見れます。
ここでは、OK や NG のステータスの他に、ant 実行時の標準出力の内容も見ることができます。
ビルドのスケジュール設定
続いてビルドのスケジュール設定をします。
スケジュール設定をしておくと、毎日決まった時間にビルドを実行することが可能になります。
スケジュールは左メニューの「Schedules」から新規作成や編集ができます。
デフォルトでは毎時 0 分に実行されるスケジュールが登録されています。
今回は、毎日 18 時に実行するようにしてみます。
スケジュールの設定方法は cron と若干違うので注意して下さい。
詳細なフォーマットは下記で確認できます。
1 | <div class="simple-box4"><p><a href="http://www.opensymphony.com/quartz/api/org/quartz/CronTrigger.html">Class CronTrigger</a></p></div> |
1 2 | [毎日18時の設定] 0 0 18 * * ? |
スケジュールやビルドの詳細な設定は、プロジェクトの詳細設定画面の「Build Definitions(ビルド関連設定画面)」でできます。
ant の場合は、タスクや引数などの指定が必要なプロジェクトが多いと思うので忘れずに設定しておくといいと思います。
また、プロジェクトの詳細設定画面の「Notifiers(通知関連設定)」で、ビルド結果の通知設定ができます。
ここでは、メールやメッセンジャー、IRC などに通知が可能です。
問題なくビルドした時は通知しないような設定もできます。
Antタスクの問題
Continuum で Ant タスクを動かしていたら、タスク実行時の echo 出力が文字化けしている。
(javacのビルドもサーバ環境もUTF-8の状態)
Continuum の HTML ソースで文字コードを見てみたら、エンコードの指定がない・・・。
まあ、build.xml の echo を日本語にしなきゃいいんだけど。
Continuum1.1を試す
今回は Continuum のマイナーバージョンアップ版である、Continuum1.1 の Linux サーバへの導入方法です。
まず、下記のサイトからアーカイブをダウンロードしておきます。
(apache-continuum-1.1.tar.gz)
アーカイブを解凍してインストールを進めます。
1 2 3 4 5 | $ cd /usr/local/src $ tar zxvf apache-continuum-1.1.tar.gz $ mv continuum-1.1 /usr/local/ $ cd /usr/local $ ln -sf continuum-1.1 continuum |
Continuum を起動します。
1 2 | $ cd /usr/local/continuum/bin/linux-x86-32/ $ ./run.sh console |
コンソールで下記が表示されたら完了です。
jvm 1 | [INFO] The application server has started.
Tomcat が 8080 で動作するので、Continuum は 8081 ポートに変更します。
Ctrl + C で一旦、Continuum を終了させます。
この辺は前回のバージョンと同じです。
1 2 3 4 | $ vi /usr/local/continuum/apps/continuum/conf/application.xml <http-listener> <port>8081</port> </http-listener> |
起動します。
1 | $ /usr/local/continuum/bin/linux-x86-32/run.sh start |
下記の URL にアクセスして設定画面が表示されれば OK です。
http://localhost:8081/continuum/
linux のパスが 32 ビット用と 64 ビット用に分かれているので、起動スクリプトの中に定義してあるパスも修正しておきます。
1.0 の時と変わった点ですが、どうやら Jetty 単独ではなく Tomcat でも動かせるようになったようです。
また、プロジェクトの設定画面のインタフェースが若干違う部分もあるので、1.0 を使っていた人は少しだけ戸惑うかもしれません。
あと、スケジュール設定の時間定義ですが、以前は crontab のように特殊な書き方で設定する必要がありましたが、今回は時分秒月週年が個別に設定できるようになっています。
Second:
Minute:
Hour:
Day of Month:
Month:
Day of Week:
Year [optional]:
でも、かなり重くなった気がするのは気のせい?