[Git] - Gitlab CI 템플릿 구성, 조건 분기, 병렬 실행

Woong·2025년 7월 9일
0

Git 기본

목록 보기
19/19

YAML 문법 정리 (GitLab CI 기준)

  • & : anchor

    • 특정 블록에 이름을 붙이는데 사용
  • * : alias

    • 정의된 anchor를 참조
  • <<: *alias_name

    • anchor를 병합해서 해당 위치에 포함시킨다.
  • 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로 템플릿 구성
    • 이후 job 들에서 재사용
.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)

  • 커밋이 태그인지, 브랜치인지에 따라 Job 실행 여부 다르게 설정
    • rules: 사용
deploy:
  stage: deploy
  script: ./scripts/deploy.sh
  rules:
    - if: '$CI_COMMIT_TAG'
      when: always
    - if: '$CI_COMMIT_BRANCH == "main"'
      when: manual
    - when: never

parallel matrix 로 병렬 실행

  • 같은 테스트를 여러 조합으로 병렬 실행해야 할 때 사용
    • 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

0개의 댓글