エンドツーエンドのテストパイプライン
e2e:package-and-test
e2e:package-and-test 子パイプラインは、GitLab プラットフォームの E2E テストの主な Executor です。パイプライン定義には、マージリクエストパイプラインで実行されるテストの数を減らすための動的なコンポーネントがいくつかあります。
セットアップ
パイプラインのセットアップ:
- メイン GitLab パイプラインの
prepareステージにあるe2e-test-pipeline-generateジョブ。 -
qaステージのe2e:package-and-testジョブは、omnibusパッケージのビルドと E2E テストの実行を担当する子パイプラインをトリガーします。
e2e-test-pipeline-generate
このジョブは、選択的テスト実行を実装する 2 つのコンポーネントから成ります:
-
detect_changesRake タスクは、特定のマージリクエストパイプラインでどの e2e spec を実行すべきかを決定します。このタスクは特定のマージリクエストの変更を分析し、どの spec を実行しなければならないかを決定します。それに基づいて、すべてのシナリオのdry-runが実行され、シナリオに実行可能なテストが含まれているかどうかが判断されます。選択的テスト実行は、これらの基準を使用して、実行する特定のテストを決定します。 -
generate-e2e-pipelineが実行され、適切な環境変数が設定された子パイプラインの YAML 定義ファイルが生成されます。
e2e:package-and-test
E2E テスト実行パイプラインは、E2E テストの実行をサポートする複数のステージで構成されています。
.pre
このステージは以下のタスクを担当します:
-
並列テスト実行をサポートする
knapsackレポートの取得。 -
omnibus-gitlabDockerイメージを構築するダウンストリームパイプラインのトリガー。
テスト
このステージでは、異なるタイプのGitLab設定に対してe2eテストを実行します。実行されるジョブの数はe2e-test-pipeline-generate ジョブによって動的に決定されます。
レポーター
このステージはアリュールテストのレポート作成を担当します。
新しいジョブの追加
選択的テストの実行は、すべてのジョブ定義に存在する一連のルールに依存します。典型的なジョブには以下のような属性があります:
variables:
QA_SCENARIO: Test::Integration::MyNewJob
rules:
- !reference [.rules:test:qa, rules]
- if: $QA_SUITES =~ /Test::Integration::MyNewJob/
- !reference [.rules:test:manual, rules]
この例では:
-
QA_SCENARIO: Test::Integration::MyNewJobgitlab-qaExecutor に渡されるシナリオクラスの名前。 -
!reference [.rules:test:qa, rules]すべてのテストを実行するパイプラインにマッチする主なルール定義。例えば、qaフレームワークに変更があった場合など。 -
if: $QA_SUITES =~ /Test::Integration::MyNewJob/QA_SUITEは、qa frameworkにあるシナリオ抽象化の名前です。QA_SUITEgitlab-qaの Executor に渡されるQA_SCENARIOとは異なります。QA_SUITE抽象クラスには、通常、どのタグを実行するかという情報と、オプションでいくつかの追加セットアップ ステップが含まれます。 -
!reference [.rules:test:manual, rules]選択的テスト実行によって実行するように設定されていなくても、要求があれば実行できるように、ジョブをmanualに設定します。
上記の例を考慮して、新しいジョブを作成するために以下のステップを実行してください:
-
gitlab-qaプロジェクトのintegrationディレクトリに新しいシナリオタイプmy_new_job.rbを作成し、新しいバージョンをリリースします。 -
qaフレームワークのintegrationディレクトリに新しいシナリオmy_new_job.rbを作成します。最も単純なケースでは、このシナリオは実行されるべきRSpecタグを定義します:module QA module Scenario module Test module Integration class MyNewJob < Test::Instance::All tags :some_special_tag end end end end end -
main.gitlab-ci.ymlパイプライン定義に新しいジョブ定義を追加します:ee:my-new-job: extends: .qa variables: QA_SCENARIO: Test::Integration::MyNewJob rules: - !reference [.rules:test:qa, rules] - if: $QA_SUITES =~ /Test::Integration::MyNewJob/ - !reference [.rules:test:manual, rules]
Parallels ジョブ
複数の並列ジョブを実行する必要があるジョブタイプで選択実行を正しく動作させるためには、ジョブ定義を並列ジョブと選択実行に分割する必要があります。分割は、選択実行が単一の仕様のみを実行するときに、複数の不要なジョブが生成されないようにするために必要です。例えば
ee:my-new-job-selective:
extends: .qa
variables:
QA_SCENARIO: Test::Integration::MyNewJob
rules:
- !reference [.rules:test:qa-selective, rules]
- if: $QA_SUITES =~ /Test::Integration::MyNewJob/
ee:my-new-job:
extends:
- .parallel
- ee:my-new-job-selective
rules:
- !reference [.rules:test:qa-parallel, rules]
- if: $QA_SUITES =~ /Test::Integration::MyNewJob/
e2e:test-on-gdk
e2e:test-on-gdk 子パイプラインは、e2e:package-and-test やレビューアプリを経由するよりも速くエンドツーエンドのテスト実行に関するフィードバックをエンジニアに提供することで、GitLab プラットフォームの開発をサポートします。
これは、Omnibus GitLabに対してテストするよりも短時間でビルドとインストールができるGitLab Development Kit (GDK)に対してテストを実行することで実現できます。GDKは開発環境ですが、Omnibus GitLabは本番環境のデプロイに使えるというトレードオフがあります。GDKに対して実行されるテストは、アセットを事前にコンパイルしたり、公式のインストール・パッケージの一部として設定デフォルトを割り当てたり、GitLabサービスを複数のサーバーにデプロイしたりなど、GitLabを本番環境で実行するための準備プロセスの一部に依存するバグを捕捉できないかもしれません。一方、GDKを毎日使用するエンジニアは、GDKにのみ現れるバグを自動化されたテストが捕らえるという恩恵を受けることができます。
セットアップ
パイプラインのセットアップは、メインのGitLabパイプラインのいくつかのジョブで構成されています:
-
prepareステージのe2e-test-pipeline-generateジョブ 。これはe2e:package-and-testパイプラインと同じジョブです。 -
build-imagesステージのbuild-gdk-imageジョブ 。 -
qaステージのe2e:test-on-gdkトリガージョブは、E2E テストを実行する子パイプラインをトリガします。
build-gdk-image
このジョブはマージリクエストのコードを使用して、テストジョブで使用できるDockerイメージを構築し、コンテナ内でGDKインスタンスを起動します。イメージはコンテナレジストリにプッシュされます。
このジョブはデフォルトブランチ上のパイプラインでも実行され、GDKとGitLabコンポーネントを含むベースイメージを構築します。これにより、マージリクエストでイメージ全体を一から構築する必要がなくなります。しかし、マージリクエストに特定の GitLab コンポーネントやコードへの変更が含まれている場合、ジョブはテストジョブで使うイメージをビルドする前にベースイメージを再構築します。
e2e:test-on-gdk 子パイプライン
e2e:package-and-test パイプラインと同様に、e2e:test-on-gdk パイプラインは、E2E テストの実行をサポートする複数のステージで構成されます。
.pre
このステージは、並列テスト実行をサポートするknapsack レポートの取得を担当します。
テスト
このステージでは、異なるタイプのGitLab設定に対してe2eテストを実行します。実行されるジョブの数はe2e-test-pipeline-generate ジョブによって動的に決定されます。
各ジョブはbuild-gdk-image ジョブで作成された GDK Docker イメージからコンテナを起動し、コンテナ内で実行されている GDK インスタンスに対してエンドツーエンドのテストを実行します。
レポーター
このステージはアリュールテストのレポート作成を担当します。