Raspberry Pi をJenkinsのスレーブノードにする

Raspberry Pi をJenkinsのスレーブノードとして追加する手順をまとめました。
クロスプラットフォームのソフトウェア開発においてARM-Linux版の動作確認などに使用できます。

前提

LinuxのPCなどにJenkinsのサーバが構築されていることが前提です。
手元では、Jenkinsのバージョンは1.536です。
また、必須ではありませんがJenkinsのグローバルセキュリティ設定はしておいた方がよいと思います。

Javaのインストール

参考(というかこのまんまですが)
http://raspberrypi.stackexchange.com/questions/4683/how-to-install-java-jdk-on-raspberry-pi

https://jdk8.java.net/download.html
から ARM-Linux用のJDKをダウンロード&展開、インストールします。

% sudo tar xvf jdk-8-ea-b36e-linux-arm-hflt-*.tar.gz -C /opt
jdk1.8.0/COPYRIGHT
jdk1.8.0/LICENSE
jdk1.8.0/README.html
jdk1.8.0/THIRDPARTYLICENSEREADME.txt
jdk1.8.0/bin/
jdk1.8.0/bin/jinfo
 :
% sudo update-alternatives --install "/usr/bin/java" "java" "/opt/jdk1.8.0/bin/java" 1
% java -version
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) Client VM (build 24.0-b56, mixed mode)

上記で、Jenkinsではjavaコマンドだけで充分ですが、javaコマンド以外(javac等)も必要に応じて
update-alternatives を使用してインストールしておきます。

スレーブノードの設定

動作中のJenkinsから
[jenkins] -> [Jenkinsの管理] -> [ノードの管理] -> [新規ノード作成]
を選択し、以下の例のようにノードを作成します。

これでノードが作成されました。(もちろんまだコネクトされていません)

作成したRaspberryPiノードをクリックすると、以下の画面になります。

この中で

・スレーブでコマンドラインから起動:
java -jar slave.jar -jnlpUrl http://<host:port>/computer/RaspberryPi/slave-agent.jnlp -secret 5796...

というインストラクションがあるので、この方法でRaspberry Piからスレーブエージェントを起動します。
-secret ... のオプション部分はJenkinsでグローバルセキュリティ設定をしていなければ出ないと思います。

上記画面において slave.jar のところはリンクになっており、リンクURLをコピーしてRaspberry側からwgetしてセーブしておきます。

% wget http://<host:port>/jnlpJars/slave.jar
--2013-10-29 01:23:31--  http://<host:port>/jnlpJars/slave.jar
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 346309 (338K) [application/java-archive]
`slave.jar' に保存中

100%[==============================================>] 346,309     --.-K/s 時間 0.09s   

2013-10-29 01:23:31 (3.83 MB/s) - `slave.jar' へ保存完了 [346309/346309]

そして画面表示の通りにコマンドを起動すればJenkinsのノードとしてコネクトされます。
ただしヒープサイズのデフォルト値が結構小さく、メモリを食うようなテストを走らせたときにヒープ不足で落ちることがありましたので
解決策として -Xms, -Xmx を指定しました。

% java \
  -Xms128m -Xmx448m \
  -jar slave.jar \
  -jnlpUrl http://<host:port>/computer/RaspberryPi/slave-agent.jnlp \
  -secret 5796...
10 29, 2013 1:24:45 午前 hudson.remoting.jnlp.Main$CuiListener <init>
情報: Jenkins agent is running in headless mode.
10 29, 2013 1:24:46 午前 hudson.remoting.jnlp.Main$CuiListener status
情報: Locating server among [http://<host:port>/]
10 29, 2013 1:24:46 午前 hudson.remoting.jnlp.Main$CuiListener status
情報: Connecting to <host>:34774
10 29, 2013 1:24:46 午前 hudson.remoting.jnlp.Main$CuiListener status
情報: Handshaking
10 29, 2013 1:24:47 午前 hudson.remoting.jnlp.Main$CuiListener status
情報: Connected

ノード用のワークスペースを作成

ノード作成時に「リモートFSルート」という項目に "/home/pi/jenkins" と設定しました。
これはスレーブノードがワークスペースとして使用するディレクトリになります。
プロジェクト実行前にこのディレクトリを作成しておく必要があります。

% mkdir /home/pi/jenkins

スレーブエージェントは起動したユーザーの権限で動作しますので、
このディレクトリには当該ユーザーが読み書きできるようなパーミッション設定をしておいてください。

Jenkinsプロジェクト設定

特定のノードで実行したいプロジェクトを作る場合は、プロジェクト設定の中で
「実行するノードを制限」のチェックボックスにチェックを入れ、
ラベル式に実行させたいノードのラベルにマッチするような式を書きます。

今回の例で言うと、Raspberry Piのノードのラベルを "ARM-Linux" としましたので
ラベル式にそのまま "ARM-Linux" と入れればOKです。

あとは自由にプロジェクトを作成し、実行するだけです。
以下は適当に作ったサンプルプロジェクトの出力です。
RaspberryPi ノードで実行されたことが確認できます。

おわりに

Raspberry PiをJenkinsのスレーブノードとして動作させるにはそれほど複雑な作業は必要ありませんでしたので、
手軽なARMのテストプラットフォームとしても活用しやすいのではないでしょうか。