馬とテニスのIT革命
馬とテニスとリラックマが好きな IT 系のエンジニアです。
エンジニア

CircleCIでGitのソースを自動ビルドして継続的インテグレーション

最近、ビルドを伴うプログラム言語で開発しています。

ソースは 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 ドライブ直下に配備する
C:\continuum

# DOS プロンプトから実行
C:\continuum\bin\win32\run.bat

# 初回起動が完了したら一旦止めてポート番号を変更

8080 番ポートを他に使ってなければ変更する必要はありませんが、
Apache や Tomcat が使用している場合は変更して下さい。

変更ファイルは下記になります。
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)

アーカイブを解凍してインストールを勧めます。

$ 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 を起動します。

$ cd /usr/local/continuum/bin/linux/

$ ./run.sh console

コンソールに下記が表示されたら完了です。

jvm 1    | [INFO] The application server has started.

Tomcat が 8080 で動作するので、Continuum は 8081 ポートに変更します。

Ctrl + C で一旦、Continuum を終了させます。

$ vi /usr/local/continuum/apps/continuum/conf/application.xml

<http-listener>
  <port>8081</port>
</http-listener>

再度起動します。

$ /usr/local/continuum/bin/linux/run.sh start

ただ毎回、起動コマンドを実行するのも面倒なので起動スクリプトを作成します。

起動スクリプトの作成

起動スクリプトを作成して OS 起動時に立ち上げるようにしてみます。

早速、簡単なスクリプトを作成してみました。

/etc/init.d 配下に、continuum としてサービスを作成します。

実行権限を付けるのをお忘れなく。

2 重起動は run.sh 側で管理してくれているので、細かいプロセス管理はしなくても大丈夫そうです。

$ 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;

あとは、自動起動するように設定すれば完了です。

$ chkconfig continuum on

起動スクリプトの実行に失敗した場合

しかし実際に OS(Linux)起動時に start のログは残っているものの、どうやら起動に失敗しているみたいです。

起動スクリプトや起動順序などを調整してみましたが、状況は変わらないのでとりあえず直接起動スクリプトにリンクしてみます。

$ 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)

あと、コメントアウトされている下記の行はコメントを外さないと私の環境では環境変数を認識してくれませんでした。

起動スクリプトの順番を最後にしたのが良かったのかも・・・。

export JAVA_HOME=${JAVA_HOME}
#!/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」をクリックします。

クリックするとプロジェクトの設定画面になるので、必要な項目を入力して登録します。

下記がサンプルになります。

[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 と若干違うので注意して下さい。

詳細なフォーマットは下記で確認できます。

[Class CronTrigger]
http://www.opensymphony.com/quartz/api/org/quartz/CronTrigger.html
[毎日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)

アーカイブを解凍してインストールを進めます。

$ 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 を起動します。

$ 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 を終了させます。

この辺は前回のバージョンと同じです。

$ vi /usr/local/continuum/apps/continuum/conf/application.xml

<http-listener>
  <port>8081</port>
</http-listener>

起動します。

$ /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]:

でも、かなり重くなった気がするのは気のせい?

Web API The Good Parts

オライリーの「Web API」に特化した本です。最近の多くの Web サービスは API が活用されていますが、その技術はこれまでの Web サイトとそれほど大きく変わりません。

今後、マイクロサービス化が進む中で知っておいて損はない内容が詰め込まれており、現場のエンジニアやこれから Web 系のエンジニアを目指す人にもオススメの一冊です。

created by Rinker
¥2,376
(2018/10/15 13:40:38時点 Amazon調べ-詳細)

あなたにオススメ