& : anchor
* : alias
<<: *alias_name
ex)
job-a는 .common과 같은 image를 사용하게 됨script 도 templete 화하여 variable, matrix 를 넣는 것으로 공통으로 사용 가능.common: &common
image: node:18
job-a:
<<: *common
script:
- echo "hello from job-a"
job-b:
<<: *common
script:
- echo "hello from job-b"
GitLab에서 공식 지원하는 문법이라 구조 정리할 때 유용
image, before_script, script 가 반복돼서 anchor로 템플릿 구성.default_template: &default_template
image: node:18
before_script:
- npm ci
script:
- npm run build
build-dev:
<<: *default_template
rules:
- if: '$CI_COMMIT_BRANCH == "dev"'
build-prod:
<<: *default_template
rules:
- if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/'
rules: 사용deploy:
stage: deploy
script: ./scripts/deploy.sh
rules:
- if: '$CI_COMMIT_TAG'
when: always
- if: '$CI_COMMIT_BRANCH == "main"'
when: manual
- when: never
ENV, BROWSER 조합별로 병렬 처리 (Cartesian Product. 모든 조합에 대해 데카르트 곱으로 조합)e2e-test:
stage: test
image: node:18
script:
- npm run test:e2e -- --env=$ENV --browser=$BROWSER
parallel:
matrix:
- ENV: ["staging", "production"]
BROWSER: ["chrome", "firefox"]
stages:
- build
- test
- deploy
variables:
IMAGE_VERSION: ${CI_COMMIT_SHORT_SHA}
.default_template: &default_template
image: node:22
before_script:
- npm ci
script:
- npm run build
build-dev:
<<: *default_template
stage: build
rules:
- if: '$CI_COMMIT_BRANCH == "dev"'
build-prod:
<<: *default_template
stage: build
rules:
- if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/'
e2e-test:
stage: test
image: node:22
script:
- npm run test:e2e -- --env=$ENV --browser=$BROWSER
parallel:
matrix:
- ENV: ["staging", "production"]
BROWSER: ["chrome", "firefox"]
rules:
- if: '$CI_COMMIT_BRANCH'
deploy:
stage: deploy
script: ./scripts/deploy.sh -v ${IMAGE_VERSION}
rules:
- if: '$CI_COMMIT_TAG'
when: always
- if: '$CI_COMMIT_BRANCH == "main"'
when: manual
- when: never