Jenkins 勉強会 in 札幌
第一部id:cactusman
アジェンダ• 自己紹介• CI とは• 質疑応答• Jenkins とは• 質疑応答
お前だれよ• HN : cactusman (さぼてん) • 年齢: 0x1f • 出身:関西 • 所属: BeProud.inc, java-ja, Wicket-ja • 言語: Java, ( Python )• 趣味:ボドゲ―
大事なことを初めに• 第四回 Jenkins 勉強会やります!– 10/15
• Jenkins 温泉やります!– 10/9-10/11
• 詳しくはググってください!
CI とは
CI とは• 継続的インテグレーション( Continuous
Integration )の略• XP のベストプラクティスのひとつ• システムのインテグレーション作業 を開
発の初期段階から頻繁に行う
一言で言うと、頻繁にビルドし
ろ
具体的には
コンパイル
UnitTest
パッケージ
結合テスト
デプロイ
システムテスト
チェックアウト
インスペクション
概要図
新しい概念ではない• Martin Fowler の「 Continuous
Integration 」( 2000/09/10 、最終2006/05/01 )
• JavaWorld にて特集 ( 2006/06 、角谷信太郎)
• ナイトリービルドやデイリービルドの延長線上
• 最近だと発展させて Continuous Delivery– 環境構築も含めて
捕捉• CI では自動ビルドや自動テストを推奨している– 自動で実行できなければ、コストがかかり頻繁に
実行できないため• インテグレーション作業の繰り返し– 自動化は推奨しているが、必ずではない– あくまで論文ではで、現実では自動化なくしては
難しい• ツールを使ってもいい– cron でやってもいいですが、 Jenkins のような使い
やすいツールがあるので、そっち使いましょう
メリット• 成果物の品質の保証– ビルドやテストが通らない、といった開発時の不具合
が先送りしにくくなり、早期発見しやすくなる– デグレートが起きにくくなる
• 手戻りコストの削減• 関心ごとの分離–自分の担当以外はとりあえず置いとく
• リソースの有効活用–マシンにできることをマシンへ
デメリット• コストがかかる– 自動テスト作成、メンテナンス– 自動ビルド作成、メンテナンス– CI 専用サーバ– 結合テスト、システムテストの実行
→ そもそもある程度は必要では?
Q. メリットがあるのに、なぜ広まらないのか?
A. 大変だから
大変な理由• 手作業があるとその都度作業が必要• SCM は必須• テストも必須• 開発途中での導入が難しい• ビルドが通らない• チームメイトに理解されない• 予算や人員を割かなければならない• etc ・・・
必須事項• CI サーバ– 物理サーバ or 仮想化
• SCM– Subversion 、 Git 、 Mercurial 、 bazaar ・・・
• ビルドスクリプト– Maven2 、 Ant 、 Rake 、 Gant 、 Gradle 、・・・
• テスト– JUnit 、 TestNG 、 RSpec ・・・
あるといいもの• BTS– JIRA 、 Trac 、 Redmine 、・・・
• インスペクション– FindBugs 、 Cobertura 、・・・
• XFD ( eXtreme Feedback Device )– Nabaztag 、 Ambient Orb 、・・・
XFDエクストリーム・フィードバック・デバイス
最近 CI ( Jenkins )は流行ってる
• CI をやるための環境がそろってきてる– Amazon EC2 などの VPS• 価格や使い勝手の点
– XP (特に TDD )の浸透• テストを書く文化
– Jenkins などのツール類の発展– ツールやノウハウが周知
実際のところ• 事例などでやってることがバラバラ– Rails だと、 Java だと、・・・
• やりたいことと本当にあってるの?– なんかちょっと違う
• やってみると求められるものもバラバラ– こういうのできない?
Why?
みんなやってることが違うから• 言語による文化の違い
– パッケージング?なにそれおいしいの?– 静的解析? LL だよ俺ら
• 最終成果物の種類による違い– Web アプリケーション– GUI アプリ– インストーラつき
• コンテキストによる違い– 開発者– PM– QA
• 目的による違い– ビルドが壊れてるかどうか– システムテスト
• 何をやるかをはっきりしましょう–みんなの頭のなかの CI は違う
• 簡単なことから始めましょう–動かしているものを見せて共通
理解を得る• 難しいことは置いておく–やれることからちょっとずつ
だから
問題やパターン• こっからは CI にちなんだ問題を取り上げ
ます。• パターンについても同様に
スローテスト問題• テスト実行に時間がかかりすぎる– テスト実行数の増加によるところ–非効率なテスト–依存関係• 依存している全モジュールをテスト
– システムテスト的なもの• Selenium とか
• みんないきつくところ• ビルド自体も同様
解消方法• テスト自体のパフォーマンスチューニング– TDD 的なテストは捨てる– DB などはモック化
• 実行単位のスケジューリング– 早く終わるもの、価値の高いものを優先
• 実行単位を細分化– 並列性を上げる
• スケールアップ• スケールアウト(クラスタリング)
狼少年問題• テストが通らない、インスペクションでの警告が常用化する
• その結果、本当に危険なアラートが上がってるのかどうか判断できなくなる–某言語で最近話題になった例のあれとか
• OSS でも割とある• 命名は id:ikikko さん
解消方法• 状態を把握する
– テスト失敗や警告の増減に注目する• テストの最小化
– 変更に強いテストだけにする– TDD 的なテストは捨てる– やる必要があるかどうか常に問う
• 問題のあったところ、デグレートしたところを重点的に– バグは偏在する
• インスペクションで問題のない個所はレビュー後ignore にする
Pre-Tested Commit
• コミットする前にテストを実行するパターン
• CI サーバに差分(パッチ)を送り、テストやインスペクションしてもらう
• オールグリーンならコミット、レッドならコミットできない
• TeamCity ( IntelliJ IDEA )で機能あり• Jenkins でも要望がある• DVCS で代用することも可能?
質疑応答
Jenkins について
注意事項• 生き別れた双子の兄については、聞かない
でください
注意事項• 生き別れた双子の兄については、聞かない
でください• 生き別れた双子の兄によく似た名前の
ゲーム会社についても( ry
注意事項• 生き別れた双子の兄については、聞かない
でください• 生き別れた双子の兄によく似た名前の
ゲーム会社についても( ry• 信託や喰などの中二用語は避けましょう– ベルセルクなどの漫画の見過ぎです
Jenkins
• OSS の CI ツール– メインコミッターは川口耕介さん
• 簡単、手軽、親切– JavaWebStart で起動– 「 java -jar jenkins.war 」起動– 好きなサーブレットコンテナにデプロイ可能– 設定は Web の画面– DB が不要
• プラグインで機能拡張• 各OS ごとにインストーラがある
– サービス(デーモン)実行は楽々• CI のデファクトになってる?
Jenkins ( CI サーバ)の役割• チェックアウト• ビルドスケジュール管理• 通知• レポーティング• ログの保存
よくある誤解
Jenkins って Java 用でしょ?Java知らないと使えないんで
しょ?
誤解への回答• Java は Jenkins を動かすために必要で
あって、知らないと動かせないものではない
→ よって、 Java の知識はなくてもいい• Java だけではない–sh や bat を使えるし、 plugin も豊富にあ
る→LL などでは sh をよく使っている
sh や bat を使うときの注意• 環境変数、特に PATH などが通ってないた
めに動かないことがある• Jenkins としてはシンプルに sh や bat を呼び出しているだけで、環境変数などはセットしていない
• 環境変数をそろえるスクリプトを sh や bat実行の中で行い、そのあとにビルドスクリプトを実行すればいい
簡単なデモ
Jenkins内の概念• Job– 実行単位
• View–複数の Job を見せるもの– top ページのあれ
• User– コミット、 Jenkins の操作する人–認証と認可
より高度な機能• トリガー• Plugin• Job のチェーン• CLI• クラスタリング• その他
トリガーについて• Jenkins のトリガー実行– http://localhost:8080/job/hoge/build?
delay=10sec• hoge という名前の job を実行するが、 10秒間の待
ち合わせがある• 使用用途は SCM にコミット、即実行など
Plugin について• 種類
– SCM– ビルドトリガー– ビルドツール– 通知– リポート– ポストビルド– ・・・
• まずは Wiki を調べましょう– こういう機能ないかな、と思ったものは結構あります– https://wiki.jenkins-ci.org/display/JENKINS/Plugins
• Plugin だけで話ができてしまうボリューム– 400 以上
Job のチェーン• Job を連続して実行できる• Job の依存関係を作れる– A→B→C 、 B→D
• 何がいいのか?– フェーズを分けれる– プロジェクトの依存関係ごとにできる
CLI
• Jenkins がローカルだろうが、リモートだろうが動作する
• java -jar jenkins-cli.jar [-s JENKINS_URL] command [options...] [arguments...]
• 定形処理や LL からの使用で• CLI 大好きな人は使ってください
Jenkins のクラスタリングについて• マスタ / スレーブ方式– マスタは命令を出す– スレーブを命令どおりに仕事する– マスタはスレーブの結果を集める
• スレーブの設定は ssh がおすすめ– スレーブ側の ssh の設定ができていればスレーブ
エージェントを自動で送り込める• スレーブにラベルを付けれる– Windos のみや Linux のみ、実行環境のバージョン
や DB ごとなどをグループ化
その他• Jenkins の設定ファイル、作業ディレクトリ– デフォルトは ${USER_HOME}/.jenkins– 環境変数 JENKINS_HOME で指定可能– 作業ディレクトリ内の詳細について
• http://d.hatena.ne.jp/masanobuimai/20110903
• Job などの設定ファイルは XML– 実態はインスタンスをシリアライズしたもの– どうしても手で書き換える必要があるな
ら、 Jenkins を落としたのちにすること• 他にも探せば便利な機能はいっぱい
質疑応答
第二部へ続く!