Slide 1

Slide 1 text

How to utilize GKE for QA environment @masudak GCPUG Tokyo June 2018

Slide 2

Slide 2 text

About me ● @masudak ますだっくと呼ばれてます ● 2016年4月入社 ● SET(Software Engineer in Test) ● 最近感動したもの: ルンバ(自動化素晴らし い)

Slide 3

Slide 3 text

SET (Software Engineer in Test)

Slide 4

Slide 4 text

About SET ● 2011年にGoogleが設立 ● 「開発生産性とプロダクト品質の向上」がテー マ ● SDET, SWETなど色々な名称ある ● メルカリSETは2016年10月設立 ● 2017年春に出るUKアプリがトリガー ● 当時作ったもの ○ ローカル開発環境 ○ QA環境 ○ UIテスト自動化

Slide 5

Slide 5 text

開発フロー

Slide 6

Slide 6 text

開発フロー ● PMが仕様をJIRAでFIX ● エンジニア・デザイナーが「ローカル開発環 境」で実装 ● PRを他のメンバーにレビューしてもらう ● LGTM ● 「QA環境」でQAエンジニアがマニュアルQA ● PMがリリース承認 ● エンジニアがリリース

Slide 7

Slide 7 text

QA環境

Slide 8

Slide 8 text

QA環境 ● QAエンジニアやエンジニアがQAするところ ● 共通のDBや検索データを持つ ● API, Frontend, Admin, Webなどが動く ● 他の人に影響を受けない独立した環境 ● 独立したエンドポイント ● トピックをデプロイ

Slide 9

Slide 9 text

QA環境要件 ● 自分専用の環境 ● 共通のWebUIからデプロイ ● スケールしやすい ● 可能な限り本番の構成を反映

Slide 10

Slide 10 text

2017年春

Slide 11

Slide 11 text

2017年春 ● USアプリの刷新をすることに ● PHP -> Go ● Monolithic -> Microservices ● Kubernetes on GCP ● 「いい感じ」でアプリをデプロイしたい

Slide 12

Slide 12 text

2017年前半 ● CircleCIのビルド中にデプロイ ● 新しい環境が自動的に ● HTTPヘッダを見て、プロキシ

Slide 13

Slide 13 text

CircleCI ● テストだけでなくreviewdogとかカバレッジと か ● gcloud SDKやDockerのインストール ● 古いpods削除 ● マニフェストファイルのテンプレートを書き換 え $ kubectl get pods --no-headers --selector='app=XXXX-api' | cut -f1 -d' ' | xargs kubectl delete pod そのあと $ make setup-branch-k8s

Slide 14

Slide 14 text

書き換え setup-branch-k8s: $(eval PR_NUMBER := $(shell basename ${CIRCLE_PULL_REQUEST})) sed -ie "s/{{ PR_NUMBER }}/$(PR_NUMBER)/gi" ./tools/kubernetes/XXX-branch.tmpl.yml sed -ie "s/{{ BUILD_NUMBER }}/$(CIRCLE_BUILD_NUM)/gi" ./tools/kubernetes/XXX-branch.tmpl.yml /google-cloud-sdk/bin/kubectl apply -f ./tools/kubernetes/

Slide 15

Slide 15 text

Go reverse proxy director := func(req *http.Request) { xPrNumber := req.Header.Get("X-FOOBAR-PR") apisPort := 4000 req.URL.Scheme = "http" if xPrNumber != "" { req.URL.Host = fmt.Sprintf("foobar-api-%s:%d", xPrNumber, apisPort) } else { req.URL.Host = fmt.Sprintf("foobar-api:%d", apisPort) }

Slide 16

Slide 16 text

2017年後半

Slide 17

Slide 17 text

Spinnaker ● CircleCIからはGCRにイメージをプッシュするだけ ● それをトリガーにSpinnakerからデプロイ ● オレオレyamlテンプレートがなくなる ● とは言え、まだWebUI中心 ● PR podsに対応できてない

Slide 18

Slide 18 text

2017年後半 ● reconciliation loop ○ In Kubernetes, a controller is a control loop that watches the shared state of the cluster through the apiserver and makes changes attempting to move the current state towards the desired state. deeeet氏: PRのstateをdesired stateとしよう!

Slide 19

Slide 19 text

K8s Controller for PR ● ループしながら、PRの状況をチェック ● Openだったら、既存のRSを複製 ● 環境変数などを書き換え ● desired stateを変更 ● k8sがそのdesiredに近づけていく ● PR用のRS完成 ● 必要に応じて、external-dnsでドメイン付与 もしかしたら、kustomizeに置き換わる運命???

Slide 20

Slide 20 text

終わりに ● 開発生産性も品質もまだまだ追求できる ● 開発環境だから、QA環境だからで終わらせない ● 開発速度を上げるのはすごく大事 ● たった一つのVMの時代から2年でここまで来た ● parityなどを考えるとまだまだ課題は多い ● 是非情報交換していきましょう

Slide 21

Slide 21 text

We are hiring!! ● ソフトウェアエンジニア(SET: Software Engineer in Test) ● ソフトウェアエンジニア(SET iOS: Software Engineer in Test iOS)

Slide 22

Slide 22 text

ご清聴 ありがとうございました