狠狠撸

狠狠撸Share a Scribd company logo
毎日が憧れの新築、
  反復可能なデリバリーによる
  常時新築システム




               2012-07-29
猫のク
          大嶽智裕 (@ohtaket)
リップ
          株式会社富士通研究所
目次
1.   背景
2.   愚直に自動化 (1..3)
3.   “スローデプロイ”問題 (4..6)
4.   自動化と高速化による変化 (7..9)
5.   まとめ (A..C)
运用でよくある事例
    一回だけ実施




01-サーバ      02-サーバ     03-サーバ     04-ほかに
構築手順        構築後の       運用手順        もたくさ
  書.xlsx     確認項         書.xlsx     ん.xlsx
              目.xlsx

           変更があっても更新されない
“clean” の既存プラクティス
         失敗しやすい           失敗しにくい

ビルド      $ make all    $ make clean all

運用        Win 9x を     Win 9x をN月おきに
         ずっと運用         クリーンインストール



本発表の主題              デリバリーでも
            “clean” のプラクティスを適用し
                 反復可能にしましょう
氏名: 大嶽智裕
自己紹介                               所属: 富士通研究所

                                    目がないもの:
                                  かわいいキャラクターたち


                  ウサギの写真               Jenkins で PaaS を
                                        ビルド?デプロイ
            Hudson による                1.0の
           自動デプロイ PaaS                製品化
           1.0      1.1                         2.0

  2008年度         2009年度      2010年度      2011年度


   ビルドサーバの車輪再開発           ビルドするものもなく Hadoop や NLP
IT業界に入る
宣伝: PaaS 1.0
  ? 開発からデリバリーまでサポートする PaaS
  ? プライベートクラウド用のアプライアンスに組
    み込まれているのでぜひ買ってね
 1. プロジェクト作成            2. Hudson ジョブ自動生成

                のクローン
開発者
                  3. 自動デプロイ                     4. 昇格デプロイ

                     テスト環境                 本番環境
                      Tomcat                Tomcat

http://pr.fujitsu.com/jp/news/2011/04/22.html               ※ 写真はイメージです
PaaS における3種類のデプロイ
1. アプリのデプロイ
2. 利用者システムのデプロイ
3. PaaS バックエンドシステム自体のデプロイ
       1.   利用者Aの   利用者Bの     1.
             アプリ     アプリ
 利用者A                              利用者B
            利用者Aの   利用者Bの
            システム    システム
PaaS 提供者       2.     2.
       3.
            PaaS バックエンドシステム
1年前のデプロイの状況




手順書による   複数クラウドへの   常時結合しておらず
手動デプロイ     デプロイ


デプロイ     ?理想値で8人日
 工数      ?実際は理想値の倍程度
大きなデプロイ工数によるさぼり
? 既存のデプロイには差分だけ適用
? 新規顧客を探しに行きにくくなる
素朴な疑問: ある種のドッグフード
 僕(客)に自動デプロイさせる前に、
君(提供者)が自動デプロイしたほうが
     いいんじゃないかなあ



                犬のぬいぐるみ
我々も



をデプロイで使うぞ
目次 (再)
1.   背景
2.   愚直に自動化 (1..3)
3.   “スローデプロイ”問題 (4..6)
4.   自動化と高速化による変化 (7..9)
5.   まとめ (A..C)
まずは愚直に自动化

                        ? 記述が簡単
                        ? セットアップが簡単

 手順書        Chef Solo

? Jenkins 側で必要な事項
 1. パッケージの集約
 2. デプロイ対象のマシンの用意
 3. デプロイスクリプトの実行
1. パッケージの集約 (0/4)
1. パッケージの集約 (1/4)
? OSバージョンとビットごとにビルドサーバ用意
? Matrix Job でビルド
1. パッケージの集約 (2/4)
? ビルド後にパッケージ集約ジョブを呼び出す
 – Parameterized Trigger Plugin
1. パッケージの集約 (3/4)
? ビルドジョブからアーティファクトをコピー
 – Copy Artifact Plugin
1. パッケージの集約 (4/4)
   ビルドジョブ             アーティファクト集約ジョブのアーティファクト


プラットフォーム依存
   (C, C++ …)

     5.6 32bit



     6.2 64bit



プラットフォーム非依存
 (Java, Ruby, C# …)
2. マシンの用意 (0/3)
2. マシンの用意 (1/3)
? 各種 Cloud Plugin
  – Amazon EC2 Plugin, Delta Cloud API Plugin,
    jClouds Plugin, vSphere Cloud Plugin, PXE Plugin …
? 任意のタイミングでのVM制御が必要
  – デプロイ手順としてリブート
  – マシンに直接ログインして試行錯誤
2. マシンの用意 (2/3)
? Java, Git, Ruby, Chef-solo をインストールした
  テンプレートVMを用意
? テンプレートからVMを作りそこにデプロイ
2. マシンの用意 (3/3)
? 电源を入れるジョブの例
3. デプロイの実行 (0/4)
3. デプロイの実行 (1/4)
? ノードをまたがって逐次実行するジョブ
     master         powercli



              VMを配備して

                               VM作成    slave1

                                電源投入



               デプロイスクリプトを実行して
                                                電源オン


                                                Jenkinsジョブ
3. デプロイ
の実行 (2/4)
? Parameterized
  Trigger Plugin +
                                                 パラメータ
  NodeLabel                                       全渡し
  Parameter
  Plugin

master         powercli



         VMを配備して                           NodeLabel パラメータは
                          VM作成    slave1   実行するノード?ラベルを
                           電源投入                 指定できる

          デプロイスクリプトを実行して


                                                 パラメータ
                                                  全渡し
3. デプロイの
     実行 (3/4)
? 親ジョブと子ジョブ
  のパラメータ



master         powercli



         VMを配備して

                          VM作成    slave1

                           電源投入



          デプロイスクリプトを実行して
3. デプロイの         master        powercli

                                                    個別のマシンの
   実行 (4/4)                    slave1のインストール
                                                    デプロイ


? PaaS バックエンド              VMを配備して
                                                   slave1
                                           VM作成
  システムは複数                                   電源投入

  台
                            デプロイスクリプトを実行して
? Parameterized
  Trigger で各ス
  レーブにデプロイ
? 開発環境以外の                      slave2のインストール



  環境にも同じスク                                                  slave2
  リプトでデプロイ
ビルドとデプロイの全体像
                     ビルド用スレーブ
                       C/C++
                      ビルド用
ソースレポジトリ                            Jenkins マスター

   ソース               Java, Ruby,     アーティファクト
                     C# ビルド用
                                                   ↑ビルド
 Gitorious                             Jenkins
                                                   ↓デプロイ
                 デプロイ用スレーブ

             スクリプト    VM操作用


 Chef クックブック               VM作成
                                   アーティファクトを取得

                      デプロイ用
目次 (再)
1.   背景
2.   愚直に自動化 (1..3)
3.   “スローデプロイ”問題 (4..6)
4.   自動化と高速化による変化 (7..9)
5.   まとめ (A..C)
“スローデプロイ問題”
? デプロイに60分かかる
? スローテスト問題はテストケースを分割して並
  列実行が一つの解
                                         時間
 1台で逐次   TestCase1: 3分   TestCase2: 3分   計6分
         TestCase1: 3分
 2台で並列   TestCase2: 3分                   計3分

     マシン
             テストは並列化できるが
            デプロイは並列化できない
デプロイ所要時間の分析
master         powercli                    10分


         VMを配備して

                          VM作成    slave1
                                                       ? ネットワーク
                           電源投入                  45分     I/O待ち
                                           50分
          デプロイスクリプトを実行して
                                                 5分    ? その他




4. VMスナップショットへの復元
5. インターネットからの分離
6. 自前と既成の分割と冪等性
4. VMスナップショット (0/1)
4. VMスナップショット (1/1)
? VMをテンプレートから作る代わりにスナップ
  ショットへの復元
? 10分から3分に
? 制約は増えるが速度のほうが重要

  作成              10分
         slave1                slave1
                        シャットダウン         1分
  電源オン            1分    復元              0.2分
                        電源オン            1分
5. インターネットからの分離 (0/2)
5. インターネットからの分離 (1/2)
? インターネットからの rpm や gem のダウン
  ロードが遅いので、事前にアーティファクト化
? 45分から2分に
       yum -y install --downloadonly libxml2
       yum -y install --downloadonly libxml2-devel
       # 略
       createrepo
5. インターネットからの分離 (2/2)
? 外部影響の原因追求
? インターネット接続がない環境へのデプロイ
6. 自前と既成の分割と冪等性 (0/4)
6. 自前と既成の分割と冪等性 (1/4)
? 自前パッケージ
 – 自前のソースからビルドするパッケージ
? 既成パッケージ
 – 他者が作ったパッケージ

             自前   既成
  更新頻度       高い   低い
  インストール所要時間 短い   長い
6. 自前と既成の分割と冪等性 (2/4)

? 自前と既成で性質が異なるため、デプロイス
  クリプトを分割
      パッケージと依存関係                分割
自前1         自前2     自前3   既成1        既成1
                          自前1        既成2
                          自前2
      既成1         既成2     既成2        自前1
                          自前3        自前2
                                     自前3
6. 自前と既成の分割と冪等性 (3/4)
 ? 冪等 (idempotent) なデプロイスクリプト

     冪等ではない                       冪等
                         $ rm -rf foo
$ tar zxf foo.tar.gz
                         $ tar zxf foo.tar.gz


$ sed –i?                $ sed –i?
> s/^BAR=/BAR=baz/ foo   > s/^BAR=.*/BAR=baz/ foo
6. 自前と既成の分割と冪等性 (4/4)
master       powercli              slave1
                                                       電源オン

    slave1 をお掃除して
                                                       Jenkinsジョブ
                        shutdown

                          revert                 合計10分
                        power-on
                                            3分
                                                 または2分のみ
         既存パッケージのインストール

                                            5分 冪等なので再実行可
         自前パッケージのインストール

                                            2分 冪等なので再実行可
                                                 自前は変更が多い
目次 (再)
1.   背景
2.   愚直に自動化 (1..3)
3.   “スローデプロイ”問題 (4..6)
4.   自動化と高速化による変化 (7..9)
5.   まとめ (A..C)
自動化と高速化によるチームの変化
7. 早い失敗を目指す
8. 環境の使い捨て
9. フィーチャーブランチごとにデプロイ
7. 早い失敗を目指す (0/2)
7. 早い失敗を目指す (1/2)
       ビルド                デリバリー
コンパ    単体    結合            結合     受け入れ
                   デプロイ
 イル    テスト   テスト           テスト     テスト




? パイプラインのなるべく早い段階で黄や赤に
  なるように
? Fail fast
7. 早い失敗を目指す (2/2)
? 設定ファイルではなく設定ファイル作成プログ
  ラム
         template "/usr/……/WEB-INF/hoge-servlet.xml" do
  レシピ        source "hoge-servlet.xml.erb"
             mode "0644"
         end
         <?xml version="1.0" encoding="UTF-8"?>
テンプレート   <beans>
           <bean id="dataSource“
             ……                                           デプロイ    テスト
             p:url="<%= ENV['JDBC_MYSQL'] %>"
             p:username="<%= node[:mysql_user]%>"
             p:password="<%= node[:mysql_passwd]%>"/>
         </beans>
               bash "configure hoge datasource" do
                   cwd "/usr/……/"
                   code <<-EOH
         レシピ       java -jar hoge.war -d #{ENV['JDBC_MYSQL']}……
                   EOH
               end
8. 環境の使い捨て (0/1)
8. 環境の使い捨て (1/1)
? 本番と同じ環境で開発
? 高速なデプロイと冪等なスクリプトのおかげ

               push     pull
通常の開発   開発機                       slave1


                      pull/push
実環境と同じ環境での開発                      slave1
9. ブランチごとにデプロイ (0/1)
9. ブランチごとにデプロイ (1/1)
? 毎回新規に作られる環境による安心感
? デプロイまで行うので試用ができる


  ソースレポジトリ         開発用デプロイ環境群
        feature1
                        feature1
     master            デプロイ環境

                     master
                    デプロイ環境
目次 (再)
1.   背景
2.   愚直に自動化 (1..3)
3.   “スローインストール”問題 (4..6)
4.   自動化と高速化による変化 (7..9)
5.   まとめ (A..C)
A. 自動化できるものは自動化
? ビルドだけでなくデリバリーも自動化しましょう
? クリーンと幂等で反復可能に
B.自動化をより高速に
 ? 自動化だけで終わらせず高速
   化も検討すべき
 ? 迅速なフィードバック
 ? 速ければ使い方も変わる
C. 執事の Jenkins さんは万能
          ? 本来はCIサーバだが
            CI以外もこなせる
          ? 執事を遣い倒そう
プラチナスポンサー




メディアスポンサー



シルバースポンサー
以下、スライド退避场所
Continuous Delivery 本
そもそもの CI までの道のり
? 全コードを Gitorious に移してもらう
 – 以前は svn だったり “日付.zip” だったり
 – バックアップ不要になるという餌で移行してもらう
 – レポジトリはチーム全員書き込み可能
? 勝手にCIしておく
 – ビルドスクリプトがなかったりするので勝手に追
   加し Jenkins ジョブ作成
 – グラフを見せたりして良さが分かってもらえるよう
   に
大量のジョブと戦う
? Configuration Slicing Plugin
? XPath Configuration View Plugin
? Script Console
試してみたいプラグイン
? Build Flow Plugin
? Multijob Plugin
独自プラグイン
? テスト関係などで独自プラグインがある
? 現在はいずれも非公開
Jenkins が使えない場合
? Jenkins に保存されているアーティファクトを丸
  ごと保存してアップロード
 – Web サーバに置くだけで yum レポジトリになった
   りする
? 環境変数設定スクリプトを作る
 – ジョブの引数の代わりに環境変数を設定するスク
   リプト
? 各マシンで chef solo 実行して終わり
撮影場所
? 神奈川県川崎市
 – 富士通川崎工場研究所2号館
 – 川崎市民プラザ
 – 江川せせらぎ遊歩道
 – 夢見ヶ崎動物公園
 – 多摩川サイクリングコース
 – 自宅
? 東京都多摩市
 – サンリオピューロランド

More Related Content

毎日が憧れの新筑、反復可能なデリバリーによる常时新筑システム