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

Mercari Summer Internship 2021 Final Presentation

Mercari Summer Internship 2021 Final Presentation

2a195253a39691fe82d2f1b9d4dadb36?s=128

Yoshiki Nagasaki

December 01, 2021
Tweet

Transcript

  1. Yoshiki Nagasaki (champon)
 Summer Internship 2021
 Results Presentation


  2. @champon (ちゃんぽん) / Backend Engineer Internship PICTURE Picture which can

    be identified your face is preferable 顔がわかる写真が好ましいです • Full Name : 長崎好輝 (Yoshiki Nagasaki) • GitHub : champon1020 • Twitter : champon1020 • Joining Time : 2021/08/01 • Career : M1 student (summer internship at Merpay) • Hobby : Anime, Comic, Programming • Strong : Go, Computer Vision • Weak : Careless mistakes • Message : Nice to meet you!
  3. やったこと


  4. やったこと
 1. batchのsubcommand化
 2. Outbox Patternの実装とテスト
 3. Launchableからsubsetを取得するworkflow作成


  5. batchのsubcommand化


  6. batchのsubcommand化とは
 batch:
 定期実行されるプログラム
 
 subcommand:
 あるコマンド下でさらに処理を分岐するコマンド 
 (ex. git push,

    git pull)

  7. batchのsubcommand化
 背景
 • defpayのビルド時間を短縮したい
 • batchに共通化できそうな部分がたくさんあった
 処理を共通化してソースコードを減らそう!


  8. batchのsubcommand化
 主に共通化できるコード
 • serviceやclientの初期化
 ◦ cmd/batch/main.goにて共通化
 
 • 環境変数
 ◦

    configに新たな環境変数として登録

  9. batchのsubcommand化
 進捗
 計8個のbatchをsubcommand化した 
 scheduled-repayment-v2 
 scheduled-repayment-result-checker 
 payable-easypay
 debt-sync


    reconcile-easypay-reviews 
 overdue-easypay
 create-easypay-user-contract-record-v2 
 force-michael-sync 
 (Released)
 (In Review)
 (Released)
 (Released)
 (Verified)
 (Verified)
 (Verified)
 (Approved)

  10. batchのsubcommand化
 学び
 • メルペイ(defpay)でのリリースフローを体験できた 
 ◦ cronjobの更新
 ◦ spinnakerを使ったリリース 


    
 • Goの使用に関して新たに学ぶことができた 
 ◦ path.Joinとfilepath.Join 
 ▪ WindowsではURLは”\”が必要なのでfilepath.Joinで はなくpath.Join
 ◦ io.NopCloser
 ▪ io.Readerを引数に取ることでio.ReaderCloserを返し てくれる
 Engineer Go
  11. Outbox Patternの実装とテスト


  12. Outbox Patternとは
 Outbox Pattern:
 マイクロサービス間の通信においてイベントが送信成功するまでリトライを継続して一 貫性を担保
 サービスA
 サービスB
 送信失敗
 例


    一貫性がサービスA内で完結してしまう 

  13. Outbox Patternとは
 Outbox Pattern:
 マイクロサービス間の通信においてイベントが送信成功するまでリトライを継続して一 貫性を担保
 サービスA
 サービスB
 成功するまでリトライ 


    例
 一貫性をマイクロサービス間で担保 

  14. Outbox Patternとは
 publishworkerの概要図
 Task Pub/Sub Spanner publishworker Retry until succeed

    
 (check if error is retriable) 
 Poll
 INSERT
 Send Task

  15. Outbox Patternの実装とテスト
 TestNewWorker:workerの初期化
 • Optionがちゃんと渡されているか確認 
 
 TestWorker_Start:workerをスタートする(taskをpollする状態に遷移する) 
 •

    既にworkerがRunningしている場合は何もしない 
 • taskがあればpublishを開始 
 
 TestWorker_publish :taskをPubSubにpublishする 
 • retriableか否かを判定できているか確認 
 進捗
 計3つの単体テストを実装した
 (Merged) (In Review) (Merged)
  16. Outbox Patternの実装とテスト
 難しかったところ・工夫点
 • gRPCのInterceptorを咬ますとDB Setupの時に”READY”状態で止まる 
 ◦ Spanner Clientを2つ用意してDB名を共有

    
 
 • CIがたまにDatabase not foundエラーを吐く 
 ◦ 全テストでインスタンスは共通 
 ◦ TestMainでインスタンス内の全DBを消去している 
 ◦ ➡ 必要無くなったデータベースをインメモリで保持 

  17. Outbox Patternの実装とテスト
 学び
 • コードを読む力が付いた 
 ◦ ライブラリやdefpayのコードを見ながら試行錯誤した 
 


    • spanner emulatorを触った 
 ◦ 存在自体も初めて知った 
 
 • for文の中でdeferしない 
 ◦ forから抜けるまでdeferが積まれていく 
 Spanner Engineer Go
  18. Launchableからsubsetを取得するworkflow作 成


  19. Launchableとは
 背景
 • Mercari / Merpayではシナリオテストにより実際にテスト環境にデプロイし た状態でAPIテストを行っている 
 • 全テストを実行すると時間がかかるのでPRのdiffに影響のあるテストのみ

    を実行したい
 Launchableを使う!
 
 ✓ 機械学習によりdiffに対応するテストファイルを学習 
 ✓ CLIベースで接続できるのでGitHub Actionsと連携可能 
 🚀
  20. Launchable使用の流れ
 Defapy Repo Scenario Test Repo 🚀 Launchable
 Run Test

    XML Diff
 All Tests
 Test Subset
 Test Report
 ①
 ②
 ③

  21. Launchableのworkflow作成
 現状
 • とりあえずLaunchableにデータを送りまくってる状態 
 • シナリオテストは定期実行されている 
 今回やりたいこと
 subsetを取得してPRにコメントとして残す

    
 
 • ちゃんと学習できているか確認
 • QAにおいてどのようなテストを実行すれば良いかの参考になる 

  22. PRへのコメント
 2回目以降のRunではコメントを 更新する PRへコメント


  23. PRへのコメント
 Subset List
 merpay-scenario-testsの リポジトリへ飛べる

  24. PRへのコメント
 Invalid Subset
 試運用段階なのでfailさせ ずにリストに残してる

  25. workflowの流れ
 defpayとscenario-testのコードを Launchableに登録 Launchableからsubsetを取得 subsetをmarkdownのテーブルに変換 PRにコメント

  26. Launchableのworkflow作成
 学び
 • 業務でのGitHub Actionsのworkflow作成を体験できた 
 
 • 何のために使用するのかを意識して作成する 


    ◦ QAの人が見て分かりやすいPRコメントを残す 
 ▪ 何のシナリオテストなのか? ➡ Titleを表示 
 ▪ 実際のテストはどのような流れなのか? ➡ リンクを表示 
 Engineer CI
  27. Thank you for your attention!