Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ワンクリックデプロイ101

 ワンクリックデプロイ101

2011年12月のワンクリックデプロイ勉強会のスライドです。
詳細はhttp://www.ryuzee.com/

Ryutaro YOSHIBA

April 11, 2012
Tweet

More Decks by Ryutaro YOSHIBA

Other Decks in Technology

Transcript

  1. 会場調査 •  全員起⽴立立してください •  ユニットテストを書いていない⽅方は着席 •  結合テストを⾃自動化していない⽅方は着席 •  継続的インテグレーションサーバを使っていな い⽅方は着席

    •  デプロイを⾃自動化していない⽅方は着席 •  環境構築を⾃自動化していない⽅方は着席 最後まで起立されている方は 帰って大丈夫ですw
  2. コンウェイの法則 “OOrrggaanniizzaattiioonnss wwhhiicchh ddeessiiggnn ssyysstteemmss aarree ccoonnssttrraaiinneedd ttoo pprroodduuccee ddeessiiggnnss

    wwhhiicchh aarree ccooppiieess ooff tthhee ccoommmmuunniiccaattiioonn ssttrruuccttuurreess ooff tthheessee oorrggaanniizzaattiioonnss..” http://bit.ly/oIUrUI
  3. ど の 断 面 で も     再 現

    可 能 か ? http://bit.ly/uVQu5I
  4. テ ス ト し て い な い も の

    を 目 を 瞑 っ て デ プ ロ イ し て は い け な い http://bit.ly/rAOG9h
  5. アジャイルでの品質の作りこみ Scrumの場合 Cancel Gift  wrap Return スプリント 2~∼4週間 返品 スプリントゴール

    スプリント バックログ 出荷可能な製品の 積み上げ プロダクトバックログ クーポン ギフト包装 クーポン キャンセル 24時間 単体テスト、結合テスト、 受け⼊入れテストがスプリン ト単位(もしくはリリース単 位)で⾏行行われる.
  6. 【⾃自動と⼿手動】 機能テスト ストーリーテスト プロトタイプ シミュレーション 【⼿手動】※1 探索索的テスト シナリオテスト ユーザビリティテスト ユーザー受⼊入テスト

    アルファ版、ベータ版 【⾃自動化】 単体テスト コンポーネントテスト 【ツール】 パフォーマンステスト 負荷テスト セキュリティテスト 第1象限 第2象限 第3象限 第4象限 技術⾯面(技術的品質) ビジネス⾯面(ビジネス的品質) チ ー ム を ⽀支 援 製 品 を 批 評 テストの4象限 ※1  ATDD等では⾃自動化
  7. 【⾃自動と⼿手動】 機能テスト ストーリーテスト プロトタイプ シミュレーション 【⼿手動】 探索索的テスト シナリオテスト ユーザビリティテスト ユーザー受⼊入テスト

    アルファ版、ベータ版 【⾃自動化】 単体テスト コンポーネントテスト 【ツール】 パフォーマンステスト 負荷テスト セキュリティテスト 第1象限 第2象限 第3象限 第4象限 技術⾯面(技術的品質) ビジネス⾯面(ビジネス的品質) チ ー ム を ⽀支 援 製 品 を 批 評 ツール・⼿手法のマッピング(例例) TDD xUnit PMD,  CPD  … Jmeter WebScarab RatProxy ValGrind  … Selenium Cucumber Rspec FitNess  … CI推奨 CI推奨 CI必須 ⼀一部CI可能
  8. CIアンチパターン •  頻繁にSCMにコミットしない •  テストコードを書かない •  テストコードと製品コードを同時にコミットしない •  定時ビルドのみでコミットビルドがない・夜間ビルドしかない • 

    帰り際にコミットしてそのままCIの結果を⾒見見ずに帰る •  CIでテストを通すために⼿手作業の準備が必要 •  メインラインのみで⼤大きなブランチをCI対象にしていない •  様々な種類のテストをまとめて⾏行行っている •  ビルドの失敗に気付かない •  ビルドに失敗しても放置している
  9. CIアンチパターン •  ビルドの失敗に気づいても、修正コード以外のコードをコミットす る •  何も変更更していないのにビルドが落落ちたり落落ちなかったりする •  頻繁にビルドが失敗しているので、失敗するのが普通だと思う •  CIからの通知メッセージが⼤大量量すぎる

    •  CIが落落ちても何も通知しない •  CIサーバのリソースが貧弱 •  ビルドが肥⼤大化して結果が出るまでに時間がかかる •  本番環境やステージング環境と⼤大幅に環境が異異なる •  コードの静的解析をCIで⾏行行わずに⼈人⼿手で⾏行行う •  CIサーバがおかしくなったときに直せる⼈人がいない •  ずっとCIでのチェック内容が変わらない、プロセスが変わらない
  10. 問題の例例 SQLの実⾏行行順序によって状態が変わってしまう alter  table  users  add   column  lastlogin  

    datetime  after  name; alter  table  users  add   column  disabled   boolean  default  false   after  name; 1.sql 2.sql 1→2の順に実⾏行行すると…. 2→1の順に実⾏行行すると….
  11. データベースの変更更管理理 $  ls  -‐‑‒1 1301223401_̲addchangelogs.php 1313445291_̲addinformation.php 1317489252_̲addpriorities.php 1318776293_̲addprojects.php 1318889397_̲addremainingtimes.php 1320243212_̲addresolutions.php

    1321049290_̲addsprints.php 1321509396_̲addschemamigrations.php 1322392147_̲fix_̲project_̲invalid_̲default_̲value.php 1322446269_̲add_̲action_̲name_̲to_̲log.php 1322993218_̲addstories.php 1323001299_̲addstorycomments.php 1323449303_̲addusers.php 1324059101_̲addtasks.php 1325101301_̲addteammembers.php 1326548301_̲addteams.php 1327491204_̲addwiki.php 前後関係は、ファイル 先頭の数字の⼤大⼩小で判 断される。 (規約)
  12. マイグレーションの状態 mysql> mysql> mysql> mysql> mysql> select * from migration_version;

    +---------+ | version | +---------+ | 30 | +---------+ 1 row in set (0.08 sec) mysql> mysql> 現在30個⽬目のマイグレー ションファイルまで登録 済であることを指す
  13. マイグレーション実⾏行行 #  最新のバージョンへ更更新 $  php  doctrine_̲cli.php  migrate #  指定したバージョンへ更更新 $

     php  doctrine_̲cli.php  migrate  29   コマンド1つで最新のバージョンに更更新したり、 特定のバージョンに戻すことができる マイグレーションファイルをソースコードとしてバージョ ン管理理し、CIのビルド定義の中にマイグレーションコマン ドを組み込むことで、⾃自動的にDBの状態を連動させる
  14. Vagrantのインストールと起動 $  sudo  gem  install  vagrant   $  sudo  vagrant

     box  add  lucid32  h7p:// files.vagrantup.com/lucid32.box   $  sudo  vagrant  init   $  sudo  vagrant  up   わずか4ステップで、仮想イン スタンスが起動する!!!!
  15. Vagrantのプラグインでの拡張 SaharaによるSandbox機能の導⼊入 $  sudo  git  clone  h7ps://github.com/jedi4ever/sahara.git   $  cd

     sahara   $  sudo  rake  build   $  cd  pkg   $  sudo  gem  install  ./sahara-­‐0.0.7.gem   Sandbox機能を使うことで、ミドルウェアの バージョンアップの検証や、構成の変更更の検 証を気軽に⾏行行えるようになる。
  16. Sandboxモード ▪sandboxモードに⼊入る(仮想マシンを再起動しても有効) sudo  vagrant  sandbox  on ▪sandboxを開始時点にロールバックする sudo  vagrant  sandbox

     rollback ▪sandboxモードの終了了(commitしていないものは消える) sudo  vagrant  sandbox  off ▪sandboxの内容を恒久的に反映 sudo  vagrant  sandbox  commit ▪現在sandboxモードかどうかを確認する sudo  vagrant  sandbox  status
  17. Chefとは? •  Ruby製のシステム管理理ツール •  出来ること –  OSのパッケージのインストールや管理理 –  OSの設定やミドルウェアの設定 – 

    サービスの起動・停⽌止 –  クーロンの設定 •  特徴 –  Rubyでジョブや設定を記述する –  Chef⾃自体はクライアント/サーバモデル –  Chef-‐‑‒soloを使えばローカル単体で動作 –  Recipeが多数公開されている
  18. capコマンド cap  deploy              

                    #  Deploys  your  project. cap  deploy:check                   #  Test  deployment  dependencies. cap  deploy:cleanup               #  Clean  up  old  releases. cap  deploy:pending               #  Displays  the  commits  since  your  last  deploy. cap  deploy:pending:diff     #  Displays  the  `̀diff'  since  your  last  deploy. cap  deploy:rollback             #  Rolls  back  to  a  previous  version  and  restarts. cap  deploy:rollback:code   #  Rolls  back  to  the  previously  deployed  version. cap  deploy:setup                   #  Prepares  one  or  more  servers  for  deployment. cap  deploy:symlink               #  Updates  the  symlink  to  the  most  recently  deployed  ... cap  deploy:update                 #  Copies  your  project  and  updates  the  symlink. cap  deploy:update_̲code       #  Copies  your  project  to  the  remote  servers. cap  deploy:upload                 #  Copy  files  to  the  currently  deployed  version. cap  deploy:web:disable       #  Present  a  maintenance  page  to  visitors. cap  deploy:web:enable         #  Makes  the  application  web-‐‑‒accessible  again. cap  develop                             #  Set  the  target  stage  to  `̀develop'. cap  invoke                               #  Invoke  a  single  command  on  the  remote  servers. cap  multistage:prepare       #  Stub  out  the  staging  config  files. cap  production                       #  Set  the  target  stage  to  `̀production'. cap  shell                                 #  Begin  an  interactive  Capistrano  session.
  19. ビルド(デプロイ)パイプライン •  SCMへのコミットをトリガーにする •  開発者のリズムを維持するために、最初にユ ニットテストや⼀一部のスモークテストを⾏行行い素 早く開発者にフィードバックする •  時間のかかる結合テストや受け⼊入れテストは、 前⼯工程が正常だった場合のみに⾏行行う

    •  これによってムダな時間を使わないようにする •  ユーザビリティテストや探索索的テストのうち⾃自 動化できないものもプロセスとしてはパイプラ イン上に定義 •  最後にデプロイできれば、デプロイパイプライ ン