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

何も考えずにCIや継続的デリバリーしたら辛くなった話.pdf

ota42y
September 14, 2014
2.7k

 何も考えずにCIや継続的デリバリーしたら辛くなった話.pdf

ota42y

September 14, 2014
Tweet

Transcript

  1. 何も考えずにCIや
    継続的デリバリーしたら
    ⾟辛くなった話

    View Slide

  2. 継続的インテグレーション

    View Slide

  3. CIのススメ
    リポジトリのコミットを監視して⾃自動実⾏行行
    実行指示
    コミットフック  
    定期実行

    View Slide

  4. CIのススメ
    リポジトリのコミットを監視して⾃自動実⾏行行
    テストやテストサーバに⾃自動デプロイ等
    実行指示
    コミットフック  
    定期実行
    デプロイ
    テストサーバ

    View Slide

  5. 継続的デプロイのススメ
    たとえば毎⽇日のように、
    細かく新機能をデプロイしていく⼿手法
    本番サーバ
    開発 deploy
    一日に何回もぐらいのペースで繰り返す

    View Slide

  6. Inspec'on
    Deploy
    Test
    Build
    CI  
    (継続的インテグレーション)
    本番サーバ
    開発 deploy
    一日に何回もぐらいのペースで繰り返す

    View Slide

  7. Inspec'on
    Deploy
    Test
    Build
    CI  
    (継続的インテグレーション)
    本番サーバ
    開発 deploy
    一日に何回もぐらいのペースで繰り返す

    View Slide

  8. ┗(^o^    )┓
     ┏┗  
    最近は  CIや継続的デリバリーが
    流流⾏行行ってるらしいぞ

    View Slide

  9. ┏(    ^o^)┛  
      ┛┓  
    このスマホアプリも
    導⼊入しよう

    View Slide

  10. ┗(^o^    )┓
     ┏┗  

    View Slide

  11. ┏(    ^o^)┛  
      ┛┓  

    View Slide

  12. ┗(^o^    )┓
     ┏┗  

    View Slide

  13. ┏(    ^o^)┛  
      ┛┓  

    View Slide

  14.       三┏(    ^o^)┛  
          三  ┛┓  
    ヤルゾ

    View Slide

  15.       三┏(    ^o^)┛  
          三  ┛┓  
       | |   §  |   |  
       | | |      §        |   |  
       ___§___  
      |                Jenkins                |  
      ▼▼▼▼▼▼▼

    View Slide

  16.        §  
           §  
           §  
           §  ティウンティウンティウン
            §  
       | | .§  |   |  
       | | |.  §◎|   |  
       __◎§__◎  
      |        Jenkins  ◎_ |  
      ▼◎▼  ▼◎  ▼◎

    View Slide

  17. 討ち死にました

    View Slide

  18. 何が起きたか
    違う環境の⼿手法を、
    ⼿手法ベースで持ってきたことで、
    不不整合を起こして死んだ。

    View Slide

  19. Job割り当てで死ぬ
    Jobを分割して平⾏行行ビルドできる!
    アップロードします

    View Slide

  20. Job割り当てで死ぬ
    Jobを分割して平⾏行行ビルドできる!
    アップロードします
    アップロードします

    View Slide

  21. Job割り当てで死ぬ
    Jobを分割して平⾏行行ビルドできる!
    アップロードします
    アップロードします
    アップロードします
    アップロードします
    アップロードします

    View Slide

  22. Job割り当てで死ぬ
    Jobを分割して平⾏行行ビルドできる!
    アップロードします
    アップロードします
    アップロードします
    アップロードします
    アップロードします
    同時に
    送るな!!!

    View Slide

  23. Job割り当てで死ぬ
    Jobを分割して平⾏行行ビルドできる!
    アップロードの平⾏行行処理理は⼤大体出来ない
    アップロードします
    アップロードします
    アップロードします
    アップロードします
    アップロードします
    同時に
    送るな!!!

    View Slide

  24. Job割り当てで死ぬ
    ビルドしました
    ビルドしました
    ビルドしました
    ビルドしました
    ビルドしました

    View Slide

  25. Job割り当てで死ぬ
    ビルドしました
    ビルドしました
    ビルドしました
    ビルドしました
    ビルドしました
    アップロードします

    View Slide

  26. Job割り当てで死ぬ
    アップロード処理理だけ別Job化で排他制御
    ビルドしました
    ビルドしました
    ビルドしました
    ビルドしました
    ビルドしました
    アップロードします

    View Slide

  27. Job割り当てで死ぬ
    アップロード処理理だけ別Job化で排他制御
    ビルドしました
    ビルドしました
    ビルドしました
    ビルドしました
    ビルドしました
    アップロードします
    DEAD  LOCK

    View Slide

  28. Job割り当てで死ぬ
    JenkinsはJobキューの制御が弱く
    特定のキューのみ別の優先度度とか出来ない

    View Slide

  29. Job割り当てで死ぬ
    JenkinsはJobキューの制御が弱く
    特定のキューのみ別の優先度度とか出来ない
    ビルドしました
    ビルドしました
    ビルドしました
    ビルドしました
    同時実⾏行行数4の場合

    View Slide

  30. Job割り当てで死ぬ
    JenkinsはJobキューの制御が弱く
    特定のキューのみ別の優先度度とか出来ない
    ビルドしました
    ビルドしました
    ビルドしました
    ビルドしました
    実行待ちです…
    同時実⾏行行数4の場合

    View Slide

  31. Job割り当てで死ぬ
    JenkinsはJobキューの制御が弱く
    特定のキューのみ別の優先度度とか出来ない
    終了マダー?
    終了マダー?
    終了マダー?
    終了マダー?
    実行待ちです…
    同時実⾏行行数4の場合

    View Slide

  32. Job割り当てで死ぬ
    JenkinsはJobキューの制御が弱く
    特定のキューのみ別の優先度度とか出来ない
    終了マダー?
    終了マダー?
    終了マダー?
    終了マダー?
    4個以上同時には  
    処理出来ません
    同時実⾏行行数4の場合

    View Slide

  33. Job割り当てで死ぬ
    JenkinsはJobキューの制御が弱く
    特定のキューのみ別の優先度度とか出来ない
    ビルドしました
    ビルドしました
    ビルドしました
    ビルドしました
    同時実⾏行行数5に増やした

    View Slide

  34. Job割り当てで死ぬ
    JenkinsはJobキューの制御が弱く
    特定のキューのみ別の優先度度とか出来ない
    ビルドしました
    ビルドしました
    ビルドしました
    ビルドしました
    同時実⾏行行数5に増やした
    ビルドしました

    View Slide

  35. Job割り当てで死ぬ
    JenkinsはJobキューの制御が弱く
    特定のキューのみ別の優先度度とか出来ない
    ビルドしました
    ビルドしました
    ビルドしました
    ビルドしました
    実行待ちです…
    同時実⾏行行数5に増やした
    ビルドしました

    View Slide

  36. 解決策
    Jenkinsはノード事にJob制御が出来るため
    アップロード専⽤用ノードを作る

    View Slide

  37. ビルドしました
    ビルドしました
    ビルドしました
    ビルドしました
    アップロードします
    解決策
    ビルド数4 ビルド数1
    Node-­‐A Node-­‐B

    View Slide

  38. リリースできなくて死ぬ

    View Slide

  39. リリースできなくて死ぬ
    継続的デリバリーでは
    細かい単位でユーザに対してリリースする
    手動デプロイ
    サーバ
    自動デプロイ
    ユーザ
    1⽇日1回~∼1⽇日何回も

    View Slide

  40. リリースできなくて死ぬ
    スマホアプリは、直接配信ではなく、
    プラットフォームに対して配信する
    手動デプロイ
    自動デプロイ
    ユーザ

    View Slide

  41. リリースできなくて死ぬ
    新バージョン出来た
    リリース作業 ユーザ

    View Slide

  42. リリースできなくて死ぬ
    新バージョン出来た
    リリース作業 ユーザ
    公開:  最⼤大24時間
    公開:  最⼤大24時間

    View Slide

  43. リリースできなくて死ぬ
    新バージョン出来た
    リリース作業 ユーザ
    公開:  最⼤大24時間
    審査:  ⼀一週間程度度
    公開:  最⼤大24時間

    View Slide

  44. そもそも不不可能…  (´́・_̲・`̀)

    View Slide

  45. ⽬目的を考える
    そもそも継続的デリバリーの何がいいの?

    View Slide

  46. ⽬目的を考える
    そもそも継続的デリバリーの何がいいの?
    リリース
    ユーザ

    View Slide

  47. ⽬目的を考える
    そもそも継続的デリバリーの何がいいの?
    リリース
    ユーザ
    ユーザの反応を⾒見見て直す

    View Slide

  48. ⽬目的を考える
    そもそも継続的デリバリーの何がいいの?
    リリース
    ユーザ
    ユーザの反応を⾒見見て直す
    ユーザの反応を、素早く得ることで、
    作りすぎ等を避け、より早く
    ユーザにとっていいものを作れる

    View Slide

  49. 実際のユーザは無理理でも、
    フィードバックをくれる⼈人なら意味がある
    解決策
    手動デプロイ
    自動デプロイ

    View Slide

  50. 実際のユーザは無理理でも、
    フィードバックをくれる⼈人なら意味がある
    解決策
    手動デプロイ
    自動デプロイ
    企画職や
    別部署の⼈人

    View Slide

  51. 実際のユーザは無理理でも、
    フィードバックをくれる⼈人なら意味がある
    解決策
    手動デプロイ
    自動デプロイ
    企画職や
    別部署の⼈人

    View Slide

  52. ビルドが⻑⾧長すぎて死ぬ

    View Slide

  53. ビルドが⻑⾧長すぎて死ぬ
    テストは5分-‐‑‒10分、10分超えると⻑⾧長い
    (Rails本体ぐらい巨⼤大だと15-‐‑‒20分前後)
    実行指示
    コミットフック  
    定期実行
    デプロイ
    テストサーバ

    View Slide

  54. ビルドが⻑⾧長すぎて死ぬ
    ビルドに最低30分かかってた

    View Slide

  55. ビルドが⻑⾧長すぎて死ぬ
    ビルドに最低30分かかってた
    タイミングが悪いと…
    ×××をビルドして!!!!
    コミットビルドと定期ビルド
    を実⾏行行中ですので、
    1時間後に開始予定です

    View Slide

  56. つらい…  (´́・_̲・`̀)

    View Slide

  57. ⽬目的を考える
    そもそも何故詰まるほどビルドするのか?
    定期的にデリバリーするため&
    動かなくなった時に、素早く検知するため。
    バグの早期発⾒見見で開発の効率率率を上げる為
    →やっぱり待ち時間が⻑⾧長いのはまずいよね

    View Slide

  58. 解決策
    待ち時間を早くするには
    ・ビルド時間を減らす
    ・並⾏行行処理理をする

    View Slide

  59. 解決策
    待ち時間を早くするには
    ・ビルド時間を減らす
    ・並⾏行行処理理をする
    コードで頑張るには
    ⼿手間がかかる

    View Slide

  60. 解決策
    待ち時間を早くするには
    ・ビルド時間を減らす
    ・並⾏行行処理理をする
    コードで頑張るには
    ⼿手間がかかる
    複数台ビルドで  
    待ち時間短縮

    View Slide

  61. 解決策
    待ち時間を早くするには
    ・ビルド時間を減らす
    ・並⾏行行処理理をする
    コードで頑張るには
    ⼿手間がかかる
    ⾦金金で解決! 複数台ビルドで  
    待ち時間短縮

    View Slide

  62. 解決策
    待ち時間を早くするには
    ・ビルド時間を減らす
    ・並⾏行行処理理をする
    コードで頑張るには
    ⼿手間がかかる
    ⾦金金で解決! 複数台ビルドで  
    待ち時間短縮
    分散ビルド、静的リンク等も模索中…  
    Xcodeは分散できないけど

    View Slide

  63. まとめ
    この⼿手法いいよ!っていうのを
    考えなしに持ってくるのと失敗する
    なんのためにやってるのか、⽬目的を考え、
    ⼀一番あった⼿手法にきちんと落落とし込むべき
    導⼊入は⼤大変だけど、
    効果はかなり⾼高い気がする

    View Slide