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

様々な環境へコマンドラインツールを提供する上での苦労とその対策 / YAPC::Kyoto 2023

Konboi
March 19, 2023

様々な環境へコマンドラインツールを提供する上での苦労とその対策 / YAPC::Kyoto 2023

Konboi

March 19, 2023
Tweet

More Decks by Konboi

Other Decks in Technology

Transcript

  1. 様々な環境へコマンドラインツールを提
    供する上での苦労とその対策
    YAPC::Kyoto 2023
    2023.03.19
    Presented by Ryosuke Yabuki a.k.a Konboi

    View full-size slide

  2. 自己紹介
    ▶ 矢吹 遼介 (Ryosuke Yabuki)
    ▶ Senior Software Engineer (Launchable, Inc.)
    ▶ 福島県在住
    ▶ SNS
    ▶ ブログ: https://blog.konboi.com
    ▶ Github: Konboi
    ▶ Twitter: Konboi 2
    2

    View full-size slide

  3. 今日話す内容
    ▶ Launchableについて
    ▶ launchableinc/cli (launchable command)
    ▶ 苦労とその対策
    ▶ まとめ
    ▶ 今後
    3
    3

    View full-size slide

  4. Launchableについて
    4

    View full-size slide

  5. Launchableについて
    ▶ テスト結果および傾向の可視化/分析
    ▶ Test Suite Insights
    ▶ テスト実行の効率化
    ▶ Predictive Test Selection (a.k.a PTS)
    ▶ ※ここでの”テスト”はUnitTestやE2E Testなどの自動テストを指します
    5
    5

    View full-size slide

  6. Launchableについて
    ▶ テスト結果&傾向の可視化/分析 / Test Suite Insights
    6
    6

    View full-size slide

  7. Launchableについて
    ▶ テスト実行の効率化 / Predictive Test Selection (a.k.a PTS)
    7
    7

    View full-size slide

  8. Launchableについて
    ▶ ユーザーはサービスを利用するために
    8
    8

    View full-size slide

  9. Launchableについて
    ▶ ユーザーはサービスを利用するために
    ▶ テスト結果のレポート
    ▶ Test Suite Insight, PTS
    9
    9

    View full-size slide

  10. Launchableについて
    ▶ ユーザーはサービスを利用するために
    ▶ テスト結果のレポート
    ▶ Test Suite Insight, PTS
    ▶ テスト対象を送る/テストすべきリストを受け取る
    ▶ PTS
    10
    10
    46 test files
    36 test files

    View full-size slide

  11. Launchableについて
    ▶ ユーザーはサービスを利用するために
    ▶ テスト結果のレポート
    ▶ Test Suite Insight, PTS
    ▶ テスト対象を送る/テストすべきリストを受け取る
    ▶ PTS
    ▶ Launchable側はマッピングする必要がある
    11
    11

    View full-size slide

  12. launchableinc/cli
    12

    View full-size slide

  13. launchableinc/cli
    ▶ Python製
    ▶ $ pip install launchable
    ▶ 17のテストランナー(TR)/テストフレームワーク(TF)をサポート
    ▶ Linux/Windows/Mac
    ▶ Python 3.5 ~3.10 をサポート
    ▶ テスト結果を送る / テスト対象をやりとりする
    ▶ CI環境で利用されることを想定
    13
    13

    View full-size slide

  14. launchableinc/cli
    ▶ テスト結果のレポート / launchable record tests
    14
    14

    View full-size slide

  15. launchableinc/cli
    ▶ テスト対象の選定 / launchable subset
    15
    15
    46 test files
    36 test files

    View full-size slide

  16. launchableコマンドの
    苦労とその対策
    16

    View full-size slide

  17. 苦労: 複数TR/TFのサポート
    18

    View full-size slide

  18. 複数TR/TFのサポート
    ▶ TR/TFによって
    ▶ レポートの出力内容 /フォーマットが異なる
    ▶ 実行可能な単位が異なる
    ▶ test case, class, file, etc
    ▶ テスト対象を取得できるもの /できないものがある
    ▶ 結果: 17のテストランナー(TR)/テストフレームワーク(TF)をサポート
    19
    19

    View full-size slide

  19. 複数TR/TFのサポート
    ▶ Perlの場合
    ▶ Test Anything Protocol (TAP)
    ▶ テスト実行時間はSpecには含まれず
    ▶ 実行時間はテストの分析やテストを効率よく実行する上では欠かせないデータ
    ▶ TAP::Formatter::JUnitのレポートに実行時間は含まれないが
    TAP::Harness::JUnitのレポートには含まれる
    20
    20

    View full-size slide

  20. 複数TR/TFのサポート
    ▶ TAP::Harness::JUnit のデフォルトのレポートフォーマット
    ▶ t/00_compile.t → t_00_compile_t
    ▶ t/00/compile.t, t_00/compile.t
    ▶ “t/00_compile.t” で受け取りたい
    ▶ prove
    ▶ ファイル名/ディレクトリ単位で個別実行が可能だがテスト対象を返す機能はない
    ▶ launchable command が指定されたディレクトリからテストファイルを取得 21
    21

    View full-size slide

  21. 複数TR/TFのサポート
    ▶ Goの場合
    ▶ 標準のコマンドでテスト一覧が取得可能
    ▶ go test -list="Test|Example" ./…
    ▶ 標準でのテストレポートは
    ▶ カバレッジレポートは標準でサポート
    ▶ Launchableでは jstemmer/go-junit-report を利用
    22
    22

    View full-size slide

  22. 複数TR/TFのサポート
    ▶ Goの場合
    ▶ -run optionに対応したフォーマットでテスト対象を出力する必要が
    ▶ go test -run “^TestExampl1$|^TestExample2$|^ExampleGreeting$”
    23
    23

    View full-size slide

  23. (再掲)複数TR/TFのサポート
    ▶ TR/TFによって
    ▶ レポートの出力内容 /フォーマットが異なる
    ▶ 実行可能な単位が異なる
    ▶ test case, class, file, etc
    ▶ テスト対象を取得できるもの /できないものがある
    ▶ 結果: 17のテストランナー(TR)/テストフレームワーク(TF)をサポート
    24
    24

    View full-size slide

  24. 複数TR/TFのサポート
    ▶ 利用者の多いTR/TFはLaunchableが公式でサポート
    ▶ 全てのTR/TFをサポートするは難しい
    ▶ TR/TFの中には使用している Pluginによってレポートのフォーマットが変わるものも
    ▶ 他にも
    25
    25

    View full-size slide

  25. 社内TR/TF
    26

    View full-size slide

  26. 複数TR/TFのサポート
    ▶ 社内TR/TF
    ▶ スクラッチ
    ▶ OSSをforkして独自に機能を追加している
    ▶ etc
    ▶ 仕様を聞いてサポートすることもあるが...
    ▶ 社内TR/TFサポート用のコードを
    メインストリームに入れるのは難しい
    27
    27

    View full-size slide

  27. 苦労: 複数環境のサポート
    28

    View full-size slide

  28. (再掲)launchableinc/cli
    ▶ Python製
    ▶ $ pip install launchable
    ▶ 17のテストランナー(TR)/テストフレームワーク(TF)をサポート
    ▶ Linux/Windows/Mac
    ▶ Python 3.5 ~3.10 をサポート
    ▶ テストの結果を送る / テスト対象をやりとりする
    ▶ CI環境で多く利用されることを想定
    29
    29

    View full-size slide

  29. 複数環境のサポート
    ▶ OS
    ▶ Linux/Window/Mac
    ▶ e.g) pathの扱い
    ▶ Linux/Mac: foo/bar/hoge.txt
    ▶ Windows: foo\bar\hoge.txt
    30
    30

    View full-size slide

  30. Cygwin対応
    ▶ 稀にCygwin(ローカルの開発)環境で動かない問い合わせ
    ▶ 担当チケットをCTOにアサインするとシュッと解決

    31
    31

    View full-size slide

  31. 複数環境のサポート
    ▶ Python3.5~3.10
    ▶ EOL
    ▶ Python 3.5: 2020/09/13
    ▶ Python 3.6: 2021/12/23
    ▶ Python 3.7: 2023/06/27
    ▶ なぜ古いバージョンを切らないのか?
    32
    32

    View full-size slide

  32. 複数環境のサポート
    ▶ 開発者向けツールの宿命
    ▶ e.g)
    ▶ 我々のユーザーのユーザーが 3.5をサポートして欲しい
    ▶ 我々のユーザーはユーザーのために 3.5をサポート
    ▶ 我々はユーザーのために 3.5をサポート
    ▶ CTO曰く
    ▶ 我々はマラソンで一番後ろを走る人の伴走者 33
    33

    View full-size slide

  33. 複数環境のサポート
    ▶ OS × Python バージョンの組み合わせでサポートが必要
    ▶ 古いバージョンをサポートするために新しい機能を使えないことも ...
    ▶ 更にCI環境による違いも
    ▶ GitHub Actions, CircleCI, GitLab CI/CD, Jenkins
    ▶ ビルド番号やビルドURLを取得するための環境変数の違いなど
    34
    34

    View full-size slide

  34. 閑話休題: なぜPythonなのか
    35

    View full-size slide

  35. なぜPythonなのか
    ▶ 最初に担当したエンジニアが最も得意だったのがPython
    ▶ Perlも選択肢にあったが Windows対応を考えるとPythonに軍配
    ▶ Go/Rustならよかったのか?
    ▶ 配布方法/アップデートの仕組みを考える必要がある
    ▶ plugin 機構をどう提供するのか悩ましい
    36
    36

    View full-size slide

  36. 苦労: エラーハンドリング
    37

    View full-size slide

  37. エラーハンドリング
    ▶ CIに組み込む都合上サービス側(Launchable)の都合で止めてはいけない
    ▶ テストはPASSしているのにLaunchableへのリクエストがエラーで FAILに...はNG
    ▶ Launchableがシステム障害で落ちていても動作させる必要があります
    ▶ エラーにすべきものもある
    ▶ 設定ミス
    ▶ 不正なパラメーターの組み合わせ
    ▶ etc 38
    38

    View full-size slide

  38. 苦労
    ▶ 複数TR/TFのサポート
    ▶ 複数環境へのサポート
    ▶ エラーハンドリング
    39
    39

    View full-size slide

  39. 対策
    ▶ plugin 機構
    ▶ raw profile
    ▶ テスト & ドッグフーディング
    ▶ エラーメッセージ
    41
    41

    View full-size slide

  40. plugin 機構
    ▶ plugin機構をサポート
    ▶ plugin ファイル (Pythonファイル)を任意のディレクトリに設置
    ▶ 実行時にディレクトリを指定
    ▶ launchable –plugin plugin-dr/
    ▶ 社内TR/TFなどに対応
    ▶ plugin作成方法のドキュメントは不十分
    ▶ Launchable Advent Calendar 23日目 - custom plugin
    42
    42

    View full-size slide

  41. raw profile
    ▶ 個別にpluginを提供するのはコストが高い
    ▶ 入出力フォーマットを定義しユーザー側で対応してもらう
    ▶ サポートコストは減る
    ▶ 複雑なフォーマットではないがユーザー側の対応コストが増える
    ▶ plugin 機構/ raw profile よりも良いアイディアがあれば採用したい
    43
    43

    View full-size slide

  42. テスト & ドッグフーディング
    ▶ 実装中に気を付ける には限界がある
    ▶ Matrix test
    ▶ Windows/Linux
    ▶ Python version 3.5 ~ 3.10
    ▶ E2Eテスト
    ▶ launchable コマンドのリリース前に複数の主要プロファイルでベースシナリオを実行
    ▶ 定期実行を行いAPI側が互換性を崩してないかもチェック
    44
    44

    View full-size slide

  43. テスト & ドッグフーディング
    ▶ Launchableの開発環境では最新版(main branch)を使用
    ▶ API側の開発ブランチがmainにマージされる度に開発環境へE2Eを実施
    ▶ launchable commandの大きい機能をリリースする際はマージ後
    開発環境で数日様子をみてからリリースすることも
    ▶ ミスを100%防ぐことは不可能なので早く気付ける仕組みを厚くしている
    45
    45

    View full-size slide

  44. エラーメッセージ
    ▶ エラーメッセージを分かりやすく
    ▶ なぜエラーになっているのか
    ▶ どうやったら解決するのか
    ▶ ユーザー側で解決できるのが理想
    ▶ 地味。だが効果大
    46
    46

    View full-size slide

  45. まとめ
    ▶ 様々な環境へ提供する上での苦労について紹介
    ▶ TR/TFの差、OSの差、エラーハンドリング
    ▶ 残念ながら解決方法に銀の弾丸は無い
    ▶ 問い合わせや起こしてしまったエラーに対して一つ一つ対策していく
    ▶ 抽象度のレベルをあげて解決できるように気をつけている
    47
    47

    View full-size slide

  46. 今後
    ▶ 中期的
    ▶ EOLバージョンのサポートコストと plugin機構の提供方法を踏まえて脱 Python
    ▶ 長期的(野望)
    ▶ テストレポートフォーマットの標準化
    ▶ 各テストランナーへの機能提案
    48
    48

    View full-size slide

  47. Thank you!
    49

    View full-size slide

  48. 51
    We’re hiring

    View full-size slide

  49. Thank you!
    52

    View full-size slide