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

2,878 views

Published on

Jenkins ユーザ・カンファレンス 2012 東京の satta-5 です。
http://build-shokunin.org/juc2012/sessions/#satta-5

変換前の PowerPoint は SkyDrive にあります。ノートがついているので SlideShare よりも推奨です。
https://skydrive.live.com/view.aspx?resid=968A39D3BD051DA!460&cid=0968a39d3bd051da&app=PowerPoint

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,878
On SlideShare
0
From Embeds
0
Number of Embeds
42
Actions
Shares
0
Downloads
10
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

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

  1. 1. 毎日が憧れの新築、 反復可能なデリバリーによる 常時新築システム 2012-07-29猫のク 大嶽智裕 (@ohtaket)リップ 株式会社富士通研究所
  2. 2. 目次1. 背景2. 愚直に自動化 (1..3)3. “スローデプロイ”問題 (4..6)4. 自動化と高速化による変化 (7..9)5. まとめ (A..C)
  3. 3. 運用でよくある事例 一回だけ実施01-サーバ 02-サーバ 03-サーバ 04-ほかに構築手順 構築後の 運用手順 もたくさ 書.xlsx 確認項 書.xlsx ん.xlsx 目.xlsx 変更があっても更新されない
  4. 4. “clean” の既存プラクティス 失敗しやすい 失敗しにくいビルド $ make all $ make clean all運用 Win 9x を Win 9x をN月おきに ずっと運用 クリーンインストール本発表の主題 デリバリーでも “clean” のプラクティスを適用し 反復可能にしましょう
  5. 5. 氏名: 大嶽智裕自己紹介 所属: 富士通研究所 目がないもの: かわいいキャラクターたち ウサギの写真 Jenkins で PaaS を ビルド・デプロイ Hudson による 1.0の 自動デプロイ PaaS 製品化 1.0 1.1 2.0 2008年度 2009年度 2010年度 2011年度 ビルドサーバの車輪再開発 ビルドするものもなく Hadoop や NLPIT業界に入る
  6. 6. 宣伝: PaaS 1.0 • 開発からデリバリーまでサポートする PaaS • プライベートクラウド用のアプライアンスに組 み込まれているのでぜひ買ってね 1. プロジェクト作成 2. Hudson ジョブ自動生成 のクローン開発者 3. 自動デプロイ 4. 昇格デプロイ テスト環境 本番環境 Tomcat Tomcathttp://pr.fujitsu.com/jp/news/2011/04/22.html ※ 写真はイメージです
  7. 7. PaaS における3種類のデプロイ1. アプリのデプロイ2. 利用者システムのデプロイ3. PaaS バックエンドシステム自体のデプロイ 1. 利用者Aの 利用者Bの 1. アプリ アプリ 利用者A 利用者B 利用者Aの 利用者Bの システム システムPaaS 提供者 2. 2. 3. PaaS バックエンドシステム
  8. 8. 1年前のデプロイの状況手順書による 複数クラウドへの 常時結合しておらず手動デプロイ デプロイデプロイ •理想値で8人日 工数 •実際は理想値の倍程度
  9. 9. 大きなデプロイ工数によるさぼり• 既存のデプロイには差分だけ適用• 新規顧客を探しに行きにくくなる
  10. 10. 素朴な疑問: ある種のドッグフード 僕(客)に自動デプロイさせる前に、君(提供者)が自動デプロイしたほうが いいんじゃないかなあ 犬のぬいぐるみ
  11. 11. 我々もをデプロイで使うぞ
  12. 12. 目次 (再)1. 背景2. 愚直に自動化 (1..3)3. “スローデプロイ”問題 (4..6)4. 自動化と高速化による変化 (7..9)5. まとめ (A..C)
  13. 13. まずは愚直に自動化 • 記述が簡単 • セットアップが簡単 手順書 Chef Solo• Jenkins 側で必要な事項 1. パッケージの集約 2. デプロイ対象のマシンの用意 3. デプロイスクリプトの実行
  14. 14. 1. パッケージの集約 (0/4)
  15. 15. 1. パッケージの集約 (1/4)• OSバージョンとビットごとにビルドサーバ用意• Matrix Job でビルド
  16. 16. 1. パッケージの集約 (2/4)• ビルド後にパッケージ集約ジョブを呼び出す – Parameterized Trigger Plugin
  17. 17. 1. パッケージの集約 (3/4)• ビルドジョブからアーティファクトをコピー – Copy Artifact Plugin
  18. 18. 1. パッケージの集約 (4/4) ビルドジョブ アーティファクト集約ジョブのアーティファクトプラットフォーム依存 (C, C++ …) 5.6 32bit 6.2 64bitプラットフォーム非依存 (Java, Ruby, C# …)
  19. 19. 2. マシンの用意 (0/3)
  20. 20. 2. マシンの用意 (1/3)• 各種 Cloud Plugin – Amazon EC2 Plugin, Delta Cloud API Plugin, jClouds Plugin, vSphere Cloud Plugin, PXE Plugin …• 任意のタイミングでのVM制御が必要 – デプロイ手順としてリブート – マシンに直接ログインして試行錯誤
  21. 21. 2. マシンの用意 (2/3)• Java, Git, Ruby, Chef-solo をインストールした テンプレートVMを用意• テンプレートからVMを作りそこにデプロイ
  22. 22. 2. マシンの用意 (3/3)• 電源を入れるジョブの例
  23. 23. 3. デプロイの実行 (0/4)
  24. 24. 3. デプロイの実行 (1/4)• ノードをまたがって逐次実行するジョブ master powercli VMを配備して VM作成 slave1 電源投入 デプロイスクリプトを実行して 電源オン Jenkinsジョブ
  25. 25. 3. デプロイの実行 (2/4)• Parameterized Trigger Plugin + パラメータ NodeLabel 全渡し Parameter Pluginmaster powercli VMを配備して NodeLabel パラメータは VM作成 slave1 実行するノード・ラベルを 電源投入 指定できる デプロイスクリプトを実行して パラメータ 全渡し
  26. 26. 3. デプロイの 実行 (3/4)• 親ジョブと子ジョブ のパラメータmaster powercli VMを配備して VM作成 slave1 電源投入 デプロイスクリプトを実行して
  27. 27. 3. デプロイの master powercli 個別のマシンの 実行 (4/4) slave1のインストール デプロイ• PaaS バックエンド VMを配備して slave1 VM作成 システムは複数 電源投入 台 デプロイスクリプトを実行して• Parameterized Trigger で各ス レーブにデプロイ• 開発環境以外の slave2のインストール 環境にも同じスク slave2 リプトでデプロイ
  28. 28. ビルドとデプロイの全体像 ビルド用スレーブ C/C++ ビルド用ソースレポジトリ Jenkins マスター ソース Java, Ruby, アーティファクト C# ビルド用 ↑ビルド Gitorious Jenkins ↓デプロイ デプロイ用スレーブ スクリプト VM操作用 Chef クックブック VM作成 アーティファクトを取得 デプロイ用
  29. 29. 目次 (再)1. 背景2. 愚直に自動化 (1..3)3. “スローデプロイ”問題 (4..6)4. 自動化と高速化による変化 (7..9)5. まとめ (A..C)
  30. 30. “スローデプロイ問題”• デプロイに60分かかる• スローテスト問題はテストケースを分割して並 列実行が一つの解 時間 1台で逐次 TestCase1: 3分 TestCase2: 3分 計6分 TestCase1: 3分 2台で並列 TestCase2: 3分 計3分 マシン テストは並列化できるが デプロイは並列化できない
  31. 31. デプロイ所要時間の分析master powercli 10分 VMを配備して VM作成 slave1 • ネットワーク 電源投入 45分 I/O待ち 50分 デプロイスクリプトを実行して 5分 • その他4. VMスナップショットへの復元5. インターネットからの分離6. 自前と既成の分割と冪等性
  32. 32. 4. VMスナップショット (0/1)
  33. 33. 4. VMスナップショット (1/1)• VMをテンプレートから作る代わりにスナップ ショットへの復元• 10分から3分に• 制約は増えるが速度のほうが重要 作成 10分 slave1 slave1 シャットダウン 1分 電源オン 1分 復元 0.2分 電源オン 1分
  34. 34. 5. インターネットからの分離 (0/2)
  35. 35. 5. インターネットからの分離 (1/2)• インターネットからの rpm や gem のダウン ロードが遅いので、事前にアーティファクト化• 45分から2分に yum -y install --downloadonly libxml2 yum -y install --downloadonly libxml2-devel # 略 createrepo
  36. 36. 5. インターネットからの分離 (2/2)• 外部影響の原因追求• インターネット接続がない環境へのデプロイ
  37. 37. 6. 自前と既成の分割と冪等性 (0/4)
  38. 38. 6. 自前と既成の分割と冪等性 (1/4)• 自前パッケージ – 自前のソースからビルドするパッケージ• 既成パッケージ – 他者が作ったパッケージ 自前 既成 更新頻度 高い 低い インストール所要時間 短い 長い
  39. 39. 6. 自前と既成の分割と冪等性 (2/4)• 自前と既成で性質が異なるため、デプロイス クリプトを分割 パッケージと依存関係 分割自前1 自前2 自前3 既成1 既成1 自前1 既成2 自前2 既成1 既成2 既成2 自前1 自前3 自前2 自前3
  40. 40. 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
  41. 41. 6. 自前と既成の分割と冪等性 (4/4)master powercli slave1 電源オン slave1 をお掃除して Jenkinsジョブ shutdown revert 合計10分 power-on 3分 または2分のみ 既存パッケージのインストール 5分 冪等なので再実行可 自前パッケージのインストール 2分 冪等なので再実行可 自前は変更が多い
  42. 42. 目次 (再)1. 背景2. 愚直に自動化 (1..3)3. “スローデプロイ”問題 (4..6)4. 自動化と高速化による変化 (7..9)5. まとめ (A..C)
  43. 43. 自動化と高速化によるチームの変化7. 早い失敗を目指す8. 環境の使い捨て9. フィーチャーブランチごとにデプロイ
  44. 44. 7. 早い失敗を目指す (0/2)
  45. 45. 7. 早い失敗を目指す (1/2) ビルド デリバリーコンパ 単体 結合 結合 受け入れ デプロイ イル テスト テスト テスト テスト• パイプラインのなるべく早い段階で黄や赤に なるように• Fail fast
  46. 46. 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
  47. 47. 8. 環境の使い捨て (0/1)
  48. 48. 8. 環境の使い捨て (1/1)• 本番と同じ環境で開発• 高速なデプロイと冪等なスクリプトのおかげ push pull通常の開発 開発機 slave1 pull/push実環境と同じ環境での開発 slave1
  49. 49. 9. ブランチごとにデプロイ (0/1)
  50. 50. 9. ブランチごとにデプロイ (1/1)• 毎回新規に作られる環境による安心感• デプロイまで行うので試用ができる ソースレポジトリ 開発用デプロイ環境群 feature1 feature1 master デプロイ環境 master デプロイ環境
  51. 51. 目次 (再)1. 背景2. 愚直に自動化 (1..3)3. “スローインストール”問題 (4..6)4. 自動化と高速化による変化 (7..9)5. まとめ (A..C)
  52. 52. A. 自動化できるものは自動化• ビルドだけでなくデリバリーも自動化しましょう• クリーンと冪等で反復可能に
  53. 53. B.自動化をより高速に • 自動化だけで終わらせず高速 化も検討すべき • 迅速なフィードバック • 速ければ使い方も変わる
  54. 54. C. 執事の Jenkins さんは万能 • 本来はCIサーバだが CI以外もこなせる • 執事を遣い倒そう
  55. 55. プラチナスポンサーメディアスポンサーシルバースポンサー
  56. 56. 以下、スライド退避場所
  57. 57. Continuous Delivery 本
  58. 58. そもそもの CI までの道のり• 全コードを Gitorious に移してもらう – 以前は svn だったり “日付.zip” だったり – バックアップ不要になるという餌で移行してもらう – レポジトリはチーム全員書き込み可能• 勝手にCIしておく – ビルドスクリプトがなかったりするので勝手に追 加し Jenkins ジョブ作成 – グラフを見せたりして良さが分かってもらえるよう に
  59. 59. 大量のジョブと戦う• Configuration Slicing Plugin• XPath Configuration View Plugin• Script Console
  60. 60. 試してみたいプラグイン• Build Flow Plugin• Multijob Plugin
  61. 61. 独自プラグイン• テスト関係などで独自プラグインがある• 現在はいずれも非公開
  62. 62. Jenkins が使えない場合• Jenkins に保存されているアーティファクトを丸 ごと保存してアップロード – Web サーバに置くだけで yum レポジトリになった りする• 環境変数設定スクリプトを作る – ジョブの引数の代わりに環境変数を設定するスク リプト• 各マシンで chef solo 実行して終わり
  63. 63. 撮影場所• 神奈川県川崎市 – 富士通川崎工場研究所2号館 – 川崎市民プラザ – 江川せせらぎ遊歩道 – 夢見ヶ崎動物公園 – 多摩川サイクリングコース – 自宅• 東京都多摩市 – サンリオピューロランド

×