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. 2

  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クラウド版で実行されたワークフローより。 ただしサンプルやチュートリアルの実行等は除外している(カウントしていない)。
  3. 4 Agenda Fail Fast とは Shift Left のことである 安心して Fail

    Fast するための2つの自動化アプローチ 上手に早く失敗するには まとめ 1 2 3 4
  4. 8 テストにさっさと失敗する? また これ 僕がテスト するんですか? ちゃんと テストに通るやつ 持ってきてください 今日早く

    帰りたかったんです けどね… ここって 修正箇所と関係 ないから、 経験から言って テストしなくても きっと大丈夫 人に迷惑をかけてしまうと思うと、おいそれと失敗できない
  5. 9 人にではなく、機械に迷惑をかけるための自動化 プラン コード ビルド テスト リリー ス デプ ロイ

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

    ◦ 遅いテストワースト10 失敗するテストワースト10 ◦ 成功・失敗が不安定なテストはどれか ◦ テスト実行時のCPU/RAM使用推移 テスト インサイト
  7. 13

  8. 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
  9. 17

  10. 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相当)
  11. 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かかる (全成功時と同じ) • テストがすべて通るのであれば、 並列数を上げることにより テスト実行時間が短縮できるが、 • 通らないテストがあるのであれば、 テストに失敗しても 引き続きテストが実行されつづける →時間を使う(=クレジットを消費する)
  12. 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を実行させない (新たに)実行しない
  13. 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以降は 新規に実行しない
  14. 28 テストで上手に早く失敗するには、 ✓ まずはテスト完了までの時間を短く(早く)する ✓ テスト環境に対する適切なマシンスペック(CPU, RAM)の割り当て ✓ Parallelism (並列実行)

    の活用 - 適切な並列数 ✓ 並行実行時にテストを上手に割り振る(過去ログを元に平準化など) ✓ テストセットの実行途中で失敗した際に、適切に処理を打ち切る ✓ Fail-fast 機能の活用