Save 37% off PRO during our Black Friday Sale! »

勤怠管理サービスでの継続的テストの取り組み / continuous testing in attendance service

Bc0167df60f90a38e0ec30895b7ecc6c?s=47 karabish
November 18, 2021

勤怠管理サービスでの継続的テストの取り組み / continuous testing in attendance service

Bc0167df60f90a38e0ec30895b7ecc6c?s=128

karabish

November 18, 2021
Tweet

Transcript

  1. #jjug_ccc 勤怠管理サービスでの継続的テストの取り組み JJUG CCC 2021 Fall 株式会社ラクス Yuya Yamaguchi

  2. #jjug_ccc 2 自己紹介 SIerでAWS, Azure, k8s 株式会社ラクス で楽楽勤怠に所属 バックエンドエンジニア +

    CI周りを担当
  3. 3 https://fortee.jp/jjug-ccc-2021-fall/proposal/8256578c-e568-46a0-9eb5-85ee954f1d0e

  4. #jjug_ccc Agenda 1. なぜ継続的テストを進めているの か 2. CIパイプラインへのテストの組み 込み 3. テストの自動化

    4
  5. #jjug_ccc Agenda 1. なぜ継続的テストを進めているの か 2. CIパイプラインへのテストの組み 込み 3. テストの自動化

    5
  6. #jjug_ccc なぜ継続的テストを進めているのか 6 1. 勤怠管理サービスの特徴 2. QA・SETエンジニアがいない 3. リリースサイクルを短縮したい

  7. #jjug_ccc なぜ継続的テストを進めているのか 7 1. 勤怠管理サービスの特徴 2. QA・SETエンジニアがいない 3. リリースサイクルを短縮したい

  8. #jjug_ccc 勤怠管理サービスの特徴 8

  9. #jjug_ccc なぜ継続的テストを進めているのか 9 1. 勤怠管理サービスの特徴 2. QA・SETエンジニアがいない 3. リリースサイクルを短縮したい

  10. #jjug_ccc QA・SETエンジニアがいない 10 プロダクトマネージャ バックエンドエンジニア フロントエンドエンジニア デザイナー インフラエンジニア QAエンジニア SETエンジニア

  11. #jjug_ccc なぜ継続的テストを進めているのか 11 1. 勤怠管理サービスの特徴 2. QA・SETエンジニアがいない 3. リリースサイクルを短縮したい

  12. #jjug_ccc なぜ継続的テストを進めているのか 12 1. 勤怠管理サービスの特徴 2. QA・SETエンジニアがいない 3. リリースサイクルを短縮したい

  13. #jjug_ccc Agenda 1. なぜ継続的テストを進めているの か 2. CIパイプラインへのテストの組み 込み 3. テストの自動化

    13
  14. #jjug_ccc CIパイプラインの対象範囲 14 • Single Page Application • Vue.js •

    Spring Boot • PostgreSQL Vue.js PostgreSQL
  15. #jjug_ccc CIパイプラインへのテストの組み込みで利用したもの 15

  16. Gitlab-CIとは 16 GitLab CI/CDパイプラインは、統合され た単一のワークフローの一部としてコー ドのビルド、テスト、デプロイ、監視を行 います。 Forrester CI Wave™のリーダーに選出

    されました。 https://www.gitlab.jp/stages-devops-lifecycle/continuous-integration/
  17. #jjug_ccc Gitlab-CIの特徴 17 • マルチプラットフォーム: Unix、Windows、macOS、その他Goをサポートするあらゆるプラットフォームでビルドを実行 できます。 • 安定性: ビルドは

    GitLab とは別のマシンで実行されます。 • 柔軟なパイプライン: ステージごとに複数の並列ジョブを定義し、 他のビルドをトリガー することができます。 • バージョン管理されたパイプライン: .gitlab-ci.yml ファイル にはテストなどのすべてのステップが含まれています。 ブ ランチで .gitlab-ci.yml ファイルを変更することで、誰でも安全にパイプラインの変更を試すことができます。 • Dockerのサポート: カスタムDockerイメージを使用したり、テストの一環として サービス を起動したり、 新しいDocker イメージをビルド したり、Kubernetes上で実行したりすることができます。 • コンテナレジストリ: コンテナイメージを保存、共有、使用するための 組み込みコンテナレジストリ を利用できます。 • 保護変数: 環境ごとに 保護変数 を使用して、デプロイに必要な認証情報などを安全に保存し、使用することができま す。 https://www.gitlab.jp/stages-devops-lifecycle/continuous-integration/
  18. #jjug_ccc Gitlab-CIの特徴 18 • マルチプラットフォーム: Unix、Windows、macOS、その他Goをサポートするあらゆるプラットフォームでビルドを実行 できます。 • 安定性: ビルドは

    GitLab とは別のマシンで実行されます。 • 柔軟なパイプライン: ステージごとに複数の並列ジョブ を定義し、 他のビルドをトリガー することができます。 • バージョン管理されたパイプライン: .gitlab-ci.yml ファイル にはテストなどのすべてのステップが含まれています。 ブ ランチで .gitlab-ci.yml ファイルを変更することで、誰でも安全にパイプラインの変更を試すことができます。 • Dockerのサポート: カスタムDockerイメージを使用したり、テストの一環として サービス を起動したり、 新しいDocker イメージをビルド したり、Kubernetes上で実行したりすることができます。 • コンテナレジストリ: コンテナイメージを保存、共有、使用するための 組み込みコンテナレジストリ を利用できます。 • 保護変数: 環境ごとに 保護変数 を使用して、デプロイに必要な認証情報などを安全に保存し、使用することができま す。 https://www.gitlab.jp/stages-devops-lifecycle/continuous-integration/
  19. #jjug_ccc Gitlab-CIの特徴 19 • マルチプラットフォーム: Unix、Windows、macOS、その他Goをサポートするあらゆるプラットフォームでビルドを実行 できます。 • 安定性: ビルドは

    GitLab とは別のマシンで実行されます。 • 柔軟なパイプライン: ステージごとに複数の並列ジョブを定義し、 他のビルドをトリガー することができます。 • バージョン管理されたパイプライン: .gitlab-ci.yml ファイル にはテストなどのすべてのステップが含まれています。 ブ ランチで .gitlab-ci.yml ファイルを変更することで、誰でも安全にパイプラインの変更を試すことができます。 • Dockerのサポート: カスタムDockerイメージを使用したり、テストの一環として サービス を起動したり、 新しいDocker イメージをビルド したり、Kubernetes上で実行したりすることができます。 • コンテナレジストリ: コンテナイメージを保存、共有、使用するための 組み込みコンテナレジストリ を利用できます。 • 保護変数: 環境ごとに 保護変数 を使用して、デプロイに必要な認証情報などを安全に保存し、使用することができま す。 https://www.gitlab.jp/stages-devops-lifecycle/continuous-integration/
  20. #jjug_ccc .gitlab-ci.yml $ cat .gitlab-ci.yml stages: - build - test

    build-code-job: stage: build script: - echo "Check the ruby version, then build some Ruby project files:" - ruby -v - rake test-code-job1: stage: test script: - echo "If the files are built successfully, test some files with one command:" - rake test1 test-code-job2: stage: test script: - echo "If the files are built successfully, test other files with a different command:" - rake test2 20 https://docs.gitlab.com/ee/ci/yaml/gitlab_ci_yaml.html
  21. #jjug_ccc Gitlab-CIの特徴 21 • マルチプラットフォーム: Unix、Windows、macOS、その他Goをサポートするあらゆるプラットフォームでビルドを実行 できます。 • 安定性: ビルドは

    GitLab とは別のマシンで実行されます。 • 柔軟なパイプライン: ステージごとに複数の並列ジョブを定義し、 他のビルドをトリガー することができます。 • バージョン管理されたパイプライン: .gitlab-ci.yml ファイル にはテストなどのすべてのステップが含まれています。 ブ ランチで .gitlab-ci.yml ファイルを変更することで、誰でも安全にパイプラインの変更を試すことができます。 • Dockerのサポート: カスタムDockerイメージを使用したり、テストの一環として サービス を起動したり、 新しいDocker イメージをビルド したり、Kubernetes上で実行したりすることができます。 • コンテナレジストリ: コンテナイメージを保存、共有、使用するための 組み込みコンテナレジストリ を利用できます。 • 保護変数: 環境ごとに 保護変数 を使用して、デプロイに必要な認証情報などを安全に保存し、使用することができま す。 https://www.gitlab.jp/stages-devops-lifecycle/continuous-integration/
  22. #jjug_ccc Gitlab-CIのDockerサポート 22 https://docs.gitlab.com/runner/executors/

  23. #jjug_ccc Gitlab-CIのDockerサポート 23 https://docs.gitlab.com/runner/executors/

  24. #jjug_ccc CIパイプラインへのテストの組み込み 24

  25. #jjug_ccc CIパイプラインへのテストの組み込み 25 アプリケーションとインフラのコードを分離

  26. #jjug_ccc CIパイプラインへのテストの組み込み 26 アプリケーションとインフラのコードを分離 アプリケーション

  27. #jjug_ccc CIパイプラインへのテストの組み込み 27 アプリケーションとインフラのコードを分離 インフラ

  28. #jjug_ccc CI CIパイプラインへのテストの組み込み 28 アプリケーションとインフラのコードを分離 インフラ アプリケーション

  29. #jjug_ccc CIパイプラインへのテストの組み込み 29 4つのステージ構成

  30. #jjug_ccc stageとは 30 https://docs.gitlab.co.jp/ee/ci/pipelines/ jobのグループ化と実行順序を制御する

  31. #jjug_ccc stageとは 31 https://www.gitlab.jp/stages-devops-lifecycle/continuous-integration/

  32. #jjug_ccc CIパイプラインへのテストの組み込み 32 4つのステージ構成 code

  33. #jjug_ccc CIパイプラインへのテストの組み込み 33 4つのステージ構成 code test

  34. #jjug_ccc CIパイプラインへのテストの組み込み 34 4つのステージ構成 code test build

  35. #jjug_ccc CIパイプラインへのテストの組み込み 35 4つのステージ構成 code test deploy build

  36. #jjug_ccc CIパイプラインへのテストの組み込み 36 code test deploy build

  37. #jjug_ccc stageとは 37 $ cat .gitlab-ci.yml stages: # code -

    build - test - deploy
  38. #jjug_ccc CIパイプラインへのテストの組み込み 38 code test deploy build

  39. #jjug_ccc CIパイプラインへのテストの組み込み 39 code

  40. #jjug_ccc CIパイプラインへのテストの組み込み 40 code test deploy build git push

  41. #jjug_ccc stageとは 41 $ cat .gitlab-ci.yml stages: # code -

    build - test - deploy
  42. #jjug_ccc CIパイプラインへのテストの組み込み 42 code test git push

  43. #jjug_ccc CIパイプラインへのテストの組み込み 43 code test deploy build analysis git push

  44. #jjug_ccc analysis job • 静的コード解析を実行するジョブ • コーディング規約などをチェック • PMD, Spotbugs,

    CheckStyle 44
  45. #jjug_ccc 静的解析 $ cat .gitlab-ci.yml stages: - test analysis: stage:

    test image: openjdk script: - /bin/sh gradlew clean checkstyleMain checkstyleTest spotbugsMain pmdMain pmdTest 45
  46. #jjug_ccc CIパイプラインへのテストの組み込み 46 code test deploy build unit test git

    push
  47. #jjug_ccc unit test job • 単体テストを実行するジョブ • JUnit 47

  48. #jjug_ccc unit test job $ cat .gitlab-ci.yml stages: - test

    services: - name: postgres unit-test: stage: test image: openjdk script: - /bin/sh gradlew clean test 48
  49. #jjug_ccc servicesとは $ cat .gitlab-ci.yml stages: - test services: -

    name: postgres unit-test: stage: test image: openjdk script: - /bin/sh gradlew clean test 49
  50. #jjug_ccc servicesとは • jobを実行するdockerイメージとは別のdockerイメージを実行するための仕組み • データベースコンテナを動作させておきたいユースケースに対応 50

  51. #jjug_ccc unit test job $ cat .gitlab-ci.yml stages: - test

    services: - name: postgres unit-test: stage: test image: openjdk script: - /bin/sh gradlew clean test 51
  52. #jjug_ccc CIパイプラインへのテストの組み込み 52 code test deploy build unit test git

    push
  53. #jjug_ccc CIパイプラインへのテストの組み込み 53 code test deploy build arch test git

    push
  54. #jjug_ccc arch test job • アーキテクチャテストを実行するジョブ • レイヤー間の依存関係をチェック • ドメインモデル間の依存関係をチェック

    • ArchUnit 54
  55. #jjug_ccc CIパイプラインへのテストの組み込み 55 code test deploy build merge request arch

    test unit test analysis git push
  56. #jjug_ccc CIパイプラインへのテストの組み込み 56 code test deploy build analysis git push

    arch test unit test analysis merge request
  57. #jjug_ccc CIパイプラインへのテストの組み込み 57 code test deploy build unit test git

    push arch test unit test analysis merge request
  58. #jjug_ccc CIパイプラインへのテストの組み込み 58 code test deploy build arch test git

    push arch test unit test analysis merge request
  59. #jjug_ccc CIパイプラインへのテストの組み込み 59 code test deploy build arch test unit

    test analysis git push arch test unit test analysis merge request
  60. #jjug_ccc CIパイプラインへのテストの組み込み 60 code test build git push arch test

    unit test analysis merge request arch test unit test analysis
  61. #jjug_ccc CIパイプラインへのテストの組み込み 61 code test deploy build build git push

    arch test unit test analysis merge request arch test unit test analysis
  62. #jjug_ccc build job • アプリケーションのビルドを実行するジョブ 62

  63. #jjug_ccc build job $ cat .gitlab-ci.yml stages: - build build:

    stage: build image: openjdk script: - /bin/sh gradlew clean bootJar after_script: - aws s3 cp build/libs/app.jar s3://bucket/app.jar 63
  64. #jjug_ccc build job $ cat .gitlab-ci.yml stages: - build build:

    stage: build image: openjdk script: - /bin/sh gradlew clean bootJar after_script: - aws s3 cp build/libs/app.jar s3://bucket/app.jar 64
  65. #jjug_ccc CIパイプラインへのテストの組み込み 65 code test deploy build build git push

    arch test unit test analysis merge request arch test unit test analysis
  66. #jjug_ccc CIパイプラインへのテストの組み込み 66 code test deploy build git push arch

    test unit test analysis merge request arch test unit test analysis build
  67. #jjug_ccc CIパイプラインへのテストの組み込み 67 code test deploy build trigger git push

    arch test unit test analysis merge request arch test unit test analysis build
  68. #jjug_ccc trigger job $ cat .gitlab-ci.yml stages: - deploy trigger:

    stage: deploy variables: APP_VERSION: 1.0 trigger: project: infra-repository 68
  69. #jjug_ccc CIパイプラインへのテストの組み込み 69 code test deploy build trigger インフラ git

    push arch test unit test analysis merge request arch test unit test analysis build
  70. #jjug_ccc CIパイプラインへのテストの組み込み 70 code test deploy build trigger インフラ deploy

    git push arch test unit test analysis merge request arch test unit test analysis build
  71. #jjug_ccc deploy job $ cat .gitlab-ci.yml stages: - deploy deploy:

    stage: deploy image: ansible script: - /usr/local/bin/ansible-playbook -i staging/hosts -e “app_version=${APP_VERSION’}” deploy.yml rules: - if ‘$APP_VERSION’ 71
  72. #jjug_ccc deploy job $ cat .gitlab-ci.yml stages: - deploy deploy:

    stage: deploy image: ansible script: - /usr/local/bin/ansible-playbook -i staging/hosts -e “app_version=${APP_VERSION’}” deploy.yml rules: - if ‘$APP_VERSION’ 72
  73. #jjug_ccc CIパイプラインへのテストの組み込み 73 code test deploy build trigger インフラ deploy

    git push merge request trigger analysis unit test arch test analysis unit test arch test build アプリケーション
  74. #jjug_ccc Agenda 1. なぜ継続的テストを進めているの か 2. CIパイプラインへのテストの組み 込み 3. テストの自動化

    74
  75. #jjug_ccc 自動化しているテスト • ユニットテスト • パフォーマンステスト • E2Eテスト 75 https://note.com/globis_engineers/n/n455d7322fa33

  76. #jjug_ccc 自動化しているテスト 76 • ユニットテスト • パフォーマンステスト • E2Eテスト https://note.com/globis_engineers/n/n455d7322fa33

  77. #jjug_ccc パフォーマンステストを自動化される前は 77 1. 負荷がかかるサーバを構築する 2. 負荷をかけるサーバを構築する 3. パフォーマンステストを実行する 4.

    テストをもとにSpreadsheetのグラフに落としこむ 5. すべてのパフォーマンステストのシナリオに対して上記の作業を繰り返す
  78. #jjug_ccc パフォーマンステストが自動化される前の問題 1. 1つのJMeterシナリオをテストするのに時間がかかる 2. 手作業なので作業ミスが発生する 3. テスト結果を確認するためのグラフを作るのに大変 78

  79. #jjug_ccc パフォーマンステストの自動化で利用したもの 79

  80. #jjug_ccc パフォーマンステストを自動化される前は 80 1. 負荷がかかるサーバを構築する 2. 負荷をかけるサーバを構築する 3. パフォーマンステストを実行する 4.

    テストをもとにSpreadsheetのグラフに落としこむ 5. すべてのパフォーマンステストのシナリオに対して上記の作業を繰り返す
  81. #jjug_ccc パフォーマンステストの自動化 81 テストを実行する ansible influxdb PostgreSQL Grafana 負荷がかかるサーバ

  82. #jjug_ccc パフォーマンステストの自動化 82 負荷がかかるサーバを構築する ansible influxdb PostgreSQL Grafana 負荷がかかるサーバ

  83. #jjug_ccc パフォーマンステストを自動化される前は 83 1. 負荷がかかるサーバを構築する 2. 負荷をかけるサーバを構築する 3. パフォーマンステストを実行する 4.

    テストをもとにSpreadsheetのグラフに落としこむ 5. すべてのパフォーマンステストのシナリオに対して上記の作業を繰り返す
  84. #jjug_ccc パフォーマンステストを自動化される前は 84 1. 負荷がかかるサーバを構築する 2. 負荷をかけるサーバを構築する 3. パフォーマンステストを実行する 4.

    テストをもとにSpreadsheetのグラフに落としこむ 5. すべてのパフォーマンステストのシナリオに対して上記の作業を繰り返す
  85. #jjug_ccc パフォーマンステストの自動化 85 JMeter環境を構築する ansible influxdb PostgreSQL Grafana 負荷がかかるサーバ

  86. #jjug_ccc パフォーマンステストを自動化される前は 86 1. 負荷がかかるサーバを構築する 2. 負荷をかけるサーバを構築する 3. パフォーマンステストを実行する 4.

    テストをもとにSpreadsheetのグラフに落としこむ 5. すべてのパフォーマンステストのシナリオに対して上記の作業を繰り返す
  87. #jjug_ccc パフォーマンステストを自動化される前は 87 1. 負荷がかかるサーバを構築する 2. 負荷をかけるサーバを構築する 3. パフォーマンステストを実行する 4.

    テストをもとにSpreadsheetのグラフに落としこむ 5. すべてのパフォーマンステストのシナリオに対して上記の作業を繰り返す
  88. #jjug_ccc パフォーマンステストの自動化 88 JMeterシナリオを実行する ansible influxdb Grafana 負荷がかかるサーバ PostgreSQL

  89. #jjug_ccc JMeter CLI $ jmeter -n -t scenario.jmx -l /usr/local/report/jtl.csv

    -e -o /usr/local/report 89
  90. #jjug_ccc パフォーマンステストを自動化される前は 90 1. 負荷がかかるサーバを構築する 2. 負荷をかけるサーバを構築する 3. パフォーマンステストを実行する 4.

    テストをもとにSpreadsheetのグラフに落としこむ 5. すべてのパフォーマンステストのシナリオに対して上記の作業を繰り返す
  91. #jjug_ccc パフォーマンステストの自動化 91 JTLファイルをインポートする ansible influxdb PostgreSQL Grafana 負荷がかかるサーバ

  92. #jjug_ccc JTLファイル $ cat jtl.csv timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,fa ilureMessage,bytes,sentBytes,grpThreads,allThreads,URL,Latency,IdleTime,Connect 1234567890123,1,GET /index.html,200,OK,rakus.co.jp:1099-Thread Group

    1-1,text,true,,1689,1,1,1,https://rakus.co.jp/,1,0,1 92
  93. #jjug_ccc パフォーマンステストの自動化 93 JTLファイルをインポートする ansible influxdb PostgreSQL Grafana 負荷がかかるサーバ

  94. #jjug_ccc InfluxdbにJMeterの結果をインポートする方法 • JMeterのbackend listenerを利用する ◦ JMeterで負荷テスト中にリアルタイムで連携する方法 ◦ 3種類の方法がある ▪

    (公式)InfluxDBBackendListenerClient ▪ (非公式)JMeter InfluxDB v2.0 listener plugin • JMeterのJTLファイルを利用する 94
  95. #jjug_ccc パフォーマンステストの自動化 95 統計情報をインポートする ansible influxdb PostgreSQL Grafana 負荷がかかるサーバ

  96. #jjug_ccc 統計情報 $ cat statistics.json | jq . { "GET

    /index.html" : { "transaction" : "GET /index.html", "sampleCount" : 1, "errorCount" : 0, "errorPct" : 0.0, "meanResTime" : 9.933357142857153, "medianResTime" : 3.0, "minResTime" : 0.0, "maxResTime" : 1557.0, "pct1ResTime" : 21.0, "pct2ResTime" : 34.0, "pct3ResTime" : 105.0, "throughput" : 23.258672993025723, "receivedKBytesPerSec" : 14.445816429262068, "sentKBytesPerSec" : 6.859491449115007 } } 96
  97. #jjug_ccc パフォーマンステストの自動化 97 統計情報をインポートする ansible influxdb PostgreSQL Grafana 負荷がかかるサーバ

  98. #jjug_ccc パフォーマンステストの自動化 98 統計情報をインポートする ansible influxdb PostgreSQL Grafana 負荷がかかるサーバ JTLファイルをインポートする

  99. #jjug_ccc パフォーマンステストの自動化 99 ansible influxdb PostgreSQL Grafana 負荷がかかるサーバ

  100. 100 https://grafana.com/grafana/dashboards/1152

  101. #jjug_ccc パフォーマンステストを自動化される前は 101 1. 負荷がかかるサーバを構築する 2. 負荷をかけるサーバを構築する 3. パフォーマンステストを実行する 4.

    テストをもとにSpreadsheetのグラフに落としこむ 5. すべてのパフォーマンステストのシナリオに対して上記の作業を繰り返す
  102. #jjug_ccc パフォーマンステストを自動化される前は 102 1. 負荷がかかるサーバを構築する 2. 負荷をかけるサーバを構築する 3. パフォーマンステストを実行する 4.

    テストをもとにSpreadsheetのグラフに落としこむ 5. すべてのパフォーマンステストのシナリオに対して上記の作業を繰り返す
  103. #jjug_ccc パフォーマンステストの自動化 103 ansible influxdb PostgreSQL Grafana 負荷がかかるサーバ

  104. #jjug_ccc パフォーマンステストを自動化される前の問題 1. 1つのJMeterシナリオをテストするのに時間がかかる 2. 手作業が多いので作業ミスが発生する 3. テスト結果を確認するためのグラフを作るのに大変 104

  105. #jjug_ccc パフォーマンステストを自動化される前の問題 1. 1つのJMeterシナリオをテストするのに時間がかかる → 自動化されたので夜間に実施できる 1. 手作業が多いので作業ミスが発生する 2. テスト結果を確認するためのグラフを作るのに大変

    105
  106. #jjug_ccc パフォーマンステストを自動化される前の問題 1. 1つのJMeterシナリオをテストするのに時間がかかる → 自動化されたので夜間に実施できる 1. 手作業が多いので作業ミスが発生する → Ansibleを実行するのみで発生しにくくなった

    1. テスト結果を確認するためのグラフを作るのに大変 106
  107. #jjug_ccc パフォーマンステストを自動化される前の問題 1. 1つのJMeterシナリオをテストするのに時間がかかる → 自動化されたので夜間に実施できる 1. 手作業が多いので作業ミスが発生する → Ansibleを実行するのみで発生しにくくなった

    1. テスト結果を確認するためのグラフを作るのに大変 → Grafanaが自動的に作成してくれる 107
  108. #jjug_ccc まとめ • Gitlab CI上にテストの組み込み • パフォーマンステストの自動化 ↓ 継続的にテストをすることができる環境 を構築することができました。

    108
  109. 109 ご清聴ありがとうございました。