jenkinsのすゝめ - 継続的インテグレーションと継続的デリバリー
DESCRIPTION
TRANSCRIPT
2012/05/29(火) @suzukij
Jenkinsについて
デモ
CI 継続的インテグレーション
CD 継続的デリバリー
チームでの運用例
まとめ
Jenkinsを現場で使っている人? ◦ 自動ユニットテスト
◦ 自動ビルド
◦ 自動デプロイ
Jenkinsに関する本読んだ人?
世界で最も使われている 継続的インテグレーションツール Continuous Integration (CI) Javaで書かれたOSSのCIサーバ ◦ warファイルで提供される
導入、設定が簡単 ◦ ほぼすべての設定をブラウザから操作できる
Cron(スケジューラ)の強化版 ◦ 人間が介在せずとも実行できるようなスクリプトを
自動で繰り返して実行し、結果を収集して表示
CIの実践をサポートするツール ◦ 高い拡張性
◦ 豊富なプラグイン(450以上)
①公式サイトからDL
http://jenkins-ci.org/
②起動 以下コマンドのみ
java –jar jenkins.war
③ブラウザからアクセス
http://localhost:8080/
とりあえずシンプルなデモ
①ジョブの作成
②ジョブの実行
③ジョブ結果の通知
なんとなく分かったところで
JavaソースからJar(war)ファイルを作成するところまでをデモ
①SVNリポジトリからソースを取得 ②ユニットテスト ③ビルド(Maven) ④静的コード解析 FindBugs, PMD/CPD, CheckStyle,
Javadoc, emma
なんとなくイメージは掴めたでしょうか?
Jenkinsでどんなことができるのか
Jenkinsを実際のプロジェクトでどう使うのか
もともとはXPの一部の「結合テストを頻繁に実施する」という作法
ビルド、テスト、コードの品質検査など、定型的で反復可能な作業を自動化し、繰り返しこまめに実行することで省力化を図ること
自動化による省力化によって開発者が設計をしたりプログラムを書いたりというより創造的な作業に集中できるようにする全般のこと
繰り返し実行
実行を自動化 ⇒省力化を図る
すばやいフィードバック ◦ コミットのたびにテストやコードの品質検査をする 問題を早期発見できる 小さな修正を素早くおこなうことができる
⇒問題の発見、対応を先送りしない ⇒リリース直前まで 問題が溜め込まれるのを防ぐ
見える化 気付ける化 ◦ ユニットテストやビルドの結果を時系列に表示
◦ コード検査/カバレッジ取得の結果をグラフで表示
⇒プロジェクトの健康状態を把握
◦ ビルド手順、テスト手順をスクリプトとして集約
⇒Jenkinsで動くもののみが管理される
⇒長ったらしい手順書が陳腐化することもない
⇒属人化を防ぐ
以上、CIの簡単な説明です。
CIについての質問
アジャイルマニフェストの条文
「我々がもっとも価値を置くのは、価値のあるソフトウェアを早いうちから継続的にデリバリーすることを通じて顧客を満足させることである」
なんだか難しそうだけど まず CIを通じて出来上がったモジュールをテスト環境、本
番環境へ自動でリリースできるようにし、反復可能なプロセスを構築する
いつでも、素早く、繰り返し可能なリリース デプロイボタンを1度クリックするだけでテスト済み/
コード検証済みのモジュールが完全な状態でテスト環境や本番環境へリリースすることができる。
数秒で完了させることができる。
望むバージョンを好きな環境へ 自分の望むバージョンのアプリケーションを好きな環
境に自分でリリースできる。 問題が発生してもすぐにリリース前に状態に戻せるよ
うにする。
リリースする権限はPJに関わるメンバに 開発者だけでなくチームに関わるメンバにリ
リースする権限を持たせる
(テスター、サポート担当者、運用担当者など)
チーム間の作業を効率化 ◦ 各チームメンバが自身でビルドできるようになるこ
とで正しいビルドが渡されるのを待つ必要がなくなる (無駄なメールのやりとり、申請が不要に)
◦ リリースがボタンひとつで実行できる 例えば… テスター:アプリの旧バージョンと新バージョンの変更を
検証することができる とか
サポート担当者:アプリをテスト環境にデプロイし、欠陥を再現することができる とか
運用担当者:ディザスタリカバリの演習の一環としてビルドを本番環境へデプロイできる など
リリースの負担を減らす ◦ 小さく、早いサイクルでリリースができるようになる
◦ 手順書に従ってビクビクしながら手動でリリースする必要がなくなる
◦ リリース後に問題があった場合でも容易に前の状態に戻すことができる
素早いフィードバック ◦ CIと同様のメリット
以上、CDの簡単な説明です。
CDについての質問
実行までを自動化 (主にビルド、デプロイ) ◦簡単に実行できるようにする ◦何度も繰り返せるようにする ◦手順やルールをJenkinsに寄せる 属人化を防ぐ ○○さんしか知らない作業 更新されていない手順書
↑×ダメ絶対
素早くこまめに ◦統合の間隔は短く、小さく
◦問題の早期発見、早期対応
◦統合に関連するリスクを減らす
ビルド、デプロイ作業のような単純で面倒で面白くない
タンポポワークは
Jenkinsさんに任せてしまえ
結果だけを教えてもらおう
以上、駆け足でJenkinsとCI、CDについて簡単に説明させてもらいました。 CI、特にCDはプロジェクトチーム全体に関わることなので現実にはなかなか難しいと思います。 ですが日頃から各プロセスについて改善を続けていけば少しずつ導入できると思っています。 (CI、CDは少しずつ一歩一歩が重要)
初めての自動化には大きな痛みが伴いますが受ける恩恵は計り知れないくらい大きいです。 2年以上CIを実践しているものの、いまだにイケていないところがたくさんあるのですが導入する価値は大いにあると思っています。
みなさんもJenkinsを使ってCI、CDに取り組んでみてはいかがでしょうか?
Jenkinsを使った作業の自動化はすぐに個人でも始めることができます。
まずはローカルで動かしてみませんか?
以上、ご静聴ありがとうございました。
■日程
2012/07/29(日) 11:30 – 17:30
■場所
法政大学 市ヶ谷キャンパス
http://connpass.com/event/467/
おすすめの書籍
Jenkins実践入門 ビルド・テスト・デプロイを自動化する技術
Jenkins(カエル本)
継続的デリバリー
ビルド ◦ Ant (ActionScriptをビルド→swf)
◦ Maven(Javaビルド→war、ユニットテスト、JavaDoc生成)
コードの品質検査
◦ PMD/CPD(コードの重複、コピペ、DRY原則のチェック)
◦ FindBugs(潜在バグのチェック)
◦ CheckStyle(コーディングルールのチェック)
◦ タスクのチェック(ソースの ”TODO” や ”FIXME” を検出)
テスト ◦ JUnit(ユニットテストの実行)
◦ Cobertura(テストカバレッジの取得)
DB環境構築(Oracle10, 11, Postgres8, 9, SQLServer2005, 2008) ◦ テスト環境DBのテーブルをドロップ、作成、マスタ登録、テストデータ登録
デプロイ(Tomcat6, 7, WebSphere8) ◦ Deploy(APサーバへのデプロイ、アプリ再起動)
テスト環境に対してAPIのテスト(AP, DBの上記組み合わせ)
◦ AP 6 * DB 3 = 18パターン
◦ JUnitを実行し、テスト環境に対してHTTPリクエスト、期待するレスポンスのXMLが返ってくるか検証
通知 ◦ メール通知(各ジョブが失敗した時のみ結果を通知)
◦ IRCプラグイン(各ジョブが完了した時に結果を通知)
その他 ツール系 ◦ テスト環境のヘルスチェック(スケジュールで5分おき)
◦ バックアップ(スケジュールで毎日)
◦ ER図をもとにDB定義書.xls、DB定義.htmlを生成(ワンクリック)