何も考えずにCIや継続的デリバリーしたら⾟辛くなった話
View Slide
継続的インテグレーション
CIのススメリポジトリのコミットを監視して⾃自動実⾏行行実行指示 コミットフック 定期実行
CIのススメリポジトリのコミットを監視して⾃自動実⾏行行テストやテストサーバに⾃自動デプロイ等実行指示 コミットフック 定期実行 デプロイ テストサーバ
継続的デプロイのススメたとえば毎⽇日のように、細かく新機能をデプロイしていく⼿手法本番サーバ 開発 deploy 一日に何回もぐらいのペースで繰り返す
Inspec'on Deploy Test Build CI (継続的インテグレーション) 本番サーバ 開発 deploy 一日に何回もぐらいのペースで繰り返す
┗(^o^ )┓ ┏┗ 最近は CIや継続的デリバリーが流流⾏行行ってるらしいぞ
┏( ^o^)┛ ┛┓ このスマホアプリも導⼊入しよう
┗(^o^ )┓ ┏┗
┏( ^o^)┛ ┛┓
三┏( ^o^)┛ 三 ┛┓ ヤルゾ
三┏( ^o^)┛ 三 ┛┓ | | § | | | | | § | | ___§___ | Jenkins | ▼▼▼▼▼▼▼
§ § § § ティウンティウンティウン § | | .§ | | | | |. §◎| | __◎§__◎ | Jenkins ◎_ | ▼◎▼ ▼◎ ▼◎
討ち死にました
何が起きたか違う環境の⼿手法を、⼿手法ベースで持ってきたことで、不不整合を起こして死んだ。
Job割り当てで死ぬJobを分割して平⾏行行ビルドできる!アップロードします
Job割り当てで死ぬJobを分割して平⾏行行ビルドできる!アップロードします アップロードします
Job割り当てで死ぬJobを分割して平⾏行行ビルドできる!アップロードします アップロードします アップロードします アップロードします アップロードします
Job割り当てで死ぬJobを分割して平⾏行行ビルドできる!アップロードします アップロードします アップロードします アップロードします アップロードします 同時に送るな!!!
Job割り当てで死ぬJobを分割して平⾏行行ビルドできる!アップロードの平⾏行行処理理は⼤大体出来ないアップロードします アップロードします アップロードします アップロードします アップロードします 同時に送るな!!!
Job割り当てで死ぬビルドしました ビルドしました ビルドしました ビルドしました ビルドしました
Job割り当てで死ぬビルドしました ビルドしました ビルドしました ビルドしました ビルドしました アップロードします
Job割り当てで死ぬアップロード処理理だけ別Job化で排他制御ビルドしました ビルドしました ビルドしました ビルドしました ビルドしました アップロードします
Job割り当てで死ぬアップロード処理理だけ別Job化で排他制御ビルドしました ビルドしました ビルドしました ビルドしました ビルドしました アップロードします DEAD LOCK
Job割り当てで死ぬJenkinsはJobキューの制御が弱く特定のキューのみ別の優先度度とか出来ない
Job割り当てで死ぬJenkinsはJobキューの制御が弱く特定のキューのみ別の優先度度とか出来ないビルドしました ビルドしました ビルドしました ビルドしました 同時実⾏行行数4の場合
Job割り当てで死ぬJenkinsはJobキューの制御が弱く特定のキューのみ別の優先度度とか出来ないビルドしました ビルドしました ビルドしました ビルドしました 実行待ちです… 同時実⾏行行数4の場合
Job割り当てで死ぬJenkinsはJobキューの制御が弱く特定のキューのみ別の優先度度とか出来ない終了マダー? 終了マダー? 終了マダー? 終了マダー? 実行待ちです… 同時実⾏行行数4の場合
Job割り当てで死ぬJenkinsはJobキューの制御が弱く特定のキューのみ別の優先度度とか出来ない終了マダー? 終了マダー? 終了マダー? 終了マダー? 4個以上同時には 処理出来ません 同時実⾏行行数4の場合
Job割り当てで死ぬJenkinsはJobキューの制御が弱く特定のキューのみ別の優先度度とか出来ないビルドしました ビルドしました ビルドしました ビルドしました 同時実⾏行行数5に増やした
Job割り当てで死ぬJenkinsはJobキューの制御が弱く特定のキューのみ別の優先度度とか出来ないビルドしました ビルドしました ビルドしました ビルドしました 同時実⾏行行数5に増やしたビルドしました
Job割り当てで死ぬJenkinsはJobキューの制御が弱く特定のキューのみ別の優先度度とか出来ないビルドしました ビルドしました ビルドしました ビルドしました 実行待ちです… 同時実⾏行行数5に増やしたビルドしました
解決策Jenkinsはノード事にJob制御が出来るためアップロード専⽤用ノードを作る
ビルドしました ビルドしました ビルドしました ビルドしました アップロードします 解決策ビルド数4 ビルド数1Node-‐A Node-‐B
リリースできなくて死ぬ
リリースできなくて死ぬ継続的デリバリーでは細かい単位でユーザに対してリリースする手動デプロイ サーバ 自動デプロイ ユーザ1⽇日1回~∼1⽇日何回も
リリースできなくて死ぬスマホアプリは、直接配信ではなく、プラットフォームに対して配信する手動デプロイ 自動デプロイ ユーザ
リリースできなくて死ぬ新バージョン出来た リリース作業 ユーザ
リリースできなくて死ぬ新バージョン出来た リリース作業 ユーザ公開: 最⼤大24時間公開: 最⼤大24時間
リリースできなくて死ぬ新バージョン出来た リリース作業 ユーザ公開: 最⼤大24時間審査: ⼀一週間程度度公開: 最⼤大24時間
そもそも不不可能… (´́・_̲・`̀)
⽬目的を考えるそもそも継続的デリバリーの何がいいの?
⽬目的を考えるそもそも継続的デリバリーの何がいいの?リリースユーザ
⽬目的を考えるそもそも継続的デリバリーの何がいいの?リリースユーザユーザの反応を⾒見見て直す
⽬目的を考えるそもそも継続的デリバリーの何がいいの?リリースユーザユーザの反応を⾒見見て直すユーザの反応を、素早く得ることで、作りすぎ等を避け、より早くユーザにとっていいものを作れる
実際のユーザは無理理でも、フィードバックをくれる⼈人なら意味がある解決策手動デプロイ 自動デプロイ
実際のユーザは無理理でも、フィードバックをくれる⼈人なら意味がある解決策手動デプロイ 自動デプロイ 企画職や別部署の⼈人
ビルドが⻑⾧長すぎて死ぬ
ビルドが⻑⾧長すぎて死ぬテストは5分-‐‑‒10分、10分超えると⻑⾧長い(Rails本体ぐらい巨⼤大だと15-‐‑‒20分前後)実行指示 コミットフック 定期実行 デプロイ テストサーバ
ビルドが⻑⾧長すぎて死ぬビルドに最低30分かかってた
ビルドが⻑⾧長すぎて死ぬビルドに最低30分かかってたタイミングが悪いと…×××をビルドして!!!!コミットビルドと定期ビルドを実⾏行行中ですので、1時間後に開始予定です
つらい… (´́・_̲・`̀)
⽬目的を考えるそもそも何故詰まるほどビルドするのか?定期的にデリバリーするため&動かなくなった時に、素早く検知するため。バグの早期発⾒見見で開発の効率率率を上げる為→やっぱり待ち時間が⻑⾧長いのはまずいよね
解決策待ち時間を早くするには・ビルド時間を減らす・並⾏行行処理理をする
解決策待ち時間を早くするには・ビルド時間を減らす・並⾏行行処理理をするコードで頑張るには⼿手間がかかる
解決策待ち時間を早くするには・ビルド時間を減らす・並⾏行行処理理をするコードで頑張るには⼿手間がかかる複数台ビルドで 待ち時間短縮
解決策待ち時間を早くするには・ビルド時間を減らす・並⾏行行処理理をするコードで頑張るには⼿手間がかかる⾦金金で解決! 複数台ビルドで 待ち時間短縮
解決策待ち時間を早くするには・ビルド時間を減らす・並⾏行行処理理をするコードで頑張るには⼿手間がかかる⾦金金で解決! 複数台ビルドで 待ち時間短縮 分散ビルド、静的リンク等も模索中… Xcodeは分散できないけど
まとめこの⼿手法いいよ!っていうのを考えなしに持ってくるのと失敗するなんのためにやってるのか、⽬目的を考え、⼀一番あった⼿手法にきちんと落落とし込むべき導⼊入は⼤大変だけど、効果はかなり⾼高い気がする