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

CakePHP+Jenkinsによるアジャイル開発 #phpmatsuri

CakePHP+Jenkinsによるアジャイル開発 #phpmatsuri

2012/11/3に博多で行われたPHPMatsuri2012で話をした際のスライドです。CakePHPとタイトルにありますが、CakePHPの話はほとんどありませんw。内容は過去のワンクリックデプロイ勉強会の再構成です。

Ryutaro YOSHIBA

November 03, 2012
Tweet

More Decks by Ryutaro YOSHIBA

Other Decks in Technology

Transcript

  1. ٢Ӌཾଠ࿠ Ryutaro  YOSHIBA アジャイルコーチ Web: http://www.ryuzee.com     Twitter:  @ryuzee

    認定スクラムプロフェッショナル 認定スクラムマスター 認定スクラムプロダクトオーナー Microsoft  MVP  for  Visual  Studio  ALM
  2. γεςϜͷػೳͷར༻ׂ߹ 4455 %% 1199 %% 1166 %% 1133 %% 77

    %% Standishの2000年年の調査より   いつも使う よく使う たまに使う ほとんど使わない まったく使わない
  3. ΞδϟΠϧϚχϑΣετ 11..  プロセスやツールより人と人同士の相互 作用を重視する。 22..  包括的なドキュメントより動作するソフ トウェアを重視する。 33..  契約上の交渉よりも顧客との協調を重視 する。

    44..  計画に従うことよりも変化に対応する ことを重視する。 顧客満足を最優先し、 価値のあるソフトウェアを 早く継続的に提供します。
  4. ձ৔ௐࠪ •  全員起⽴立立してください •  ユニットテストを書いていない⽅方は着席 •  結合テストを⾃自動化していない⽅方は着席 •  継続的インテグレーションサーバを使っていな い⽅方は着席

    •  デプロイを⾃自動化していない⽅方は着席 •  環境構築を⾃自動化していない⽅方は着席 最後まで起立されている方は 帰って大丈夫ですw
  5. プロダクトバックログ 製品の機能をストーリー形式で記載 プロダクトオーナーが優先順位を付け、プラ ンニングポーカーで相対⾒見見積もり。 項⽬目の追加はいつでも⾃自由だが実施有無や優 先順位はPOが決める。 チーム  (6±3⼈人) プロダクトの開発を⾏行行う。 製品の成功に向けて最⼤大限

    の努⼒力力をコミットする スクラムマスター スクラムプロセスがうまく いくようにする。 外部からチームを守る プロダクトオーナー 製品に対して責任をもち機能 に優先順位を付ける ステークホルダー 製品の利利⽤用者、出資者、管理理職 などの利利害関係者。鶏と称す スプリントバックログ そのスプリント期間中に⾏行行う タスクのリスト スプリント 最⼤大4週間までのタイムボックス 各スプリントの⻑⾧長さは同⼀一。この間は外部 からの変更更を受け⼊入れない スプリントレビュー スプリント中の成果である 動作するソフトウェアをデモ する レトロスペクティブ スプリントの中での改善事項 を話合い次に繋げる 複 数 回 ス プ リ ン ト を 繰 り 返 す 出荷可能な 製品の増分 スプリント計画会議 プロダクトバックログを再度度分析・評価し、 そのスプリントで開発するプロダクトバック ログアイテムを選択する。また選択した項⽬目 をタスクにばらす 完了了の定義 何をもって「完了了」とするかを 定義したリスト 毎⽇日の繰り返し デイリースクラム 毎⽇日チームが以下の3つの質問に答える ・昨⽇日やったこと ・今⽇日やること ・困っていること バーンダウンチャート スプリントタスクの「推定残り時間」を 更更新してグラフにプロットする タスク 時間で⾒見見 積もり
  6. ੒Ռ෺ͷසൟͳ֬ೝ 1番⽬目にほしい 2番⽬目にほしい 3番⽬目にほしい 4番⽬目にほしい 5番⽬目にほしい 呍 呍 呍 99番⽬目にほしい

    100番⽬目にほしい よし頼んだ通りなのでOKです。 完了了だ! あれ、ここクリックすると遷移先 が違うね。これは未完了了 あ、こうなるのか。頼んだ通りだ から完了了だけど、次のスプリント で機能追加しようか! この感じだと、秋ごろリ リースかな。次のスプリ ントはこの内容でどう?
  7. 91rݸͷϓϥΫςΟε 反復 メタファー 作業空間 ふりかえり テスト駆動開発 ペアプロ リファクタリング コードの  

    共同所有 継続的インテグ レーション YAGNI 責任 擁護 四半期毎の   見直し ミラー 持続可能な   ペース ストーリー作成 リリース計画 受け入れテスト 短期リリース
  8. 4DSVNʴ91 ü  Scrumではフレームワークの定義のみで、テスト ⾃自動化については触れられていない.しかしアジャ イル開発においてはテスト⾃自動化は必須 ⼩小規模リリー スのたびに⼿手 動でテストす るとコード ベースが⼤大き

    くなるにつれ てテストコス トが膨らむ ⾃自動化しないとソフトウェア規模に応じて、テスト⼯工数の占め る割合が増加してき価値への投資が減少する アジャイルかウォーターフォールかという話では なく、現代のソフトウェアのライフサイクルを考 慮すると、テスト自動化は当然の流れと言える
  9. テ ス ト し て い な い も の

    を 目 を 瞑 っ て デ プ ロ イ し て は い け な い http://bit.ly/rAOG9h
  10. ΞδϟΠϧͰͷ඼࣭ͷ࡞Γ͜Έ 4DSVNͷ৔߹ Cancel Gift  wrap Return スプリント 2~∼4週間 返品 スプリントゴール

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

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

    アルファ版、ベータ版 【⾃自動化】 単体テスト コンポーネントテスト 【ツール】 パフォーマンステスト 負荷テスト セキュリティテスト 第1象限 第2象限 第3象限 第4象限 技術⾯面(技術的品質) ビジネス⾯面(ビジネス的品質) チ ー ム を ⽀支 援 製 品 を 批 評 πʔϧɾख๏ͷϚοϐϯά ྫ  TDD PHPUnit PMD,  CPD  … Jmeter WebScarab RatProxy  … Selenium Behat RobotFramework… CI推奨 CI推奨 CI必須 ⼀一部CI可能
  13. 1)16OJUԽ •  〜~CakePHP  1.3 SimpleTest •  CakePHP  2〜~    

         PHPUnit •  デファクトのライブラリへ変更更 •  テストを作りやすい •  xdebugとの連携が容易易でCoverageの取得がし やすい •  ̶—log-‐‑‒junitオプションによる結果のXML出⼒力力が 可能でJenkinsと連携しやすい
  14. 1)16OJU༻ઃఆϑΝΠϧͷར༻ <phpunit> <logging> <log  type="coverage-‐‑‒html"  target="./reports/coverage_̲html/"   title="My  Project"  charset="UTF-‐‑‒8"

     yui="true"  highlight="true"   lowUpperBound="35"  highLowerBound="70"/> <log  type="coverage-‐‑‒clover"  target="./reports/coverage.xml"/> <log  type="junit"  target="./reports/unittest.xml"   logIncompleteSkipped="false"/> </logging> <filter>    <blacklist>        <directory  suffix=".php">lib</directory>        <directory  suffix=".php">app/Test</directory>        <directory  suffix=".php">app/Vendor</directory>        <directory  suffix=".php">app/Lib</directory>    </blacklist> </filter> </phpunit>
  15. h-p://www.flickr.com/photos/Omothymorgan/75593157/ खൈ͖ͷ'JYUVSF͸ͬ͠΃ฦ͋͠Γ app.user   app.user2   app.user3   app.user4  

    app.user_test_foo   app.user_test_bar   app.role   app.role2   app.role_test_foo_and_bar   app.group   app.group2   …….
  16. $*Ξϯνύλʔϯ •  頻繁にSCMにコミットしない •  テストコードを書かない •  テストコードと製品コードを同時にコミットし ない •  定時ビルドのみでコミットビルドがない・夜間

    ビルドしかない •  帰り際にコミットしてそのままCIの結果を⾒見見ず に帰る •  CIでテストを通すために⼿手作業の準備が必要 •  メインラインのみで⼤大きなブランチをCI対象に していない
  17. $*Ξϯνύλʔϯ •  様々な種類のテストをまとめて⾏行行っている •  ビルドの失敗に気付かない •  ビルドに失敗しても放置している •  ビルドの失敗に気づいても、修正コード以外の コードをコミットする

    •  何も変更更していないのにビルドが落落ちたり落落ち なかったりする •  頻繁にビルドが失敗しているので、失敗するの が普通だと思う •  CIからの通知メッセージが⼤大量量すぎる •  CIが落落ちても何も通知しない
  18. $*Ξϯνύλʔϯ •  CIサーバのリソースが貧弱 •  ビルドが肥⼤大化して結果が出るまでに時間がか かる •  本番環境やステージング環境と⼤大幅に環境が異異 なる • 

    コードの静的解析をCIで⾏行行わずに⼈人⼿手で⾏行行う •  CIサーバがおかしくなったときに直せる⼈人がい ない •  ずっとCIでのチェック内容が変わらない、プロ セスが変わらない
  19. $BLF1)1༻ʹ+FOLJOTΛઃఆ xUnit  Plugin テスト結果のjunit互換xmlを取り込む Checkstyle  plugin PHP_̲CodeSnifferのチェック結果を取 り込む Javadoc  Plugin

    phpDocumentorの結果を取り込む PMD  Plugin PHPMDのチェック結果を取り込む Clover  Plugin カバレッジの計算結果を取り込む DRY  Plugin コピペ分析の結果を取り込む
  20. $BLF1)1༻ʹઃఆ͢Δ CakePHP⽤用のコーディング規約の導⼊入 pear  channel-‐‑‒discover  pear.cakephp.org pear  install  cakephp/CakePHP_̲CodeSniffer 実⾏行行(概要) phpcs

     -‐‑‒-‐‑‒report=summary    -‐‑‒-‐‑‒ standard=CakePHP  -‐‑‒-‐‑‒extensions=php  ./app 実⾏行行(詳細) phpcs  -‐‑‒-‐‑‒report=checkstyle  -‐‑‒-‐‑‒report-‐‑‒ checkstyle=./reports/checkstyle.xml  \ -‐‑‒-‐‑‒extensions=php  ./app
  21. +FOLJOTͱ૊Έ߹ΘͤΔ ビルド定義 cd  ${WORKSPACE}  &&  phpcs  -‐‑‒-‐‑‒report=checkstyle  \ -‐‑‒-‐‑‒report-‐‑‒checkstyle=${WORKSPACE}/reports/checkstyle.xml  \

    -‐‑‒-‐‑‒standard=CakePHP  -‐‑‒-‐‑‒extensions=php  \ -‐‑‒-‐‑‒ignore=Vendor/*,Plugin/*  ./app  ||  id
  22. ໰୊ͷྫ 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の順に実⾏行行すると….
  23. ϚΠάϨʔγϣϯ࣮ߦ $  Console/cake  Migrations.migration  run Cake  Migration  Shell -‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒ Available

     migrations:    [1351374894]  1351374894_̲add_̲items                not  applied -‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒ Please,  choose  what  version  you  want  to  migrate  to.  [q]uit  or   [c]lean.     >  1351374894 -‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒ Running  migrations:    [1351374894]  1351374894_̲add_̲items            >  Creating  table  items. All  migrations  have  completed. コマンド1つで最新のバージョンに更更新したり、 特定のバージョンに戻すことができる マイグレーションファイルをソースコードとしてバージョ ン管理理し、CIのビルド定義の中にマイグレーションコマン ドを組み込むことで、⾃自動的にDBの状態を連動させる
  24. DBQίϚϯυ 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.
  25. 7BHSBOUͷΠϯετʔϧͱىಈ $  sudo  gem  install  vagrant   $  sudo  vagrant

     box  add  lucid32  h-p:// files.vagrantup.com/lucid32.box   $  sudo  vagrant  init   $  sudo  vagrant  up   わずか4ステップで、仮想イン スタンスが起動する!!!!
  26. 7BHSBOUͷϓϥάΠϯͰͷ֦ு SaharaによるSandbox機能の導⼊入 $  sudo  git  clone  h-ps://github.com/jedi4ever/sahara.git   $  cd

     sahara   $  sudo  rake  build   $  cd  pkg   $  sudo  gem  install  ./sahara-­‐0.0.7.gem   Sandbox機能を使うことで、ミドルウェアの バージョンアップの検証や、構成の変更更の検 証を気軽に⾏行行えるようになる。
  27. $IFGͱ͸ʁ •  Ruby製のシステム管理理ツール •  出来ること –  OSのパッケージのインストールや管理理 –  OSの設定やミドルウェアの設定 – 

    サービスの起動・停⽌止 –  クーロンの設定 •  特徴 –  Rubyでジョブや設定を記述する –  Chef⾃自体はクライアント/サーバモデル –  Chef-‐‑‒soloを使えばローカル単体で動作 –  Recipeが多数公開されている
  28. ܧଓతσϦόϦʔ 繰り返し型の 開発 継続的 インテグレーション 継続的 デプロイ 継続的デリバリー Scrum u 要求に順位付け

    u タイムボックス による制御 u 検査と適⽤用によ る継続的改善 u 透明性の確保 u ⾃自⼰己組織型チー ム u 技術的プラク ティスの定義な し Scrum+XP u xUnit等による テスト⾃自動化 u テスト駆動開発 u コーディング規 約 u ペアプロ等 u 常時出荷可能な 品質を保持 u 主に技術的プラ クティスから構 成される Lean u Just  in  Timeで 顧客が必要なも のを必要なとき に。 u サイクルタイム を測定し改善す る。 u ビジネス活動そ のもの u 全体最適
  29. Ϗϧυ σϓϩΠ ύΠϓϥΠϯ •  SCMへのコミットをトリガーにする •  開発者のリズムを維持するために、最初にユ ニットテストや⼀一部のスモークテストを⾏行行い素 早く開発者にフィードバックする • 

    時間のかかる結合テストや受け⼊入れテストは、 前⼯工程が正常だった場合のみに⾏行行う •  これによってムダな時間を使わないようにする •  ユーザビリティテストや探索索的テストのうち⾃自 動化できないものもプロセスとしてはパイプラ イン上に定義 •  最後にデプロイできれば、デプロイパイプライ ン