SlideShare a Scribd company logo
川口耕介 Senior Staff Engineer Sun Microsystems, Inc.
自己紹介 Sun Microsystems 勤務 JAXB, JAXP, JAX-WS, Metro, GlassFish 等の開発に関わる 会社はインド人ばかりです 未踏ユース 天才プログラマ 本業を助けるツールが、 気がついたら本業に 他にもプロジェクト多数 com4j, args4j, parallel-junit, sorcerer, nlink, txw, xsom, …
お品書き Hudson とは デモ 応用例 拡張性について
コンピュータは安くなる一方 486 100MHz + 8MB RAM =  25 万 1995 2008 Quad core 2.4GHz + 4GB RAM   =  10 万
技術者は高くなる一方 電子・計算機技術者の年収の中間値   $53,700 ネットワーク技術者の年収の中間値   $81,850 出典 : http://www.tms.org/pubs/journals/JOM/9505/Beazley-9505.html 1994 2006
 
ちょっと計算してみよう 給与 =$80,000/yr 会社にとっての負担 =$160,000/yr ≒  $500/day ≒  $60/hr Amazon EC2: $0.10/hr
計算機を働かせる 1 台目の有効活用は簡単 数台のサーバなら使っている? ほとんど暇にしていませんか? 数多くの計算機を使い倒すのは意外に難しい 自動化テスト コードの静的な品質検査 ワークフロー管理
そこで  “ 継続的インテグレーション ”  (CI) サーバで常時ビルド&テスト サーバをこき使う第一ステップ 機械を湯水のごとく使い人間の生産性を向上 人間が 15 分でも節約できたら勝ち 夜間ビルドの延長と考えるもよし よいツールを使わないと生産性は上がらない
そこで Hudson Java で実装された CI サーバ ソースコードの変更を監視 ソフトウェアをビルド テストを実行して結果を集計 ビルドの記録や結果を公開 人間間コミュニケーションの必要性を減らす ビルド・テストの仕方は中央に もう人間に聞かなくてもいい 特に分散されたチームに有用 あたかも新たなチームメンバの様 もしくは頼りになる執事
Hudson の概要 Java.net 上のオープンソースプロジェクト 簡単インストールとセットアップを重視 拡張性の高いアーキテクチャ 80 を越えるコミュニティ製プラグイン とても活発 85x12 人月相当のコードらしい 4 年の間に 250 のリリース 93 人のコミッター
九ヶ国語にローカライズ
あらゆるところで使われてます
新しいコミュニティ運営方法 古典的な FOSS 開発手法 体育会系。新人は玉拾いから Hudson での開発手法 「 10 年は泥のように働け」「無理です」 誰でもまずコミッタにする 関連コードを同じリポジトリに集める コミッタなら core でも plugin でもコミット可能 「できる」と「自分勝手にやる」には大きな距離 コードの所有 ( と移動 ) を積極的に肯定 昔から「デベロッパ心と秋の空」と申します
エクストリーム・リリースサイクル 現在のリリースモデル 4-6 RFEs/ バグ修正毎に新リリース 大体一週間に一度か二度 現在バージョン 1.255 テストが通るなら出荷しない理由は何もない 自動でできないテストはテストじゃない バグ修正を届けるまでの時間を劇的に短縮 好評
基本機能 ソースコードをチェックアウト CVS, Subversion, ClearCase, Mercurial, Accurev, Perforce, StarTeam, … ビルドを実行 Ant, Maven, shell script, NAnt, … 結果を記録 フィードバックループを作る RSS feeds E-mail/IM による通知 トレイアプリケーション 各種のツール統合 findbugs, emma, cobertura, VMWare, …
 
お品書き Hudson とは デモ 応用例 拡張性について
依存関係の追跡 5 分 30 分
依存関係の追跡 JAXB RI  ビルド  #100 バグ A の修正 JAXB RI  ビルド  #101 バグ B の修正 JAXB RI  ビルド  #102 バグ B の追加修正 JAXB  テスト  #35 問題なし JAXB  テスト  #36 退行
Hudson 利用のベースライン 最初のステップ:ビルド全工程を1ジョブに ソースの取得 Ant/Maven/etc ビルド テスト実行 Findbugs やドキュメント生成 完了 フィードバックサイクルを早めるには?
部品に分解 フィードバックが早まる 分割統治はいずれにせよ良いこと 障害の切り分けが容易に full Metro build #10 full Metro build #11 時間 JAXB #10 JAXB #11 JAXB #12 JAX-WS #20 JAX-WS #21 JAX-WS #22
テストとビルドの分離 テストの実行時間が圧倒的に長いはず テストは並列に走らせるのが容易 JAX-WS #10 Unit test with GF Unit test with Tomcat SQE test JAX-WS #11 JAX-WS #12 … Test w/o container 3OS x 2JDK = 6 tests 時間
テストとビルドの分離 ファイル指紋でビルド・テストの関連を追跡 テストの失敗とコードの変更を関連付け 永続リンクを使ってテスト側からビルドを取得 Ant でも同様の事ができます $ wget –O foo.zip http://server/hudson/job/foo/lastSuccessfulBuild/   artifact/foo.zip
ビルド昇進
ビルド昇進 一つのビルドに未来を託さない とにかくせっせとビルド とにかくせっせとテスト テストをパスしたらビルドを昇進させる
昇進したら… より高価な QA を開始 サーバに配備 上流プロジェクトに結合 Maven リポジトリに配置 …
分散ビルド マスター HTTP リクエストを処理 重要な情報を保管 スレーブ 83K の小型プログラムのみ ローカルプロセスを管理 追加・廃棄が容易 双方向 バイトストリーム
より多くのマシンを使う クラウドと連携 自前でビルドクラスタを持つのは無駄が多い 負荷にあわせてクラスタサイズの自動調整 テストに特に有用 network.com と EC2 が当面の目標 現在 開発中
より効率よくマシンを使う 仮想マシンの活用 テスト環境を仮想化 必要な環境を必要な数だけ起動 VMWare と VirtualBox が当面の目標 現在 開発中
ビルド以外にマシンを使う 分散処理が出来るツールが増えてきた Selenium, Hadoop, JMeter, … Hudson を分散プラットフォームにしちゃえ クラスタは 1 つで十分 インストール・配備の簡単さを利用 シナリオ Hudson に Selenium プラグインをインストール Hudson が勝手にスレーブに Selenium を配備 Hudson クラスタが Selenium クラスタに早代わり 現在 開発中
お品書き Hudson とは デモ 応用例 拡張性について
サーバで動く開発ツールは多々あれど…
Remoting API RESTful API  でデータを XML/JSON/Python スクリプトで取得 <mavenModuleSet> <name>glassfish-v3</name> <url>http://kohsuke.sfbay/hudson/job/glassfish-v3/</url> <color>blue</color> <lastSuccessfulBuild> … </lastSuccessfulBuild> …
Eclipse  プラグイン
NetBeans  プラグイン
バグトラッカーと連携
プラグイン開発環境 Maven プラグインで全て出来ます 初期スケルトンの作成 コンパイル時のアノーテーション処理 デバッグ パッケージ化 リリース チュートリアルもあります
まとめ 初めての方は Hudson をどうぞ ! 始めるのは簡単 使っている方は応用編をどうぞ 開発者募集中 誰でもコミッタになれます http://hudson.dev.java.net/
おまけ
Nothing to see beyond here. Move on!
Why do I care? Life before Hudson Dev makes a change Monday AM Nightly QA run finds a bug Monday night Dev fixes it Tuesday Lot of wasted time Life after Hudson Dev makes a change Monday AM Hudson finds a regression 30 mins later Dev can fix it before lunch
Why do I care? Life before Hudson QA test runs every night, results sent out in e-mail After the enthusiasm of the 1st week is gone, nobody looks at them anymore Regressions go unnoticed until it’s too late Life after Hudson Tests run Hudson after every commit E-mail sent out only when tests start failing So it manages to keep people’s attention
Why do I care? Life before Hudson A blocker bug is discovered in a library created by another team Fix is obvious but you don’t know which branch to commit a change …  and you don’t know how to run full tests either Your only option is to write to Ashok and ask him to fix it Too bad if he’s on a family vacation to Disneyland Life after Hudson Hudson knows where the code is, how to build & run tests for it Competent devs can help, even w/o project-specific knowledge
Got the idea? Automation Reduce turn-around time Make things transparent Remove people from the loop Save people ’ s time Push jobs to servers, keep workstations idle for you
Beyond Java People are using Hudson for non-Java projects Ruby support Parse unit test results with CI::Reporter Invoke ruby script as the build Python support Parse test results Pylint report integration .NET support NAnt, NUnit, FXCop, MSBuild, and Visual Source Safe integrations You can always invoke anything through shell script
Dependency Tracking Dependency tracking SQA finds a test failure. Dev thinks he just fixed it. Did that fix went into that test run or not? I made a large change. I want to check that the corresponding SQA test result is good We are close to a release. We need tags from all the dependencies. Which versions are we using today? Hudson can tell you “ JAXB unit test #35 tested JAXB RI #192 ” “ JAX-WS #52 uses JAXB #185 and FI #52 ”
FindBugs integration
Tracking changes
…  and more Browse workspaces Build time trend report
Simplify Installation People are lazy (at least I am) Many won’t even try if it’s hard to install Running Hudson is easy! $ java -jar hudson.war
Simplify Configuration People make silly mistakes (at least I do) Think about your junior engineers So Hudson does … Let all configurations from web UI Try to minimize # of configs Inline help Extensive on-the-fly form field validation Don’t just point out problems, suggest fixes Proactively detect common problems Clock out-of-sync, low disk space
Extensibility points It’s all for the extensibility Stapler enables seamless UI integration Deployment-free distributed computing Most model objects are pluggable SCM, job type, builder,  publisher, trigger, … These are where plugins can contribute Built-in features use the same extensibility mechanism
…  and more OpenSearch Build Promotion
Plugin Development Environment No, actually this was my first time using maven…, I just followed the directions on your webpage and I was off and running. Peter Franza  I had a similar experience:  with no prior maven experience, I had my first plugin up & running so fast, I couldn't quite believe I had gotten it to work.  :) Adam Ambrose
Distributed Builds Go distributed once you see >2 concurrent builds Builds and tests are highly CPU/memory/disk intensive Use ssh+public key on Unix to let Hudson manage slaves Automatic slave launch when Hudson restarts Auto-reconnect for dropped connections Use cygwin ssh on Windows Cygwin helps keep the platforms look uniform It’s possible to run this in different ways Like using Web Start
Distributed Builds Better to keep slaves look alike Don’t let builds depend on particular slaves Slaves come and go Use “labels” to classify Improving our story around VMs as slaves Prepare N environments, and run as many clones as the build needs Improving our story around cloud computing as slaves Don’t even own computers anymore
Simplify Installation People are lazy (at least I am) Many won’t even try if it’s hard to install Running Hudson is easy! Wait, it gets even easier Start by just a mouse click $ java -jar hudson.war
ソフトウェアの開発形態の変化 従来のモデル A 社が開発したソフトウェアを B 社がシステムに構築して C 社に納入 人手を越える時に高いオーバーヘッド 長いリリース・サイクル
増えつつある新しい形態 開発から運用まで社内で閉じている 情報技術が戦略的に重要に Wall Street, Amazon, Google,  はてな , Linked-In, … 開発から運用までのパイプラインができる 所謂 “ Application Lifecycle Management”

More Related Content

Hudson (JJUG CCCにて)