엔드 투 엔드 테스트 파이프라인

e2e:test-on-omnibus 하위 파이프라인

e2e:test-on-omnibus 하위 파이프라인은 GitLab 플랫폼의 E2E 테스트의 주요 실행자입니다. 파이프라인 정의에는 특정한 병합 요청 파이프라인에서 실행되는 테스트의 수를 줄이기 위한 여러 동적 구성 요소가 있습니다.

설정

파이프라인 설정은 다음으로 이루어져 있습니다:

  • 메인 GitLab 파이프라인의 prepare 스테이지에 있는 e2e-test-pipeline-generate 작업.
  • qa 스테이지에 있는 e2e:test-on-omnibus 작업으로, omnibus 패키지를 빌드하고 E2E 테스트를 실행하는 책임을 지닌 하위 파이프라인을 트리거합니다.

e2e-test-pipeline-generate

이 작업은 선택적인 테스트 실행을 구현하는 두 가지 구성 요소로 이루어져 있습니다:

  • detect_changes Rake 작업은 특정 병합 요청에서 실행되어야 하는 e2e 스펙을 결정합니다. 이 작업은 특정 병합 요청에서의 변경 사항을 분석하고 실행해야 하는 스펙을 결정합니다. 그에 따라 모든 시나리오dry-run이 실행되고 시나리오에 실행 가능한 테스트가 있는지 확인합니다. 선택적인 테스트 실행은 다음 기준을 사용하여 실행해야 하는 특정 테스트를 결정합니다.
  • generate-e2e-pipeline이 실행되어 적절한 환경 변수로 하위 파이프라인 YAML 정의 파일이 생성됩니다.

e2e:test-on-omnibus 실행 파이프라인

E2E 테스트 실행 파이프라인은 E2E 테스트의 실행을 지원하는 여러 스테이지로 이루어져 있습니다.

.pre

이 스테이지는 다음 작업을 담당합니다:

test

이 스테이지는 다양한 유형의 GitLab 설정에 대한 E2E 테스트를 실행합니다. 실행되는 작업의 수는 e2e-test-pipeline-generate 작업에 의해 동적으로 결정됩니다.

report

이 스테이지는 allure 테스트 보고서 생성을 담당합니다.

새로운 작업 추가

선택적인 테스트 실행은 모든 작업 정의에 존재하는 규칙 세트에 의존합니다. 일반적인 작업에는 다음과 같은 속성이 포함됩니다.

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::MyNewJob: gitlab-qa 실행자에 전달되는 시나리오 클래스의 이름입니다.
  • !reference [.rules:test:qa, rules]: 모든 테스트를 실행해야 하는 파이프라인에 대해 일치하는 주요 규칙 정의입니다. 예를 들어, qa 프레임워크에 변경 사항이 있는 경우에 실행됩니다.
  • if: $QA_SUITES =~ /Test::Integration::MyNewJob/: 선택적인 테스트 실행에 대한 주요 규칙입니다. QA_SUITEqa framework에 위치한 시나리오 추상화의 이름입니다.

    QA_SUITEgitlab-qa 실행자에 전달되는 QA_SCENARIO와는 다른 것이며, 일관성을 위해 일반적으로 동일한 이름을 가집니다. QA_SUITE 추상화 클래스에는 일반적으로 실행할 태그 및 선택적으로 일부 추가 설정 단계에 대한 정보가 포함되어 있습니다.

  • !reference [.rules:test:manual, rules]: 항상 일치하고 작업을 수동으로 설정하여 선택적인 테스트 실행에 의해 실행되지 않더라도 필요에 따라 실행될 수 있도록 하는 최종 규칙입니다.

위의 예를 고려하여 새로운 작업을 만들려면 다음 단계를 수행합니다.

  1. 새로운 시나리오 유형 my_new_job.rbgitlab-qa 프로젝트의 integration 디렉토리에 만들고 새 버전을 릴리스하여 일반적으로 사용 가능하게 합니다.
  2. 새로운 시나리오 my_new_job.rbqa 프레임워크의 integration 디렉토리에 만듭니다. 가장 단순한 경우에는 이 시나리오가 실행해야 할 RSpec 태그를 정의합니다.

    module QA
      module Scenario
        module Test
          module Integration
            class MyNewJob < Test::Instance::All
              tags :some_special_tag
            end
          end
        end
      end
    end
    
  3. 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]
    

병렬 작업

병렬 테스트 실행을 위해 실행되어야 하는 작업 유형에서 선택적 실행이 올바르게 작동하려면 작업 정의를 일반적으로 병렬 및 선택적 변형으로 나눠야 합니다. 일부 선택적 실행으로 인해 불필요한 작업이 여러 개 생성되지 않도록 하기 위해 분할이 필요합니다. 예를 들어:

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 자식 파이프라인은 GDK(GitLab 개발 키트)를 사용하여 엔지니어들에게 e2e:test-on-omnibus보다 빠른 끝 간 테스트 실행에 대한 피드백을 제공하여 GitLab 플랫폼의 개발을 지원합니다.

이것은 Omnibus GitLab 대비 더 빨리 빌드 및 설치될 수 있는 GDK를 사용하여 실행됩니다. 그런데 Omnibus GitLab은 프로덕션 설치에 사용될 수 있으나, GDK는 개발 환경입니다. GDK에서 실행되는 테스트는 GitLab을 프로덕션 환경에서 실행할 준비과정에 의존하는 버그를 잡아낼 수 없을 수도 있습니다. 이는 공식 설치 패키지의 일환으로 자산 사전 컴파일, 구성 기본값 할당, GitLab 서비스를 여러 서버에 배포하는 것 등에 의존하는 버그가 GDK에서만 나타날 수도 있음을 의미합니다. 반면에 GDK를 일상적으로 사용하는 엔지니어들은 GDK에서만 나타나는 버그를 자동으로 잡아낼 수 있습니다.

설정

파이프라인 설정은 주 GitLab 파이프라인의 여러 작업으로 이루어져 있습니다:

  • prepare 단계의 e2e-test-pipeline-generate 작업. 이 작업은 e2e:test-on-omnibus 파이프라인과 동일합니다.
  • build-images 단계의 build-gdk-image 작업.
  • qa 단계의 e2e:test-on-gdk 트리거 작업은 E2E 테스트를 실행하는 자식 파이프라인을 트리거합니다.

build-gdk-image

이 작업은 병합 요청의 코드를 사용하여 GDK 인스턴스를 컨테이너에 런칭하는 테스트 작업에서 사용할 수 있는 Docker 이미지를 빌드합니다. 이미지는 컨테이너 레지스트리에 푸시됩니다.

해당 작업은 기본 브랜치의 파이프라인에서 GDK 및 GitLab 구성요소가 포함된 기본 이미지를 빌드하기 위해 실행됩니다. 이는 병합 요청에서 전체 이미지를 처음부터 빌드하는 것을 피합니다. 그러나 병합 요청이 특정 GitLab 구성요소나 코드에 변경 사항을 포함하는 경우, 해당 작업은 테스트 작업에 사용될 이미지를 빌드하기 전에 기본 이미지를 다시 빌드합니다.

e2e:test-on-gdk 자식 파이프라인

e2e:test-on-omnibus 파이프라인과 마찬가지로 e2e:test-on-gdk 파이프라인은 E2E 테스트 실행을 지원하는 여러 단계로 이루어져 있습니다.

.pre

이 단계는 병렬 테스트 실행을 지원하는 knapsack 보고서를 가져오는 역할을 합니다.

test

이 단계에서는 여러 유형의 GitLab 구성에 대해 e2e 테스트를 실행합니다. 실행되는 작업의 수는 e2e-test-pipeline-generate 작업에 의해 동적으로 결정됩니다.

각 작업은 build-gdk-image 작업에서 만든 GDK Docker 이미지에서 컨테이너를 시작하고, 해당 컨테이너에서 실행 중인 GDK 인스턴스에 대해 끝 간 테스트를 실행합니다.

report

해당 단계는 allure 테스트 리포트 생성을 담당합니다.

e2e:test-on-cng

e2e:test-on-cng 자식 파이프라인은 Cloud Native GitLab 설치에 대한 테스트를 실행합니다. review-apps와 달리, 이 파이프라인은 로컬 kind Kubernetes 클러스터를 사용합니다.

배포는 cng 오케스트레이터 도구에 의해 관리되며, CI/CD 배포를 로컬에서 재작성할 수도 있습니다.

이 파이프라인은 예약된 파이프라인에서 매 2시간마다 실행되며 다음과 같은 유효성 검사를 수행합니다:

  • 기본 차트 구성을 사용하여 CNG 배포에 대한 주 테스트 스위트
  • 메인 지원되는 redis 버전을 최소로 사용하는 CNG 배포에 대한 최소 health_check 테스트 스위트

설정

파이프라인 설정은 주 GitLab 파이프라인의 여러 작업으로 이루어져 있습니다:

  • compile-production-assetsbuild-assets-image 작업은 전체 프론트엔드 자산 컴파일을 담당하며, 이는 CNG 빌드 파이프라인에서 요구됩니다.
  • e2e-test-pipeline-generate 작업은 e2e:test-on-cng 자식 파이프라인을 생성합니다.

e2e:test-on-cng 자식 파이프라인

자식 파이프라인은 E2E 테스트 실행을 지원하는 여러 단계로 이루어져 있습니다.

.pre

  • build-cng-env 작업은 CNG 하류 파이프라인에 필요한 모든 환경 변수를 설정합니다.
  • build-cng 작업은 CNG 하류 파이프라인을 트리거하며 필요한 모든 이미지를 빌드합니다.

test

test 단계의 작업은 다음과 같은 작업을 수행합니다:

  • kind를 사용하여 로컬 k8s 클러스터 설정
  • 공식 helm 차트를 사용하여 GitLab 설치
  • 수행된 배포에 대한 E2E 테스트 실행

report

해당 단계는 allure 테스트 리포트 생성 및 테스트 지표 업로드를 담당합니다.

디버깅

디버깅을 돕기 위해:

  • 각 테스트 작업은 cng에 전달할 수 있는 인수 목록을 출력하여 동일한 배포를 로컬 디버깅을 위해 정확히 재현할 수 있습니다.
  • 클러스터 이벤트 로그 및 모든 포드 로그는 E2E 테스트 작업 결과물에 저장됩니다.