SlideShare a Scribd company logo
Continuous DeliveryとJenkins
川口耕介




            ©2010 CloudBees, Inc. All Rights
                      Reserved
川口耕介って誰?
• Jenkinsクリエイター&プロジェクトリー
  ド
• アーキテクト @ CloudBees
• その前は…
 – RELAX
 – JAXB, JAX-WS, JAXP等 @ Sun
   Microsystems
 – GlassFish v3のモジュールレイヤの一部など
 – FreeTrain

          ©2010 CloudBees, Inc. All Rights   2
                    Reserved
jenkins-ci.org
•   JavaによるCIサーバ/OSS
•   7年位やっている
•   使うのが簡単
•   プラグインによる機能拡張
    – 現在 450+
• 世界中で広く普及
    – インストールベース: 31K+



                 ©2010 CloudBees, Inc. All Rights   3
                           Reserved
©2010 CloudBees, Inc. All Rights   4
          Reserved
©2010 CloudBees, Inc. All Rights   5
          Reserved
Sparc ロードマップ




        ©2010 CloudBees, Inc. All Rights   6
                  Reserved
計算能力の向上
• 計算能力はどんどん増える
• 計算能力はどんどん安くなる



• 計算能力の費用対効果が上がる
• 開発者の費用対効果は変わらない
• ソフトウェア産業では
  ますます計算機の効率よい活用が重要に

       ©2010 CloudBees, Inc. All Rights   7
                 Reserved
Photo by skreuzer




©2010 CloudBees, Inc. All Rights          8
          Reserved
クラウド・仮想計算機
• VMWare, Xen, KVM, …
• EC2, Rackspace



• 見かけのマシン数はどんどん増える
• シングルシステムイメージの恩恵は受け
  られない


             ©2010 CloudBees, Inc. All Rights   9
                       Reserved
聖徳太子も七台まで




      ©2010 CloudBees, Inc. All Rights   10
                Reserved
©2010 CloudBees, Inc. All Rights                           11
          Reserved
           http://www.flickr.com/photos/19188303@N02/4801131166/
クラウド・仮想計算機
• VMは計算機をスライスするだけではな
  い

• プロビジョニングのリアルタイム化・自
  動化
 – テンポラリ計算機
  • テスト実行毎に独立したクローンを用意
 – QAからプロダクションに再配備の必要なし


        ©2010 CloudBees, Inc. All Rights   12
                  Reserved
デプロイメントモデルへの影響



                                  ロードバラン
                                     サ




 App v7


          Building Cloud Tools for NetFlix: http://www.slideshare.net/joesondow/building-cloudtoolsfornetflix-9419504



                            ©2010 CloudBees, Inc. All Rights                                                     13
                                      Reserved
デプロイメントモデルへの影響



               ロードバラン
                  サ




 App v7                                      App v8




          ©2010 CloudBees, Inc. All Rights            14
                    Reserved
デプロイメントモデルへの影響



               ロードバラン
                  サ




 App v7                                      App v8




          ©2010 CloudBees, Inc. All Rights            15
                    Reserved
デプロイメントモデルへの影響



               ロードバラン
                  サ




 App v7                                      App v8




          ©2010 CloudBees, Inc. All Rights            16
                    Reserved
デプロイメントモデルへの影響



               ロードバラン
                  サ




 App v7                                      App v8




          ©2010 CloudBees, Inc. All Rights            17
                    Reserved
デプロイメントモデルへの影響



               ロードバラン
                  サ




 App v7




          ©2010 CloudBees, Inc. All Rights   18
                    Reserved
クラウド・仮想計算機
• 小さなスケールで並列化を奨励する
  コストモデル
 台数                        台数




              時間                          時間

       ©2010 CloudBees, Inc. All Rights        19
                 Reserved
とにかく横に並べればよい
• スローテスト?




        ©2010 CloudBees, Inc. All Rights   20
                  Reserved
あらゆる階層でテストの並列実行
• 複数スレッドで
 – 拙作 parallel-junit
 – TestNGとか
• 複数プロセスで
 – 拙作 Maven JUnit plugin
 – Maven Surefire
• 複数マシンで
 – マトリックスプロジェクト


                ©2010 CloudBees, Inc. All Rights   21
                          Reserved
クラウド・仮想計算機:再び
• 自動化への更なる拍車
 – EC2 → RightScale
 – Chef, Puppet
• ミドルウェア・ツールなどのインストー
  ルも非対話的に
 – 複雑な自動化がより簡単になる




              ©2010 CloudBees, Inc. All Rights   22
                        Reserved
開発ツールの自動化の進展
• 非対話的ビルド
 – Visual Studio → MSBuild
• 実行結果を機械可読にする
 – CVS → Subversion
 – テストレポート


• 今や対話モードonlyなど考えられない


               ©2010 CloudBees, Inc. All Rights   23
                         Reserved
開発ツールの自動化は今後も続く
• インストールの自動化
• 実行経過の機械可読化
 – 構造化・多層化
  [INFO] ------------------------------------------------------------------------
  [INFO] Building Test harness for Jenkins and plugins 1.406-SNAPSHOT
  [INFO] ------------------------------------------------------------------------
  [INFO]
  [INFO] --- maven-clean-plugin:2.4.1:clean (default-clean) @ jenkins-test-harness ---
  [INFO] Deleting /home/kohsuke/ws/jenkins/jenkins/test/target
  [INFO]
  [INFO] --- maven-enforcer-plugin:1.0:enforce (default) @ jenkins-test-harness ---
  [INFO]
  [INFO] --- maven-enforcer-plugin:1.0:display-info (default) @ jenkins-test-harness ---
  [INFO] Maven Version: 3.0.1
  [INFO] JDK Version: 1.6.0_20 normalized as: 1.6.0-20
  [INFO] OS Info: Arch: amd64 Family: unix Name: linux Version: 2.6.32-31-generic
  [INFO]
  [INFO] --- maven-remote-resources-plugin:1.0:process (default) @ jenkins-test-harness ---
  [INFO]
  [INFO] --- maven-resources-plugin:2.4.3:resources (default-resources) @ jenkins-test-harness ---
  [INFO] Using 'UTF-8' encoding to copy filtered resources.
  [INFO] Copying 12 resources
  [INFO]
  [INFO] --- gmaven-plugin:1.0-rc-5-patch-2:execute (preset-packager) @ jenkins-test-harness ---
  [INFO]
  [INFO] --- maven-stapler-plugin:1.15:apt-compile (default-apt-compile) @ jenkins-test-harness ---
  [INFO] Compiling 46 source files to /home/kohsuke/ws/jenkins/jenkins/test/target/classes
  Note: Generating org/jvnet/hudson/test/ExtractChangeLogParser/FileInZip.javadoc
  Note: Generating org/jvnet/hudson/test/ExtractChangeLogParser/ExtractChangeLogEntry.javadoc
  Note: Generating org/jvnet/hudson/test/ClosureExecuterAction/doIndex.stapler
  Note: Some input files use or override a deprecated API.
  Note: Recompile with -Xlint:deprecation for details.




                                    ©2010 CloudBees, Inc. All Rights                                  24
                                              Reserved
開発ツール自動化の天王山




      ©2010 CloudBees, Inc. All Rights   25
                Reserved
SaaSの台頭
• Sauce OnDemand
 – レンタルSelenium




            ©2010 CloudBees, Inc. All Rights   26
                      Reserved
SaaSの台頭: deviceAnywhere




           ©2010 CloudBees, Inc. All Rights   27
                     Reserved
SaaSの台頭: CloudBees DEV@cloud
• Jenkins as a Service




               ©2010 CloudBees, Inc. All Rights   28
                         Reserved
SaaSの台頭
• プロビジョニングも急速・簡単・自動
• Just-in-time化
• 従量制料金モデル
  台数                       台数




                 時間                          時間

          ©2010 CloudBees, Inc. All Rights        29
                    Reserved
開発環境をとりまく大きな流れ
• 過剰ともいえる計算能力
 – 物理的制約・コストモデルから並列化へ
• 色々な人のおかげで自動化が簡単に
 – 計算機群、計算機、OS、ミドルウェア、ツー
   ル
 – クラウドで、VMで、SaaSで


• 執事が必要
 – 多くのサービスと潤沢な計算機を指揮する執
   事が
          ©2010 CloudBees, Inc. All Rights   30
                    Reserved
©2010 CloudBees, Inc. All Rights   31
          Reserved
Jenkinsは分散ビルドに対応して5年
• 100+の計算機とその利用状況を把握する
  基盤がある
• 多数の計算機にまたがってプラグインを
  実行する仕組みがある




        ©2010 CloudBees, Inc. All Rights   32
                  Reserved
コミットの検証済みマージ
ありあまる計算機を使いこなす方法:その1




           ©2010 CloudBees, Inc. All Rights
       ©2010 CloudBees, Inc. All Rights Reserved
                       Reserved
CIのジレンマ
• CIでローカルの仕事がサーバに移った?
 – コミットをしないとJenkinsにテストしても
   らえない
 – でもコミットが壊れていたらみんなに迷惑
   が掛かる
 – サーバでテストしたいのにローカルでテス
   トする羽目に




          ©2010 CloudBees, Inc. All Rights   34
                    Reserved
大規模プロジェクトのジレンマ
開発者が問題のあるコミットをする確率が
一定なら、チームが大きくなる程何かの問
題が生じる確率は限りなく100%に近づく

100%
80%
60%
40%
20%
 0%
       0   5   10   15       20



                    ©2010 CloudBees, Inc. All Rights   35
                              Reserved
解決:検証済みマージ
• 開発者はブランチにコミットする
• Jenkinsがブランチをテストする
• OKならばJenkinsがトランクにマージす
  る
開発者1


開発者2



トランク



         ©2010 CloudBees, Inc. All Rights   36
                   Reserved
恐れることなかれ!
• 実際にはせいぜいこんな感じ
 – rebaseを使えばtrunkからあまり外れない
 – コードを書くペースはテスト実行よりずっ
   と遅い




         ©2010 CloudBees, Inc. All Rights   37
                   Reserved
利点
• 間違いをしても他人に影響しない
 – 気軽にコミットできる

• テストはサーバで走る
 – 大規模なテストや環境依存のテストも

• テストは非同期に走る
 – 満足する変更をしたら、すぐ次の作業へ
 – テスト実行待ち時間なし

        ©2010 CloudBees, Inc. All Rights   38
                  Reserved
検証済みマージを階層化
• JavaSE, NetBeansはこれに近い

                          master
                           repo




    team                   team               team
    repo                   repo               repo




           ©2010 CloudBees, Inc. All Rights          39
                     Reserved
やりかたの詳細
• Subversion Merge Plugin
• Git Plugin
• Gerrit Plugin




              ©2010 CloudBees, Inc. All Rights   40
                        Reserved
デプロイメントの自動化
ありあまる計算機を使いこなす方法:その2




           ©2010 CloudBees, Inc. All Rights
       ©2010 CloudBees, Inc. All Rights Reserved
                       Reserved
要するに…

ビルドができた
   ら
どこかで動かそ
   う                                       というこ
                                           と



        ©2010 CloudBees, Inc. All Rights          42
                  Reserved
デプロイされる前に検証
• コンパイルが通った ≠ デプロイしてもよ
  い

• そこでパイプライン
 – 徐々に大掛かりなテストを実行
 – 失敗したらそこでストップ
 – ふるいに掛けて無駄なテストをしない
         Unit
 Build                   Int. Test                 Staging   UAT
         Test

                ©2010 CloudBees, Inc. All Rights                   43
                          Reserved
パイプラインの作り方:その1
• ウォーターフォールモデル
                 ビルド



                               結合テスト



                                          品質検査
• 上流・下流プロジェクトで繋ぐ
• 実行可能プログラムをコピーする                                デプロイ




       ©2010 CloudBees, Inc. All Rights             44
                 Reserved
流れ

                                                                 時間

ビルド   ビルド   ビルド                     ビルド              ビルド   ビルド



       結合テスト                 結合テスト                     結合テスト


                                                                 デプロ
                         デプロイ
                                                                  イ




                  ©2010 CloudBees, Inc. All Rights                45
                            Reserved
ビルドパイプライン・プラグイン




      ©2010 CloudBees, Inc. All Rights   46
                Reserved
Promoted Buildsプラグイン
• プロセスフローではなく状態遷移を考え
  る
 – 状態遷移の必要条件を考える

                          品質検査
       ビルド合格                                             試験運用済
                           合格

   •   コンパイル成功        •   カバレッジ 60%以                 •   UAT環境で三日以
   •   ユニットテスト通           上                              上動作
       過              •   結合テスト通過




                  ©2010 CloudBees, Inc. All Rights                   47
                            Reserved
昇進モデルの利点
• 非同期
 – 並列処理・リトライ可能性
• 枝分かれしたりと柔軟な形
• 安定的
 – 昇進条件の詳細の調整が簡単
 – チームとチームの境界はデータなので
• トリガの呪縛からの解放
 – 契機になるイベントは何でもよい

        ©2010 CloudBees, Inc. All Rights   48
                  Reserved
追跡可能性 (traceability)




            ©2010 CloudBees, Inc. All Rights
        ©2010 CloudBees, Inc. All Rights Reserved
                        Reserved
©2010 CloudBees, Inc. All Rights   50
          Reserved
機械による追跡可能性
      • システム間に散在する情報を機械で追跡
          – Dev: コミットID
          – QA: バグID
          – QA: テストの実行記録
          – Op: デプロイの記録、現在実行中のバージョ
            ン




                            ©2010 CloudBees, Inc. All Rights
©2010 CloudBees, Inc. All             Reserved
                                                               51
CIサーバは三界の架け橋
• ソースコードはcommit IDで識別する
• バイナリはチェックサムで識別する
 – Jenkinsではfingerprintと呼んでいる


• バイナリを使うたびにチェックサムを取
  る
 – テストで
 – 運用で
 – 統合先で
• 「名寄せ」する
            ©2010 CloudBees, Inc. All Rights   52
                      Reserved
追跡可能性とパイプライン

                                                                 時間

 1a5d a820    83ad                      2f03             02d9 ecda
ビルド ビルド      ビルド                       ビルド              ビルド ビルド


           1a5d                      83ad                       2f03
       結合テスト                    結合テスト                      結合テスト


                              1a5d                                      2f03
                                                                       デプロ
                            デプロイ
                                                                        イ




                     ©2010 CloudBees, Inc. All Rights                    53
                               Reserved
フィンガープリントの活用




      ©2010 CloudBees, Inc. All Rights   54
                Reserved
バイナリインテグレーションの奨め
• バイナリをリビルドしない
 – 時間の節約
 – 追跡性の向上
 – 環境による差異の排除




        ©2010 CloudBees, Inc. All Rights   55
                  Reserved
余談:分散バイナリリポジトリ
• 「コミットと共有の分離」 @ 分散VCS
• 同じ事がバイナリについても言える
 – Maven snapshotをパイプライン的に使う?
 – リリースが先か、検証が先か
• 歴史は繰り返す




          ©2010 CloudBees, Inc. All Rights   56
                    Reserved
自動化による相乗効果




      ©2010 CloudBees, Inc. All Rights   57
                Reserved
三種の神器                     →新・三種の神器
• ビルドスクリプト                  • デプロイスクリプト
• バージョン管理                   • XaaS
• 自動化されたテスト                 • クラウド



  相乗効果が個々の投資を正当化する




        ©2010 CloudBees, Inc. All Rights   58
                  Reserved
まとめ
• 計算能力は湯水のように使える                           ようになる


 – とにかく横に並べる
• ソフトウェア開発でも計算能力の新しい
  活用の仕方が求められている
• 色々な技術の流れが後押ししている
 – クラウド、仮想計算機、分散VCS、自動化


• Jenkinsはこういうニーズを吸収していく

        ©2010 CloudBees, Inc. All Rights           59
                  Reserved
©2010 CloudBees, Inc. All Rights
          Reserved
©2010 CloudBees, Inc. All Rights   61
          Reserved
計算能力の向上
• 今時のXeon: 1MB L2 cache
  – PC-98シリーズ: メインメモリ 640KB


• “Your cell phone has more computing
  power than NASA back in 1969”
• PlayStation today has more computing
  power than military super computer of
  1997

               ©2010 CloudBees, Inc. All Rights   62
                         Reserved
他にも色々な実装が考えられる
• 中間サーバ方式
 – 開発者はCIサーバへプッシュ
 – CIサーバがテスト結果に応じて中央へプッ
   シュ




        ©2010 CloudBees, Inc. All Rights   63
                  Reserved
SaaSの台頭




          ©2010 CloudBees, Inc. All Rights   64
                    Reserved
SaaSの台頭: SOASTA




         ©2010 CloudBees, Inc. All Rights   65
                   Reserved
次っていうのはどっち?
• 品質検査
• ワークフロー
• 大規模インスタンス
  の管理
• 検証済みマージ
  …




       ©2010 CloudBees, Inc. All Rights   66
                 Reserved
水平並列化
•   Rackspace 56,000
•   1&1 Internet 70,000
•   Facebook     70,000
•   Google       1,000,000 (?)
•   Microsoft, Amazon,
    Yahoo, IBM, …



                 ©2010 CloudBees, Inc. All Rights   67
                           Reserved
複数のマシンに跨るジョブを作る
• 例:負荷テスト
               同期: 準備完了


                            サーバ

                    クライアント #1

                    クライアント #2

                    クライアント #3

                    クライアント #4



        ©2010 CloudBees, Inc. All Rights   68
                  Reserved
Dist-fork: 分散スクリプティング基盤
• Jenkinsから一時的に計算機を借りる
 – マシン名に依存しないsshのようなもの
 $ java -jar jenkins-cli.jar dist-fork -l linux uname -a
 – ファイルをコピーしたりも


• 用途
 – OS別のインストーラの作成
 – 負荷テスト


                   ©2010 CloudBees, Inc. All Rights        69
                             Reserved
更に一歩進めて
• 長く借りておく
 $ jenkins dist-fork-lease -l linux –n node1
 …
 $ jenkins dist-fork –n node1 ./doSomething.sh
 …
 $ jenkins dist-fork –n node1 ./doMore.sh


• 後片付けはJenkinsに任せる


                 ©2010 CloudBees, Inc. All Rights   70
                           Reserved
更に一歩進めて
• Antタスクにしたり
<jenkins:parallel degree=“3” name=“slave”>
  <jenkins:copy2slave dir=“.” includes=“lib/*.jar”/>
  <junit />
  <jenkins:copy2master dir=“.” includes=“reports/*.xml”/>
</jenkins:parallel>




                      ©2010 CloudBees, Inc. All Rights      71
                                Reserved
更に一歩進めて
• Groovyスクリプトにしたり
 def jpool = new Jenkins().pool;
 [1..10].eachParallel {
   jpool.allocateSlave {
      // この部分はスレーブ上で実行される
   }
 }




           ©2010 CloudBees, Inc. All Rights   72
                     Reserved
あらゆる階層でテストの並列実行
• 複数スレッドで
 – 拙作 parallel-junit
 – TestNGとか
• 複数プロセスで
 – 拙作 Maven JUnit plugin
 – Maven Surefire
• 複数マシンで
 – マトリックスプロジェクト


                ©2010 CloudBees, Inc. All Rights   73
                          Reserved
Jenkinsの持つ情報を活用してテストを実行
• 実行順序制御
 – 前回失敗したテストから
 – 費用対効果の高いテストから
• 失敗時により多くの情報を集める
 – 非対話性デバッガ YouDebug
 – メモリダンプ・スレッドダンプ




           ©2010 CloudBees, Inc. All Rights   74
                     Reserved
Selenium?
• Auto pointerのようなもの

•   仮想ディスプレイじゃなくヘッドレスで
•   プロセスに埋め込んで
•   プロクシ偽装でなくデータにアクセス
•   コンソールのリダイレクト
•   レイアウトの機械可読化
•   Fault injection

            ©2010 CloudBees, Inc. All Rights   75
                      Reserved
Jenkinsの持つ情報を活用してテストを実行
• 実行順序制御
 – 前回失敗したテストから
 – 費用対効果の高いテストから
• 失敗時により多くの情報を集める
 – 非対話性デバッガ YouDebug
 – メモリダンプ・スレッドダンプ




           ©2010 CloudBees, Inc. All Rights   76
                     Reserved
分散VCS ♥
• コミットと共有の概念が分離している
 – Subversion = 全員と共有 or 誰とも共有しな
   い
 – これを利用して明示的にブランチ操作をし
   なくても検証済みマージができてしまう


• 開発の動機は違うがCIには相性が良い
 – 分散・並列の時代にあっている


           ©2010 CloudBees, Inc. All Rights   77
                     Reserved
自動化のバウンダリを広げよう
• 開発者の世界に起こったこと(CI)をその
  外側へ適用しよう

• 左からコードをコミットしたら右からア
  プリが出てくる仕組みを作ろう




        ©2010 CloudBees, Inc. All Rights   78
                  Reserved

More Related Content

Developer summit continuous deliveryとjenkins

Editor's Notes

  1. 風呂敷を広げて、どうしてCIが一過性のブームではなくて本質的なものなのかを説明したい。
  2. 10000もスレッドがあったら今までの使い方では使い切れないしかも値段は安くなっている。性能比ではなおさら。
  3. 付加価値の高い商売をしないと
  4. 「計算機の活用」という大きな流れの現れの一つ
  5. (ゴミ箱)VMのスナップショット・フォークデバッグするために横によけておく
  6. スローテストの問題とか
  7. 自動化の流れは開発ツールでも。
  8. 各種のサービスをソフトウェア開発に組み込んでいくためには絶好のプラットフォームになっている
  9. さっき散々サーバを使いこなすことが重要だという話をした。&lt;&lt;スライド&gt;&gt;それはCIが無価値だということではないが、もっと活用できるポテンシャルがあるのにいかせていない
  10. ふるいにかけて無駄なテストを走らせない
  11. 三種の神器:この組み合わせからvalueを引き出すツールを書いていきたい