$30 off During Our Annual Pro Sale. View Details »

How to utilize GKE for QA environment

How to utilize GKE for QA environment

Kenichi Masuda

June 18, 2018
Tweet

More Decks by Kenichi Masuda

Other Decks in Technology

Transcript

  1. How to utilize GKE for QA environment @masudak GCPUG Tokyo

    June 2018
  2. About me • @masudak ますだっくと呼ばれてます • 2016年4月入社 • SET(Software Engineer

    in Test) • 最近感動したもの: ルンバ(自動化素晴らし い)
  3. SET (Software Engineer in Test)

  4. About SET • 2011年にGoogleが設立 • 「開発生産性とプロダクト品質の向上」がテー マ • SDET, SWETなど色々な名称ある

    • メルカリSETは2016年10月設立 • 2017年春に出るUKアプリがトリガー • 当時作ったもの ◦ ローカル開発環境 ◦ QA環境 ◦ UIテスト自動化
  5. 開発フロー

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

    • 「QA環境」でQAエンジニアがマニュアルQA • PMがリリース承認 • エンジニアがリリース
  7. QA環境

  8. QA環境 • QAエンジニアやエンジニアがQAするところ • 共通のDBや検索データを持つ • API, Frontend, Admin, Webなどが動く

    • 他の人に影響を受けない独立した環境 • 独立したエンドポイント • トピックをデプロイ
  9. QA環境要件 • 自分専用の環境 • 共通のWebUIからデプロイ • スケールしやすい • 可能な限り本番の構成を反映

  10. 2017年春

  11. 2017年春 • USアプリの刷新をすることに • PHP -> Go • Monolithic ->

    Microservices • Kubernetes on GCP • 「いい感じ」でアプリをデプロイしたい
  12. 2017年前半 • CircleCIのビルド中にデプロイ • 新しい環境が自動的に • HTTPヘッダを見て、プロキシ

  13. 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
  14. 書き換え 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/
  15. 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) }
  16. 2017年後半

  17. Spinnaker • CircleCIからはGCRにイメージをプッシュするだけ • それをトリガーにSpinnakerからデプロイ • オレオレyamlテンプレートがなくなる • とは言え、まだWebUI中心 •

    PR podsに対応できてない
  18. 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としよう!
  19. K8s Controller for PR • ループしながら、PRの状況をチェック • Openだったら、既存のRSを複製 • 環境変数などを書き換え

    • desired stateを変更 • k8sがそのdesiredに近づけていく • PR用のRS完成 • 必要に応じて、external-dnsでドメイン付与 もしかしたら、kustomizeに置き換わる運命???
  20. 終わりに • 開発生産性も品質もまだまだ追求できる • 開発環境だから、QA環境だからで終わらせない • 開発速度を上げるのはすごく大事 • たった一つのVMの時代から2年でここまで来た •

    parityなどを考えるとまだまだ課題は多い • 是非情報交換していきましょう
  21. We are hiring!! • ソフトウェアエンジニア(SET: Software Engineer in Test) •

    ソフトウェアエンジニア(SET iOS: Software Engineer in Test iOS)
  22. ご清聴 ありがとうございました