SlideShare a Scribd company logo
ワンクリックデプロ゗ 101


http://bit.ly/vHXFbO
吉羽龍太郎
ゕジャ゗ルコーチ
http://www.ryuzee.com/
ワンクリックデプロイ101 #ocdeploy
Special Thanks




  @katzchang      @tomohn
 凄腕プログラマー      凄腕エバンジェリスト
え?マジでマジで?
会場調査
• 全員起立してください
• ユニットテストを書いていない方は着席
• 結合テストを自動化していない方は着席
• 継続的インテグレーションサーバを使っていな
  い方は着席
• デプロイを自動化していない方は着席
• 環境構築を自動化していない方は着席

    最後まで起立されている方は
      帰って大丈夫ですw
一日にしてならず




http://bit.ly/vPmiFJ
No
                       Silver
                       Bullet
http://bit.ly/vj0b0v
http://bit.ly/sygcE9


自分たちのプロセス
は自分たちで進化さ
せるしかない!
1.ビジネスをとりまく
環境の変化
IT投資は業務効率化
から戦略実現へ
以前の競争




http://bit.ly/rioQDZ
現在の競争




 競争の速度の変化
迅速な
                       意思決定
                       が必要


http://bit.ly/pccwAN
意思決定をもとに
素早く
具現化する必要    http://bit.ly/r1ziWL
ビジネスモデルの賞味期限が短縮
変化への対応


“事前に綿密”
 にたてた計画を
“長期間遵守”
 して大丈夫なのか?
変化への対応


“変化が起こる”
 ことを前提に
“頻繁に軌道修正”
 することが必要
http://bit.ly/oX9ImQ
変化に対応できなければ
マーケットから
見捨てられる
価値がなくなれば滅びる




http://bit.ly/qJg8EX
継続的な
   イノベーション
   の創発
http://bit.ly/nLACes
“イノベーションは「知」の創造プロセ
スであり、知の創造は単に理論だけでは
なく、実践を通して知識を磨き、知恵に
するものである”

“企業の優れた業績は研究開発投資の増
加に要因があるのではなく、組織の
イノベーション・プロセスの質による”

野中郁次郎氏の発言要旨
http://www.slideshare.net/InnovationSprint2011/2011-6794551
プロセス    プロダクト
イノベーション イノベーション




http://bit.ly/qpjFXr   http://bit.ly/ornfUo
マインド
イノベーション   http://bit.ly/nrDcZf
コンウェ゗の法則

 “Organizations which design
 systems are constrained to
 produce designs which are
 copies of the communication
 structures of these
 organizations.”

http://bit.ly/oIUrUI
2.継続的デリバリ
毎日何回も本番環境にデプロイで
きているか?

顧客に頻繁に価値を届けられてい
るか?
ワンクリックでデプロイできたと
しても、リリースの意思決定に時
間がかかったら無意味!



             http://bit.ly/rZyM3H
経営
    Lean        者
企業活動自体の全体最適化




  Scrum
                マ
               ネー
価値あるものから継続的に   ジャ
   製品を届ける



    XP         チー
  技術面を高める       ム
企業での価値創造

                   継続的デリバリ
Adaptability /




                                               継続的
                                              デプロ゗
Agility




                             継続的
                          ゗ンテグレーション


                 繰り返し型の
                   開発


                           Strategic Impact
継続的デリバリとは何か?

“継続的デリバリとはリリースのスケジュー
ルをIT部門が握るのではなく、ビジネス部門が
握るということだ。継続的デリバリを実装する
ということは、全体のライフサイクルを通じて
常にソフトウェアが本番環境にリリース可能で
あるということを意味する。すなわちどのビル
ドもボタン一発で、完全に自動化されたリリー
スプロセスを通じて、秒とか分の時間で利用者
にリリース可能である、ということだ。”

                 Jez Humble
継続的デリバリ
              http://bit.ly/tFrqbz




ユーザーとプロジェクトチームの間に
固いフィードバックループを作る
継続的デリバリ
                    http://bit.ly/uLQaml




継続的なフィードバックプロセスは、
競争優位性やムダの削減につながる
継続的デリバリの8原則

    ソフトウェアのリ
    リースやデプロイ
    のプロセスは繰り
    返し可能であり信
    頼性が高い必要が
    ある。
継続的デリバリの8原則




     全てを自動化
     する
継続的デリバリの8原則


    難解なことや苦
    痛なことを繰り
    返し行い自動化
    の方法を考える
継続的デリバリの8原則



    全てをソース
    コード管理シス
    テムで管理する
継続的デリバリの8原則



    完了は「リリー
    スされたこと」
    を意味する
継続的デリバリの8原則




    品質を作りこむ
継続的デリバリの8原則


    すべての人にリ
    リースプロセス
    に対しての責任
    がある
継続的デリバリの8原則




    継続的に改善
    する
継続的デリバリの4プラクテゖス

バイナリは一度だけビルドする
すべての環境にデプロイするのに
 完全に同一のメカニズムを使う
デプロイメントでスモークテスト
 を実施する
何か問題が起こったらラインを止
 める
ど
                         の
                       再断
                       現面
                       可で
                       能も
                       か
                       ?
http://bit.ly/uVQu5I
リリースした際に、前のバージョンに即座
に戻せるか?これはコードだけでなくデー
タベース等も含む




http://bit.ly/tgbmyr
ワンクリックデプロイ101 #ocdeploy
Convention
   Over
Configuration
Scrumとの関連性


• 多くの大規模組織は、ソフトウェアのデプロイ
  メントメソッドが貧弱であり、それ故にソフト
  ウェアを世に送り出すことが困難な状況にある。

• Scrumは妨害事項リスト等を使うことで、妨害事
  項を明らかはできるが、Scrum自体ではそれを解
  決できず、Scrumそれ自体はどのようにそれを解
  決するかの指針も持ち合わせていない
Doneの定義

何ができたら
完了なのかを
決める
Doneの定義
• チームとして定めた「出荷可能な製品」を作成
  するために実施しなければいけないことの一覧。
• 例えば、コードを書く、ユニットテストする、
  統合テストをする、リリースノートを書く
• ストーリーでのDoneの定義、スプリント単位
  でのDoneの定義、リリース単位でのDoneの
  定義をすることを推奨。
• Doneの定義はチームの成熟度や時間に
  よって変わっていくが、Doneの定義
  なくしてのScrumはあり得ない。
3.バージョン管理
ソースコードのバージョン管理
• いわずもがな。全ての起点はここにある

• コードの共同所有の原則への理解

• このソースコードは本番環境または開発環境な
  どで同じように動作しなければならない

• テストを書く習慣、コミット前に他のテストも
  含めて通してからコミットする習慣
設定フゔ゗ルのバージョン管理
• 環境によって異なる設定値(接続先データベー
  ス情報など)が書かれた設定ファイルもバー
  ジョン管理する

• 開発環境用、ステージング環境用、本番環境用
  などに分けて定義し、容易に切り替え可能にす
  る

• 本番環境に配置する際に、アプリケーションの
  各所を書き換えなければ動作しないという状況
  は避ける
バージョン管理は
開発者のしつけ




           http://bit.ly/utD8aA
4.テスト自動化
けデもテ
                       なプのス
                       いロをト
                        イ目し
                        しをて
                        て瞑い
                        はっな
                        いてい
http://bit.ly/rAOG9h
清水の舞台から
    飛び降りない




http://bit.ly/tnB8i0
http://bit.ly/shZMnK




デプロイするたびに人手
で全体をテストするのは
無理
ITアーキテクト「機能テストの自動化について考える」
より引用
http://www.itarchitect.jp/print/?menu3=24601




テスト自動化の損益分岐点
は相当早期にある感覚
ゕジャ゗ルでの品質の作りこみ
Scrumの場合
                     24時間




                     スプリント
                     2~4週間
  スプリントゴール

      返品
              スプリント
                             出荷可能な製品の
  Return
  キャンセル       バックログ            積み上げ
  Gift wrap
   クーポン
  Cancel
  ギフト包装       クーポン     単体テスト、結合テスト、
                       受け入れテストがスプリン
プロダクトバックログ             ト単位(もしくはリリース単
                          位)で行われる.
ゕジャ゗ルでの品質の作りこみ




スプリント終了時には「テスト」が完了.スプリントレ
ビューで顧客のビジネス要件への適合性も確認できる
http://www.flickr.com/photos/kakutani/2761992149/
ゕジャ゗ルでの品質の作りこみ
Scrumではフレームワークの定義のみで、テスト自
動化については触れられていない.しかしゕジャ゗ル
開発においてはテスト自動化は必須




                   小規模リリースのたびに
                   手動でテストするとスプ
                   リント後半になるにつれ
                   てテストコストが膨らむ

自動化しないとソフトウェア規模に応じて、テスト工数の占め
る割合が増加していく(=価値への投資が減少)
テストの4象限
                  ビジネス面(ビジネス的品質)
       【自動と手動】           【手動】※1
       機能テスト             探索的テスト
       ストーリーテスト          シナリオテスト
       プロトタイプ            ユーザビリティテスト
       シミュレーション          ユーザー受入テスト
                         アルファ版、ベータ版
   チ                                      製
   ー              第2象限             第3象限   品
   ム                                      を
   を   【自動化】             【ツール】            批
   支                                      評
   援   単体テスト             パフォーマンステスト
       コンポーネントテスト        負荷テスト
                         セキュリティテスト



                  第1象限             第4象限
                   技術面(技術的品質)

※1 ATDD等では自動化
テストの4象限
 第1象限        チームを支援する技術面のテスト
 テスト駆動開発などアジャイル開発の中心。


 第2象限        チームを支援するビジネス面のテスト
 顧客の視点からのハイレベルの機能テストなど。


 第3象限        製品を批評するビジネス面のテスト
 ユーザー受入テスト、探索的テストなど。


 第4象限        技術面のテストを使った製品の批評
 パフォーマンステスト、セキュリティテストなど。

「アジャイルテスト ―高品質を追求するアジャイルチームにおけるテストの視点―」増田聡氏
http://codezine.jp/devsumi/2010/report/07/ より引用
自動化されたテストの要件
自動化されたテストは以下の条件を満たしている必要がある。

繰り返し可能 (Repeatable)
何回でも繰り返し実行できること。また実行ごとに結果が変わらないこと

独立性 (Independent)
環境や外部のコンポーネントに依存しないこと
テストケースの実行順序に依存しないこと

自己検証 (Self validation)
テストが成功したか、失敗したかはプログラムが判断する。
(人手で判断しない)

簡単実行 (Easy)
テストの準備に大量の時間や人手がかかるようにしない
ツール・手法のマッピング(例)
                ビジネス面(ビジネス的品質)
     【自動と手動】            【手動】
     機能テスト              探索的テスト
             Selenium
     ストーリーテスト           シナリオテスト
            Cucumber
     プロトタイプ             ユーザビリティテスト
              Rspec
     シミュレーション           ユーザー受入テスト
            FitNess …
                        アルファ版、ベータ版
 チ                                        製
 ー     CI推奨     第2象限     一部CI可能    第3象限   品
 ム                                        を
 を   【自動化】              【ツール】             批
 支                                        評
 援   単体テスト              パフォーマンステスト
                              Jmeter
     コンポーネントテスト
            TDD         負荷テスト
                            WebScarab
            xUnit       セキュリティテスト
                             RatProxy
         PMD, CPD …
                            ValGrind …

       CI必須     第1象限      CI推奨     第4象限
                  技術面(技術的品質)
テスト自動化の進め方
プロダクトバックログ




                      レガシーコードにおい
              スプリント   て、製品コードの開発
              バックログ
                      をとめて自動化のみへ
                      投資するのは現実的に
                      難しいので、投資割合
テスト自動化バックログ




                      をきめて、予めバック
                      ログに組み込むことが
                         望ましい
問題修正にかかる時間

フェーズ            修正までの時間

要求や設計             5分

コードやユニットテスト       15分

結合テストやシステムテスト     1時間

ベータテスト            2時間

リリース後             1日
5.継続的
インテグレーション
継続的インテグ
                       レーションの導入
                       と利用促進の7ス
                       テップ




http://bit.ly/soiCFy
http://bit.ly/rVAW90




ビルドサーバを
用意する
夜間ビルドを
行う




         http://bit.ly/rubXiA
夜間ビルド+
                       コミット時の
                       ユニットテスト



http://bit.ly/s3W9aF
メトリクスの取得




http://bit.ly/rYN42H
テストに対する信
                       頼性と依存性の確
                       立



http://bit.ly/rOloeO
自動化された受け
                       入れテスト+デプ
                       ロイ自動化



http://bit.ly/sP6BvN
継続的なデプロイ




http://bit.ly/uc3x59
CIサーバの構築
• プロジェクト初期の段階でコードがなくても構
  築する
• コードのメトリクスや静的解析は初期から継続
  的に実施する方が効果がある
• 常にグリーン(Jenkinsなら青)の状態を保ち、エ
  ラーがある状態に慣れない
• 常にグリーンに保つにはアトミックな単位での
  作業、マイグレーションとの連携、チームのコ
  ミットに対する態度が欠かせない
Jenkinsでの例
CIゕンチパターン
•   頻繁にSCMにコミットしない
•   テストコードを書かない
•   テストコードと製品コードを同時にコミットしない
•   定時ビルドのみでコミットビルドがない・夜間ビルドしかない
•   帰り際にコミットしてそのままCIの結果を見ずに帰る
•   CIでテストを通すために手作業の準備が必要
•   メインラインのみで大きなブランチをCI対象にしていない
•   様々な種類のテストをまとめて行っている
•   ビルドの失敗に気付かない
•   ビルドに失敗しても放置している
CIゕンチパターン
• ビルドの失敗に気づいても、修正コード以外のコードをコミットす
  る
• 何も変更していないのにビルドが落ちたり落ちなかったりする
• 頻繁にビルドが失敗しているので、失敗するのが普通だと思う
• CIからの通知メッセージが大量すぎる
• CIが落ちても何も通知しない
• CIサーバのリソースが貧弱
• ビルドが肥大化して結果が出るまでに時間がかかる
• 本番環境やステージング環境と大幅に環境が異なる
• コードの静的解析をCIで行わずに人手で行う
• CIサーバがおかしくなったときに直せる人がいない
• ずっとCIでのチェック内容が変わらない、プロセスが変わらない
第1象限での自動評価
プロジェクトの特性や要員構成等に応じて決める
テスト件数と結果(単体、結合)   PMD警告件数




Checkstyle警告件数    カバレージ
チーム活動の評価
コード行数     コミット時間




ゕクテゖビテゖ
6.マイグレーションの利用
DBスキーマのバージョン管理




データベースのスキーマの状態とリリース
の状態を関連付けることによって再現可能
にする
既存のゕプローチの問題
                              http://bit.ly/vbtqZc




   sqlスクリプトフゔ゗ルは管理が煩雑
   sqlスクリプトは自動実行に向かない
   ロールバックやデータ移行の考慮もしづらい
   複数のsqlスクリプトの実行順序の制御が難しい
問題の例
 SQLの実行順序によって状態が変わってしまう
1.sql                   1→2の順に実行すると….
alter table users add
column lastlogin
datetime after name;

2.sql
alter table users add
column disabled
                        2→1の順に実行すると….
boolean default false
after name;
マ゗グレーション(PHPの場合)
データベースの変更管理
$ 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
マ゗グレーションの状態
mysql>
mysql>
mysql>
mysql>
mysql> select * from migration_version;
+---------+
| version |                 現在30個目のマ゗グレー
+---------+                 ションフゔ゗ルまで登録
|      30 |                   済であることを指す
+---------+
1 row in set (0.08 sec)

mysql>
mysql>
マ゗グレーション実行
   コマンド1つで最新のバージョンに更新したり、
     特定のバージョンに戻すことができる


# 最新のバージョンへ更新
$ php doctrine_cli.php migrate

# 指定したバージョンへ更新
$ php doctrine_cli.php migrate 29

マ゗グレーションフゔ゗ルをソースコードとしてバージョ
ン管理し、CIのビルド定義の中にマ゗グレーションコマン
 ドを組み込むことで、自動的にDBの状態を連動させる
オープンソースのマ
イグレーションツー
ルは色々ある!
7.環境構築自動化
なぜ環境構築の自動化が必要?

そもそも時間がかかる
数が増えれば単純作業の繰り返し
人手による単純作業はミスを誘発
ミスした場合でも検知する仕掛けが本番障
 害しかない
手順書がメンテナンスされないことがある
手順書の手順の妥当性の評価が難しい
手順の逆転により状態が変わりうる
ミドルや設定゗ンストールの自動化

        いつでも
        クリーンな
        動作環境を作れ
        るようにする


http://bit.ly/vMHRjL
ミドルや設定゗ンストールの自動化

                       この自動化に
                       よって後はア
                       プリケーショ
                       ンをデプロイ
                       すればすぐ動
                       作する状態に
                       する
http://bit.ly/v30Zl7
ミドルや設定゗ンストールの自動化




           http://bit.ly/ttwsmT




 本番環境と開発環境の各種
 バージョンをあわせる
ミドルや設定゗ンストールの自動化



ミドルウェアのバージョ
ンをあげる場合も、この
自動化機構を使って行う
仮想化と自動化(Vagrant)
Vagrantの゗ンストールと起動

$ sudo gem install vagrant
$ sudo vagrant box add lucid32
http://files.vagrantup.com/lucid32.box
$ sudo vagrant init
$ sudo vagrant up


わずか4ステップで、仮想イン
スタンスが起動する!!
Vagrantフゔ゗ルでの設定

        Vagrantファイルで、ベース
        ボックス名やVirtualBoxの
        GUI表示の有無、インスタン
        ス名、メモリ容量、自動実行
        するChefのRecipeなどを指
        定できる
Vagrantのプラグ゗ンでの拡張
 SaharaによるSandbox機能の導入

$ sudo git clone https://github.com/jedi4ever/sahara.git
$ cd sahara
$ sudo rake build
$ cd pkg
$ sudo gem install ./sahara-0.0.7.gem


Sandbox機能を使うことで、ミドルウェアの
バージョンアップの検証や、構成の変更の検
証を気軽に行えるようになる。
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
Chef/Chef-solo
Chefとは?
 • Ruby製のシステム管理ツール
 • 出来ること
  –   OSのパッケージのインストールや管理
  –   OSの設定やミドルウェアの設定
  –   サービスの起動・停止
  –   クーロンの設定
 • 特徴
  –   Rubyでジョブや設定を記述する
  –   Chef自体はクライアント/サーバモデル
  –   Chef-soloを使えばローカル単体で動作
  –   Recipeが多数公開されている
バージョンを指定し
てパッケージをイン
ストールすることも
可能
Cookbook (37signals)
Cookbook(opscode)
その他の選択肢としてPuppet等
8.デプロイ自動化
http://bit.ly/vd1Nin




プロジェクト最初に、
(デプロイするものが
なくても)デプロイを
   自動化する
http://bit.ly/u27Oiz




                       プロジェクトのあ
                       いだ、ずっとデプ
                       ロイスクリプトを
                       使うことで、プロ
                       セスがテストされ
                       続ける

                       開発環境・本番環
                       境問わず、同じ方
                       法でデプロイする
デプロイが失敗した場
                       合にロールバックでき
                       るようにする




http://bit.ly/vFzaU9
デプロイが途中で失敗
                       した場合、その先を手
                       動でやらない
http://bit.ly/w34bFM
Capistrano




Railsゕプリのデプロ゗に利用されることが多いが、もちろんそ
れ以外にも利用可能。SSHで接続し、サーバに対して色々な操作
を行うことが出来る。
ワンクリックデプロイ101 #ocdeploy
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.
Webistrano
9.テクニック
ビルド(デプロ゗)パ゗プラ゗ン
ビルド(デプロ゗)パ゗プラ゗ン
• SCMへのコミットをトリガーにする
• 開発者のリズムを維持するために、最初にユ
  ニットテストや一部のスモークテストを行い素
  早く開発者にフィードバックする
• 時間のかかる結合テストや受け入れテストは、
  前工程が正常だった場合のみに行う
• これによってムダな時間を使わないようにする
• ユーザビリティテストや探索的テストのうち自
  動化できないものもプロセスとしてはパイプラ
  イン上に定義
• 最後にデプロイできれば、デプロイパイプライ
  ン
10.デモ
デモ
• Vagrant+Chef-soloによる環境構築
• Doctrineによる簡単マイグレーション
• Capistrano・Webisitanoによるワンクリックデ
  プロイ
• Jenkins + Capistranoによるデプロイメントパ
  イプライン

More Related Content

ワンクリックデプロイ101 #ocdeploy