run jenkins in ibm containers
TRANSCRIPT
2
おことわり本資料の記載内容は、私が個人的に調べた内容であり、正式な日本 IBMのテストやレビューを受けておりません。内容について、できる限り正確を期すよう努めてはおりますが、いかなる明示または暗黙の保証も責任も負いかねます。本資料の情報は、使用先の責任において使用されるべきものであることを、あらかじめご了承ください。
3
モチベーション
Bluemixには、 Build & Deployがあるけど、使い慣れた Jenkinsを使いたい
現在のところ IBM Containersは、 365 GB 時間 /月まで無料なので、メモリを抑えればタダでJenkins様を雇える(* 1 )
(* 1 )料金情報は常に最新を確認してください: https://console.ng.bluemix.net/pricing/
6
権限の問題
IBM Containersのボリュームは、 NFSで実装されており、デフォルトでは rootユーザでないと書き込めないが、 Jenkinsの Docker版はセキュリティを考慮して、 jenkinsユーザで起動している
一度、 jenkinsユーザを rootグループに入れて、ディレクトリをボリューム上に作ってから、 jenkinsユーザを rootグループから外すという hackが必要参考 : http://stackoverflow.com/questions/31290202/can-i-change-owner-of-directory-that-is-mounted-on-volume-in-ibm-containers/32666280#32666280
7
スピードの問題
IBM Containerのボリュームは、 IOP=0.25に制限されている。お金を払えば IOP=4まで上がるが、上限はそこまで
root@instance-0020f249:/mnt/volume/jenkins# dd if=/dev/zero of=/mnt/volume/ttt bs=1M count=11+0 records in1+0 records out1048576 bytes (1.0 MB) copied, 32.7045 s, 32.1 kB/sroot@instance-0020f249:/mnt/volume/jenkins# dd if=/dev/zero of=/mnt/volume/ttt bs=100k count=11+0 records in1+0 records out102400 bytes (102 kB) copied, 0.600598 s, 170 kB/s
sshで入って、速度を測ってみた結果
参考:自分の PC(一世代前の SATA-SSD)
$ dd if=/dev/zero of=/tmp/xxx bs=1M count=100 oflag=dsync,sync100+0 レコード入力100+0 レコード出力104857600 バイト (105 MB) コピーされました、 1.23954 秒、 84.6 MB/秒
単純に jenkinsディレクトリをボリュームに割り当てたところ、起動の際のWAR展開が 1時間たっても終わらないので諦め。
8
作戦変更
IBM Containers(jenkins)
jenkinsディレクトリ
速度の観点から、 jenkinsディレクトリは、ボリューム上に置かない
ボリューム(バックアップ)rsync
アプリケーション起動時に、ボリュームから、 jenkinsディレクトリに内容を復元する
su -c "rsync -av $JENKINS_VOLUME/backup/_jenkins /var" jenkins
rsync -auv --delete --include jobs/*/config.xml --exclude war --exclude jobs/*/* /var/_jenkins /var/jenkins_home/backup
定期的に rsyncでボリュームにバックアップ。初回は遅いが、次からは差分コピーなので速い。更にワークスペース、ビルドディレクトリは対象から外すことで高速化
9
動かしてみる
以下に材料を置きましたhttps://github.com/ruimo/blue-jenkinsgit cloneするなりブラウザで Download ZIPするなりしてください
Bluemixのアカウント登録とか、 cf tools/pluginの設定などは省略します。以下のドキュメントなどを参照してくださいhttp://www.slideshare.net/unokichi/bluemixdocker-50127214
11
イメージを作成する
build.sh.sampleというファイルが入っているので、これを build.shに変更して中身を自分用に書き換えます$ cf ic build -t YOUR_DOCKER_NAMESPACE/blue-jenkins .
YOUR_DOCKE_NAMESPACEのところを、自分の Bluemix上の Docker registryの名前空間名に変更します。 chmod +x build.shで実行ビットを立てたら実行してください。これでイメージができます
12
イメージの作成
cf ic imagesを実行すると、イメージを確認できます$ cf ic imagesREPOSITORY TAG IMAGE ID CREATED SIZEregistry.ng.bluemix.net/ruimo/blue-jenkins latest eb3d733d3c19 4 hours ago 720.5 MB
13
実行
run.sh.sampleを run.shにリネームして中を書き換えますcf ic group create --name YOUR_HOST_NAME -p 8080 -m 2048 -v jenkins:/var/jenkins_home --min 1 --max 1 --desired 1 -n YOUR_CONTAINER_NAME -d mybluemix.net registry.ng.bluemix.net/YOUR_DOCKER_NAMESPACE/blue-jenkins
YOUR_HOST_NAMEは、 urlの先頭部分でBluemix内で一意である必要がありますYOUR_CONTAINER_NAMEは任意の名前ですYOUR_DOCKER_NAMESPACEは、 build.shの時と同じですbuild.shの時と同様、実行ビットを立てて実行すれば containerが上がりますなおメモリは 2GB(-m 2048)になっているので、課金を避けたい場合は適宜修正(減らして ) ください
14
実行
cf ic psコマンドで状況を確認します$ cf ic ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESefd502f8-1bf registry.ng.bluemix.net/ruimo/blue-jenkins:latest "" 4 hours ago Running 4 hours ago 10.142.187.57:8080->8080/tcp ru-pbpl-iqpv5ivzc4fq-sysmt5rpefcw-server-kzgunlpyk3hq
ステータスが Runningになれば起動していますhttps://HOST_NAME.mybluemix.net/ をブラウザで開いてください。 HOST_NAMEのところは、 run.shの中で指定した YOUR_HOST_NAMEです初回は割と速いと思いますが、次回以降はボリューからのリストアが実行されるため、 10分くらい起動に要すると思います
15
バックアップジョブ
Jenkinsが起動したら、バックアップジョブを作っておきましょう。 Jenkinsのジョブの作成方法は省略します
最初の実行には時間がかかります(全部をボリュームにコピーするので)
rsync -auv --delete --include jobs/*/config.xml --exclude war --exclude jobs/*/* /var/_jenkins /var/jenkins_home/backup
16
注意
cf ic runの自動リカバリ・オプション (--auto)は使わないでください。起動の際のボリュームからのリストアに時間がかかるため、ハングしたと誤認され、削除、開始の無限ループになってしまいます
Jenkins設定を変更した後、バックアップが走る前に何らかの原因でコンテナが再起動されると、変更内容は失われます