[GitLab CI] 다른 파일에 선언된 설정 사용하기 (공유 설정)

by 스뎅(thDeng) on

Anchor

GitLab CI에서 YAML anchor 기능을 사용하면 미리 선언해둔 설정을 여러 곳에서 사용할 수 있다.

(GitLab CI 문서에 있는 설명을 복사해 오면..)

.job_template: &job_configuration  # Hidden yaml configuration that defines an anchor named 'job_configuration'
  image: ruby:2.6
  services:
    - postgres
    - redis

test1:
  <<: *job_configuration           # Merge the contents of the 'job_configuration' alias
  script:
    - test1 project

test2:
  <<: *job_configuration           # Merge the contents of the 'job_configuration' alias
  script:
    - test2 project

위와 같은 설정은 아래처럼 변환된다. &로 anchor의 이름과 설정을 선언하고 <<로 그 설정을 가져와서 넣어준다.

.job_template:
  image: ruby:2.6
  services:
    - postgres
    - redis

test1:
  image: ruby:2.6
  services:
    - postgres
    - redis
  script:
    - test1 project

test2:
  image: ruby:2.6
  services:
    - postgres
    - redis
  script:
    - test2 project

문제 - 여러 파일에 나눠진 설정

그런데 GitLab CI 설정이 너무 길어지다보니 복잡해 져서 여러 파일로 나누게 되는 경우가 있다. include를 사용해서 아래와 같은 설정으로 나뉘어 졌다.

# .gitlab-ci.yml

stages:
  - init
  - build
  - verification
  - ..

include:
  - .gitlab/ci/init.gitlab-ci.yml
  - .gitlab/ci/build.gitlab-ci.yml
  - .gitlab/ci/verification.gitlab-ci.yml
  - ..

이 때 여러 stage/job에서 공용으로 사용하기 위한 설정을 .gitlab-ci.yml파일에 선언이 필요할 수 있는데, anchor를 사용하면 참조가 안 돼서 IntelliJ가 화를 낸다.

# .gitlab-ci.yml

.use-cache: &use-cache
  cache:
    paths:
      - .gradle/caches
      - .gradle/wrapper

---
# .gitlab/ci/init.gitlab-ci.yml

init:
  stage: init
  <<: *use-cache
  script: ./gradlew clean --stacktrace

---
# .gitlab/ci/build.gitlab-ci.yml

build:
  stage: build
  <<: *use-cache
  needs:
    - init
  script: ./gradlew classes testClasses --stacktrace
  artifacts:
    when: always
    paths:
      - ./**/build/**/*

위와 같이 설정을 하면 모르는 참조라고 IntelliJ가 아래처럼 화를 낸다.

Cannot resolve alias

물론 GitLab CI도 화를 낸다.

YAML syntax error

extends

이런 경우, hidden job을 생성해 두고 extends를 사용하면 IntelliJ의 불만 없이 설정을 복사해 올 수 있다.

# .gitlab-ci.yml
.use-cache:
  cache:
    paths:
      - .gradle/caches
      - .gradle/wrapper

---
# .gitlab/ci/init.gitlab-ci.yml

init:
  stage: init
  extends: .use-cache
  script: ./gradlew clean --stacktrace

---
# .gitlab/ci/build.gitlab-ci.yml

build:
  stage: build
  extends: .use-cache
  needs:
    - init
  script: ./gradlew classes testClasses --stacktrace
  artifacts:
    when: always
    paths:
      - ./**/build/**/*

(역시 GitLab CI 문서에 있는 샘플을 보면..)

.tests:
  script: rake test
  stage: test
  only:
    refs:
      - branches

rspec:
  extends: .tests
  script: rake rspec
  only:
    variables:
      - $RSPEC

위의 설정은 아래처럼 바뀐다.

rspec:
  script: rake rspec
  stage: test
  only:
    refs:
      - branches
    variables:
      - $RSPEC

참고

별도로 명시하지 않을 경우, 이 블로그의 포스트는 다음 라이선스에 따라 사용할 수 있습니다: Creative Commons License CC Attribution-NonCommercial-ShareAlike 4.0 International License