GitLab CI/CD의 Matrix 표현식
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
Matrix 표현식은 parallel:matrix 식별자를 기반으로 동적 작업 의존성을 활성화하여 parallel:matrix 작업 간에 1:1 매핑을 생성합니다. Matrix 표현식은 inputs 표현식과 비교하여 몇 가지 제한 사항이 있습니다:
히스토리
- GitLab 18.6에서 도입되었습니다.
Matrix 표현식은 parallel:matrix 식별자를 기반으로 동적 작업 의존성을 활성화하여 parallel:matrix 작업 간에 1:1 매핑을 생성합니다.
Matrix 표현식은 inputs 표현식과 비교하여 몇 가지 제한 사항이 있습니다:
- 컴파일 시점만: 식별자는 파이프라인이 생성될 때 확인되며, 작업 실행 중이 아닙니다.
- 문자열 교체만: 복잡한 로직이나 변환 없음.
- Matrix 식별자만: CI/CD 변수나 inputs를 참조할 수 없습니다.
구문#
Matrix 표현식은 $[[ matrix.IDENTIFIER ]] 구문을 사용하여 작업 의존성에서 parallel:matrix 식별자를 참조합니다. 예를 들어:
needs:
- job: build
parallel:
matrix:
- OS: ['$[[ matrix.OS ]]']
ARCH: ['$[[ matrix.ARCH ]]']
needs:parallel:matrix에서 Matrix 표현식#
Matrix 표현식을 사용하여 작업 의존성에서 Matrix 식별자를 동적으로 참조하고, 모든 조합을 수동으로 지정하지 않고 Matrix 작업 간에 1:1 매핑을 활성화할 수 있습니다.
예를 들어:
linux:build:
stage: build
script: echo "Building linux..."
parallel:
matrix:
- PROVIDER: [aws, gcp]
STACK: [monitoring, app1, app2]
linux:test:
stage: test
script: echo "Testing linux..."
parallel:
matrix:
- PROVIDER: [aws, gcp]
STACK: [monitoring, app1, app2]
needs:
- job: linux:build
parallel:
matrix:
- PROVIDER: ['$[[ matrix.PROVIDER ]]']
STACK: ['$[[ matrix.STACK ]]']
이 예시는 모든 linux:build 및 linux:test 작업 간에 1:1 의존성 매핑을 생성합니다:
linux:test: [aws, monitoring]은linux:build: [aws, monitoring]에 의존합니다.linux:test: [aws, app1]은linux:build: [aws, app1]에 의존합니다.- 동일한 사항이 모든 6개의
parallel:matrix값 조합에 적용됩니다.
matrix. 표현식을 사용하면 각 Matrix 조합을 수동으로 지정할 필요가 없습니다.
Matrix 표현식은 현재 작업의 Matrix 구성에서만 식별자를 참조합니다.
YAML 앵커를 사용하여 parallel:matrix 구성 재사용#
YAML 앵커를 사용하여 복잡한 parallel:matrix 구성과 의존성이 있는 여러 작업에서 parallel:matrix 구성을 재사용할 수 있습니다.
예를 들어:
stages:
- compile
- test
- deploy
.build_matrix: &build_matrix
parallel:
matrix:
- OS: ["ubuntu", "alpine"]
ARCH: ["amd64", "arm64"]
VARIANT: ["slim", "full"]
compile_binary:
stage: compile
script:
- echo "Compiling for $OS-$ARCH-$VARIANT"
<<: *build_matrix
integration_test:
stage: test
script:
- echo "Testing $OS-$ARCH-$VARIANT"
<<: *build_matrix
needs:
- job: compile_binary
parallel:
matrix:
- OS: ['$[[ matrix.OS ]]']
ARCH: ['$[[ matrix.ARCH ]]']
VARIANT: ['$[[ matrix.VARIANT ]]']
deploy_artifact:
stage: deploy
script:
- echo "Deploying $OS-$ARCH-$VARIANT"
<<: *build_matrix
needs:
- job: integration_test
parallel:
matrix:
- OS: ['$[[ matrix.OS ]]']
ARCH: ['$[[ matrix.ARCH ]]']
VARIANT: ['$[[ matrix.VARIANT ]]']
이 구성은 24개의 작업을 생성합니다: 각 스테이지에 8개의 작업(2 OS × 2 ARCH × 2 VARIANT 조합),
스테이지 간에 1:1 의존성이 있습니다.
값의 하위 집합 사용#
Matrix 표현식을 특정 값과 결합하여 의존성의 선택적 하위 집합을 만들 수 있습니다:
stages:
- prepare
- build
- test
.full_matrix: &full_matrix
parallel:
matrix:
- PLATFORM: ["linux", "windows", "macos"]
VERSION: ["16", "18", "20"]
.platform_only: &platform_only
parallel:
matrix:
- PLATFORM: ["linux", "windows", "macos"]
prepare_env:
stage: prepare
script:
- echo "Preparing $PLATFORM with Node.js $VERSION"
<<: *full_matrix
build_project:
stage: build
script:
- echo "Building on $PLATFORM"
needs:
- job: prepare_env
parallel:
matrix:
- PLATFORM: ['$[[ matrix.PLATFORM ]]']
VERSION: ["18"] # Only depend on Node.js 18 preparations
<<: *platform_only
이 예시에서:
prepare_env는parallel:matrix를 사용하여 9개의 작업을 생성합니다: 3PLATFORM× 3VERSIONS.build_project는parallel:matrix를 사용하여 3개의 작업을 생성합니다: 3PLATFORM값만.- 각
build_project작업은 모든 플랫폼(PLATFORM)에 대해 Node.js18(VERSION)에만 의존합니다.
또는 모든 의존성을 수동으로 구성할 수 있습니다.
