Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Hudson (JJUG CCCにて)

14,275 views

Published on

  • Be the first to comment

Hudson (JJUG CCCにて)

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

×