fbpx

Autify で作成した E2E テストを Gitlab の CI/CD パイプラインで動かしてみた

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

はじめに

前回の記事 では、Azure DevOps の CI/CD パイプラインに、Autify で作成した E2E 自動テストの実行と、結果の成否判定を行う PowerShell スクリプトを組み込み、ビルドから単体テスト、デプロイから E2E テストまでの一連の流れの自動化しました。今回は Gitlab の CI/CD パイプラインを使用した方法をご紹介したいと思います。

検証

前回と同じアプリと Autify で作成したテストプランを使用します。

テスト対象のアプリケーション

  • アカウントロック機能があるフォーム認証ページ
  • 5 回認証失敗するとアカウントロックがかかり、30 分間そのアカウントでログインできなくなる

実行するテストプラン

登録済みのアカウントで、パスワード認証を 5 回失敗したときに、アカウントロックがかかることを確認する。

テストプランのステップ一覧

アカウントロック時の表示

シェルスクリプト

今回は以下の二つを実行するシェルスクリプトを作成しました。方針としては、前回作成した Powershell スクリプトと同じです。

  • Autify で作成した任意のテストプランを実行する
  • テストの成否を判定する

Autify API

シェルスクリプトから Autify を使用するために、Autify API(https://autifyhq.github.io/autify-api/#/)を使用しています。テストプランの実行・結果の確認のために必要な情報は以下の 4 つです。

  • API を使用するためのパーソナルアクセストークン
  • テストプランを作成しているプロジェクト ID
  • 使用するテストプラン ID
  • 実行されたテストごとの固有 ID

必要な情報の取得方法については、前回の記事 をご覧下さい。

作成したシェルスクリプトが以下になります。作成にあたって、こちらのページを参考にしました。

# ${AUTIFY_PERSONAL_ACCESS_TOKEN}: パーソナルアクセストークン
# ${AUTIFY_PROJECT_ID}:            プロジェクト ID
# ${AUTIFY_TEST_PLAN_ID}:          テストプラン ID

# jq のインストール
apt-get update && apt-get -y install jq

# テストのスケジュール
response=$(curl -XPOST -H  "Authorization: Bearer ${AUTIFY_PERSONAL_ACCESS_TOKEN}" \
https://app.autify.com/api/v1/schedules/${AUTIFY_TEST_PLAN_ID})

# レスポンスから、実行されたテストの固有 ID を取得
test_plan_result_id=$(echo ${response} | jq -r .data.id) 

# テストの実行状況を取得
result=$(curl -X GET "https://app.autify.com/api/v1/projects/${AUTIFY_PROJECT_ID}/results/${test_plan_result_id}" \
-H "accept: application/json" -H "Authorization: Bearer ${AUTIFY_PERSONAL_ACCESS_TOKEN}")
status=$(echo ${result} | jq -r '.status')

# ステータスを表示
echo "${status}"

# ステータスが 'passed' か 'failed' になるまで、20秒毎にポーリングを続ける
while [ "${status}" != "passed" ]
  do
    if [ "${status}" = "failed" ]; then
      echo "${status}"
      exit 2
    else
      sleep 20
      result=$(curl -X GET "https://app.autify.com/api/v1/projects/${AUTIFY_PROJECT_ID}/results/${test_plan_result_id}" \
      -H "accept: application/json" -H "Authorization: Bearer ${AUTIFY_PERSONAL_ACCESS_TOKEN}")
      status=$(echo ${result} | jq -r '.status')
      echo "${status}"
    fi
  done

前回と同様に ${AUTIFY_PERSONAL_ACCESS_TOKEN} などの値は、以下のように Gitlab の管理画面から環境変数としてを追加しており、アクセス権のないユーザーは値を見ることができないように設定しています。

以下はスクリプト実行時のログです。

CI/CD パイプライン

上記のシェルスクリプトを組み込んだ CI/CD パイプラインを作成しました。今回は CI(継続的インテグレーション)部分と、CD(継続的デプロイ)部分は分けておらず、アプリのデプロイ時に、データベースのテストユーザーを毎回リセットすることで、連続した E2Eテストに対応するように設定しています。

Azure App Service へのデプロイ

今回作成した認証フォームアプリの運用には、Azure App Service を使用しています。前回の記事では Azure DevOps を使用していたため、比較的容易に連携することができたのですが、Gitlab の CI/CD からデプロイするためには、リソースへの認証設定の必要があります。

そこで今回は、Azure のリソースに接続するための Azure Active Directory (Azure AD) のアプリケーションとサービスプリンシパルを作成しました。詳細についてはこちらをご参照いただきたいのですが、サービスプリンシパルを使用することで、どのリソースに、どのレベルでアクセスするか制御することができるので、ユーザーID でログインするよりもセキュアな方法であり、推奨されています。

Azure CLI を使用して、リソースにアクセスするために必要な情報は以下の5つです。

  • アプリケーション(クライアント)ID
  • ディレクトリ(テナント)ID
  • シークレット
  • Azure App Service のリソース名
  • リソースグループ名

今回のデモ用に app-autify-demo という名前のアプリケーションを作成して Azure AD に登録しました。アプリケーション(クライアント)ID と ディレクトリ(テナント)ID は、アプリケーションの「概要」に表示されています。

シークレットは「証明書とシークレット」で作成して、使用してください。

Azure App Service のリソース名とリソースグループ名は、App Service の画面から取得してください。

シェルスクリプト

以上の情報をもとに、ビルド成果物を Azure App Service にデプロイするためのスクリプトが以下になります。

# ${AZ_SERVICE_PRINCIPAL_APPLICATION_ID}: アプリケーション(クライアント)ID
# ${AZ_SERVICE_PRINCIPAL_DIRECTORY_ID}:   ディレクトリ(テナント)ID
# ${AZ_SERVICE_PRINCIPAL_SECRET}:         シークレット
# ${AZ_APP_NAME}:                         Azure App Service のリソース名
# ${AZ_APP_RESOURCE_GROUP}:               リソースグループ名

apt-get update && apt-get -y install zip
curl -sL https://aka.ms/InstallAzureCLIDeb | bash
az login --service-principal -u ${AZ_SERVICE_PRINCIPAL_APPLICATION_ID} -p ${AZ_SERVICE_PRINCIPAL_SECRET} --tenant ${AZ_SERVICE_PRINCIPAL_DIRECTORY_ID}
dotnet restore ./${AZ_APP_NAME}/${AZ_APP_NAME}.csproj
dotnet publish -c release -o out
cd out && zip -r app.zip .
az webapp deployment source config-zip -n ${AZ_APP_NAME} -g ${AZ_APP_RESOURCE_GROUP} --src app.zip

上記で使用している値についても、Gitlab の管理画面から環境変数として設定しています。

上記を盛り込んだ gitlab-ci.yml を作成し、E2E テストまでの一連の流れを自動化することができました。

テストに成功していることが Autify 側でも確認できます。

まとめ

Autify で作成した E2E テストを Gitlab の CI/CD パイプラインに組み込み、コード push からの一連の流れを完全に自動化することができました。皆さんも是非一度試してみてください!

Autify
https://autify.com

新規CTA