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

Fail Fast, Succeed Faster ~ DevOps で上手に早く失敗する

Fail Fast, Succeed Faster ~ DevOps で上手に早く失敗する

2023/04/18 開催の DevOpsDays Tokyo でお話しさせていただいた際のスライドです。
https://confengine.com/conferences/devopsdays-tokyo-2023/schedule/rich#session-30888-info

ソフトウェア開発におけるテストの重要性やテストの自動化の重要性については様々なところで語られてきていますが、すでに取り組みが進んでいるケースもあれば、「大事なのは分かっているけど取り掛かれていない」という現場も少なくないのではないでしょうか? 分かっていても取り掛かれないのはなぜなのでしょう?

テストの自動化で得られるメリットに省力化や効率化、品質担保が含まれるのはもちろんですが、それだけにとどまらず、そこで実現したいのが「速く失敗することで、速く成功できる」からこそ、ソフトウェアを通じて、開発者や利用者それぞれの「サクセス」をどうお届けするのか、結果としてビジネスにどうインパクトを残せるのかをお伝えします。

More Decks by Masahiko Funaki(舟木 将彦)

Other Decks in Programming

Transcript

  1. 1
    Fail Fast, Succeed Faster
    ~ DevOps で上手に早く失敗する
    Masahiko Funaki (@mfunaki)
    Principal Developer Advocate, CircleCI

    View full-size slide

  2. 3
    会社紹介に代えて(ワークフロー実行回数順位)
    グローバル
    1 米国
    2 英国
    3 日本
    4 ドイツ
    5 カナダ
    6 オーストラリア
    7 フランス
    8 スウェーデン
    9 ブラジル
    10 イスラエル
    アジア・太平洋地域
    1 日本
    2 オーストラリア
    3 シンガポール
    4 香港
    5 ニュージーランド
    6 インド
    7 韓国
    8 マレーシア
    9 タイ
    10 インドネシア
    2010/10~2011/09までの12か月にCircleCIクラウド版で実行されたワークフローより。
    ただしサンプルやチュートリアルの実行等は除外している(カウントしていない)。

    View full-size slide

  3. 4
    Agenda
    Fail Fast とは Shift Left のことである
    安心して Fail Fast するための2つの自動化アプローチ
    上手に早く失敗するには
    まとめ
    1
    2
    3
    4

    View full-size slide

  4. 5
    Fail Fast とは
    Shift Left のことである

    View full-size slide

  5. 6
    マシュマロ・チャレンジ!
    出典: トム・ウージェック:塔を建て、チームを作る https://youtu.be/H0_yKBitO8M

    View full-size slide

  6. 7
    早くから常にマシュマロを乗せるようにする(シフトレフト)
    出典: トム・ウージェック:塔を建て、チームを作る https://youtu.be/H0_yKBitO8M

    View full-size slide

  7. 8
    テストにさっさと失敗する?
    また
    これ
    僕がテスト
    するんですか?
    ちゃんと
    テストに通るやつ
    持ってきてください
    今日早く
    帰りたかったんです
    けどね…
    ここって
    修正箇所と関係
    ないから、
    経験から言って
    テストしなくても
    きっと大丈夫
    人に迷惑をかけてしまうと思うと、おいそれと失敗できない

    View full-size slide

  8. 9
    人にではなく、機械に迷惑をかけるための自動化
    プラン コード ビルド テスト
    リリー

    デプ
    ロイ
    運用 監視
    継続的インテグレーション(CI)
    継続的
    デプロイ
    (CD)
    自動化できない
    非正常系は
    自動化できない
    自動化できる
    コード追加・修正時は
    常にビルド・テスト
    (最後にまとめてやら
    ない→早く失敗すれば
    早く品質が安定する)
    サービス停止せず常に
    リリース/デプロイ
    (失敗時にはクイック
    に修正 / 前バージョ
    ンに戻せる)しくみ
    共有
    リポジトリ
    上で
    常に作業
    運用・監視しやすい
    品質をコードに反映
    (必要なデータの取得、
    スケーラビリティの
    確保)
    + メトリクスを自動取得するための自動化

    View full-size slide

  9. 10
    評価ポイント1: スループット
    評価ポイント3: 復旧時間
    評価ポイント2: 実行時間
    評価ポイント4: 成功率
    メトリクスを自動取得するための自動化

    View full-size slide

  10. 11
    ● ワークフローのメトリクスをインテリジェ
    ントに収集・可視化
    ○ ワークフローやジョブ別の内訳
    ○ どのプロジェクト、ワークフロー、ジ
    ョブが失敗し、最もクレジットを消費
    しているのか
    ○ 遅いテストワースト10
    失敗するテストワースト10
    ○ 成功・失敗が不安定なテストはどれか
    ○ テスト実行時のCPU/RAM使用推移
    テスト インサイト

    View full-size slide

  11. 12
    安心して Fail Fast するための
    2つの自動化アプローチ

    View full-size slide

  12. 14
    縦に伸ばす(マシンスペックを上げる)
    ● iOS アプリケーションのビルド+テストの一例
    クラス vCPU RAM 実行時間
    medium [email protected] 8GB 6:48
    macos.x86.medium.gen2 [email protected] 8GB 4:33
    large [email protected] 16GB 4:33
    macos.m1.large.gen1 [email protected] 12GB 2:45
    クレジット
    350
    375
    500
    1200
    金額
    ¢21
    ¢22.5
    ¢30
    ¢72
    利用可能なリソースクラス: https://circleci.com/ja/product/features/resource-classes/
    CircleCI で macOS (x64, M1) を使って iOS アプリをテスト: https://youtu.be/YOD2OXs5_RY

    View full-size slide

  13. 15
    リソースは「大は小を兼ね」なくてもよい

    View full-size slide

  14. 16
    縦に伸ばす(マシンスペックを上げる)方法
    参考: https://circleci.com/ja/blog/deep-learning-nvidia-gpu-executor/

    View full-size slide

  15. 18
    横に広げる (並列実行数を増やす)
    1
    5
    50 5 45 40 100 60
    1
    0
    30 20
    100
    1
    5
    50
    60
    20
    1
    0
    45
    40
    30
    5
    100
    50
    1
    0
    45
    1
    5
    60
    20 5
    40 30
    1並列
    3並列
    5並列 1’44”
    1’14”
    1’09”
    1’14”
    1’15”
    6:20
    70クレジット
    (¢4.2相当)
    2’09”
    2’09”
    2’09”
    90クレジット
    (¢5.4相当)
    100クレジット
    (¢6.0相当)

    View full-size slide

  16. 19
    メトリクスの自動取得+インサイト

    View full-size slide

  17. 20
    縦に伸ばす(マシンスペックを上げる)方法
    並列
    実行数
    並列実行時の割り振り方
    • ファイル名のアルファベット順
    • 過去のテスト実行時の所要時間
    ベースで均等割(timings)
    • ファイルサイズで均等割
    (filesize)
    • マニュアル指定

    View full-size slide

  18. 21
    上手に早く失敗するには?

    View full-size slide

  19. 22
    テストに Fail したときにどうなるのか?
    ● 1並列でのテスト実行時
    ● 3並列でのテスト実行時
    1
    5
    50 5 45 40 100 60
    1
    0
    30 20
    1並列
    ここで
    失敗すると
    これ以降
    実行されない
    100
    1
    5
    50
    60
    20
    1
    0
    45
    40
    30
    5
    3並列
    ここで
    失敗すると
    これ以降
    実行されない
    この2並列は
    最後まで実行されるので、
    テスト完了まで
    2:09かかる
    (全成功時と同じ)
    • テストがすべて通るのであれば、
    並列数を上げることにより
    テスト実行時間が短縮できるが、
    • 通らないテストがあるのであれば、
    テストに失敗しても
    引き続きテストが実行されつづける
    →時間を使う(=クレジットを消費する)

    View full-size slide

  20. 23
    Fail Fast: テストをバッチ分割して実行
    テストが no01_test.py ~ no20_test.py までの20ファイルあり、
    no11_test.py が失敗(他は成功)する場合、
    ● 例えば、batch-count=3であれば、テストを3グループに分け、
    Batch 1から順に実行する
    (ファイル名のアルファベット順に分割した際の実行例。マニュアルでの指定など他の指定方法も可能。)
    コンテナ1
    Batch 1 no01, no04, no07, no10, no13, no16, no19
    Batch 2 no02, no05, no08, no11, no14, no17, no20
    Batch 3 no03, no06, no09, no12, no15, no18
    成功
    失敗なのでBatch3を実行させない
    (新たに)実行しない

    View full-size slide

  21. 24
    Fail Fast: テストをバッチ分割して並列実行
    テストが no01_test.py ~ no20_test.py までの20ファイルあり、
    no11_test.py が失敗(他は成功)する場合、
    ● 例えば、parallelism=4, batch-count=3であれば、
    (ファイル名のアルファベット順に分割した際の実行例。マニュアルでの指定など他の指定方法も可能。)
    コンテナ1 コンテナ2 コンテナ3 コンテナ4
    Batch 1 no01, no13 no04, no16 no07, no19 no10, no11
    Batch 2 no02, no14 no05, no17 no08, no20 no12
    Batch 3 no03, no15 no06, no18 no09
    ここで失敗したので、
    Batch 2以降は
    新規に実行しない

    View full-size slide

  22. 25
    Fail Fast: テストをバッチ分割して並列実行する方法
    並列
    実行数
    3バッチに分割し (--batch-count=3)
    テストを実行。
    ただし、テストに失敗したら
    次バッチ以降は
    実行しない (--fail-tast)

    View full-size slide

  23. 26
    Fail Fast 実行例

    View full-size slide

  24. 28
    テストで上手に早く失敗するには、
    ✓ まずはテスト完了までの時間を短く(早く)する
    ✓ テスト環境に対する適切なマシンスペック(CPU, RAM)の割り当て
    ✓ Parallelism (並列実行) の活用 - 適切な並列数
    ✓ 並行実行時にテストを上手に割り振る(過去ログを元に平準化など)
    ✓ テストセットの実行途中で失敗した際に、適切に処理を打ち切る
    ✓ Fail-fast 機能の活用

    View full-size slide

  25. 29
    https://marketplace.visualstudio.com/
    items?itemName=circleci.circleci

    View full-size slide

  26. 30
    ブース出展しております。ぜひお立ち寄りください!
    • Twitter: https://twitter.com/CircleCIJapan
    • YouTube: https://www.youtube.com/@CircleCI-
    Videos/playlists
    • Qiita: https://qiita.com/CircleCIJapan
    • connpass: https://circleci.connpass.com/

    View full-size slide

  27. Thank you.
    31

    View full-size slide