Slide 1

Slide 1 text

Yoshiki Nagasaki (champon)
 Summer Internship 2021
 Results Presentation


Slide 2

Slide 2 text

@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!

Slide 3

Slide 3 text

やったこと


Slide 4

Slide 4 text

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


Slide 5

Slide 5 text

batchのsubcommand化


Slide 6

Slide 6 text

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


Slide 7

Slide 7 text

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


Slide 8

Slide 8 text

batchのsubcommand化
 主に共通化できるコード
 ● serviceやclientの初期化
 ○ cmd/batch/main.goにて共通化
 
 ● 環境変数
 ○ configに新たな環境変数として登録


Slide 9

Slide 9 text

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)


Slide 10

Slide 10 text

batchのsubcommand化
 学び
 ● メルペイ(defpay)でのリリースフローを体験できた 
 ○ cronjobの更新
 ○ spinnakerを使ったリリース 
 
 ● Goの使用に関して新たに学ぶことができた 
 ○ path.Joinとfilepath.Join 
 ■ WindowsではURLは”\”が必要なのでfilepath.Joinで はなくpath.Join
 ○ io.NopCloser
 ■ io.Readerを引数に取ることでio.ReaderCloserを返し てくれる
 Engineer Go

Slide 11

Slide 11 text

Outbox Patternの実装とテスト


Slide 12

Slide 12 text

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


Slide 13

Slide 13 text

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


Slide 14

Slide 14 text

Outbox Patternとは
 publishworkerの概要図
 Task Pub/Sub Spanner publishworker Retry until succeed 
 (check if error is retriable) 
 Poll
 INSERT
 Send Task


Slide 15

Slide 15 text

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)

Slide 16

Slide 16 text

Outbox Patternの実装とテスト
 難しかったところ・工夫点
 ● gRPCのInterceptorを咬ますとDB Setupの時に”READY”状態で止まる 
 ○ Spanner Clientを2つ用意してDB名を共有 
 
 ● CIがたまにDatabase not foundエラーを吐く 
 ○ 全テストでインスタンスは共通 
 ○ TestMainでインスタンス内の全DBを消去している 
 ○ ➡ 必要無くなったデータベースをインメモリで保持 


Slide 17

Slide 17 text

Outbox Patternの実装とテスト
 学び
 ● コードを読む力が付いた 
 ○ ライブラリやdefpayのコードを見ながら試行錯誤した 
 
 ● spanner emulatorを触った 
 ○ 存在自体も初めて知った 
 
 ● for文の中でdeferしない 
 ○ forから抜けるまでdeferが積まれていく 
 Spanner Engineer Go

Slide 18

Slide 18 text

Launchableからsubsetを取得するworkflow作 成


Slide 19

Slide 19 text

Launchableとは
 背景
 ● Mercari / Merpayではシナリオテストにより実際にテスト環境にデプロイし た状態でAPIテストを行っている 
 ● 全テストを実行すると時間がかかるのでPRのdiffに影響のあるテストのみ を実行したい
 Launchableを使う!
 
 ✓ 機械学習によりdiffに対応するテストファイルを学習 
 ✓ CLIベースで接続できるのでGitHub Actionsと連携可能 
 🚀

Slide 20

Slide 20 text

Launchable使用の流れ
 Defapy Repo Scenario Test Repo 🚀 Launchable
 Run Test XML Diff
 All Tests
 Test Subset
 Test Report
 ①
 ②
 ③


Slide 21

Slide 21 text

Launchableのworkflow作成
 現状
 ● とりあえずLaunchableにデータを送りまくってる状態 
 ● シナリオテストは定期実行されている 
 今回やりたいこと
 subsetを取得してPRにコメントとして残す 
 
 ● ちゃんと学習できているか確認
 ● QAにおいてどのようなテストを実行すれば良いかの参考になる 


Slide 22

Slide 22 text

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


Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

Launchableのworkflow作成
 学び
 ● 業務でのGitHub Actionsのworkflow作成を体験できた 
 
 ● 何のために使用するのかを意識して作成する 
 ○ QAの人が見て分かりやすいPRコメントを残す 
 ■ 何のシナリオテストなのか? ➡ Titleを表示 
 ■ 実際のテストはどのような流れなのか? ➡ リンクを表示 
 Engineer CI

Slide 27

Slide 27 text

Thank you for your attention!