Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

┗(^o^    )┓  ┏┗  

Slide 11

Slide 11 text

┏(    ^o^)┛     ┛┓  

Slide 12

Slide 12 text

┗(^o^    )┓  ┏┗  

Slide 13

Slide 13 text

┏(    ^o^)┛     ┛┓  

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

討ち死にました

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

リリースできなくて死ぬ

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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