게시글
velca
벨바카
4주
GitLab CI/CD 파이프라인을 위한 .gitlab-ci.yml 파일 작성하기

.gitlab-ci.yml 파일

.gitlab-ci.yml 파일은 GitLab CI/CD 파이프라인을 정의하는 핵심 구성 파일이다.

이 파일은 프로젝트의 루트 디렉토리에 위치하며, CI/CD 프로세스 단계별로 필요한 작업을 설명하는 역할을 한다.

키워드

.gitlab-ci.yml 작성 시 사용할 수 있는 키워드들을 알아보자.

1. stages

stages:
  - build
  - test
  - deploy

stages 는 파이프라인의 주요 단계를 정의한다.

위 예시에서는 빌드, 테스트, 배포 3단계로 파이프라인을 구성하는 것을 의미한다.

2. jobs

build_job:
  stage: build
  script:
    - echo "Building the project"
    - make build

test_job:
  stage: test
  script:
    - echo "Running tests"
    - make test

위 코드는 두 가지 작업을 정의한다.

build_jobtest_job 은 각각 작업의 이름이다.

stage 키워드는 앞서 stages 에서 정의된 단계 이름을 사용하며, 각각 buildtest 단계에 사용되는 것을 의미한다.

script 키워드는 해당 단계에서 실행할 명령어를 정의한다.

3. variables

variables:
  GLOBAL_VAR: "global value"

job_specific:
  variables:
    JOB_VAR: "job specific value"
  script:
    - echo $GLOBAL_VAR
    - echo $JOB_VAR

이 키워드는 전역 변수나 작업별 변수를 정의한다.

정의된 환경 변수는 Node.js 를 기준으로 하면 process.env.GLOBAL_VAR 등으로 접근 가능하다.

4. before_script, after_script

before_script:
  - echo "This runs before all jobs"

job:
  script:
    - echo "This is the main job"

after_script:
  - echo "This runs after all jobs"

before_script 는 작업 실행 전, after_script 는 작업 실행 후 실행할 스크립트를 정의한다.

위의 경우 전역 스크립트를 정의했기 때문에 모든 작업 실행 전, 모든 작업 실행 후 실행된다.

작업 결과와 관계없이 사용되기 때문에 정리나 알림 전송 등에 사용할 수 있다.

job:
  before_script:
    - echo "This runs before the job's main script"
  script:
    - echo "This is the main job script"
  after_script:
    - echo "This runs after the job's main script"

위와 같이 특정 작업 내에서만 사용할 수도 있다.

5. artifacts

job:
  artifacts:
    paths:
      - path/to/file.txt
      - directory/

artifacts 키워드는 작업 완료 후 보존할 파일이나 폴더를 지정한다.

artifacts:paths 에 지정되지 않은 파일이나 폴더는 작업이 완료되면 삭제된다.

6. cache

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - node_modules/
  policy: pull-push

cache 키워드는 작업 간 파일이나 폴더를 재사용하기 위해 사용된다.

주요 옵션으로 다음 3 가지가 있다.

  • key: 캐시 식별에 사용되는 고유 키
  • paths: 캐시할 파일이나 폴더 목록
  • policy: 캐시 정책
    • pull-push: (기본값) 작업 시작 시 캐시를 가져오고, 종료 시 업데이트
    • pull: 작업 시작 시에만 캐시를 가져옴
    • push: 작업 종료 시에만 캐시를 업데이트

7. only, except

job:
  only:
    - main
    - develop
  except:
    - feature/*
  script:
    - echo "This job runs only on main and develop branches"

only 키워드는 지정된 조건에만 작업을 실행하고, except 키워드는 지정된 조건을 제외한 모든 경우에 실행한다.

onlyexcept는 동시에 사용할 수 있으며, 동시 사용 시 두 조건 모두 만족되는 경우만 실행된다.

그리고 * 와 같은 와일드카드나 정규 표현식도 사용할 수 있다.

위 코드는 maindevelop 브랜치에서만 실행되고, feature/ 로 시작하는 브랜치는 제외한다는 의미다.

8. tags

job:
  tags:
    - tag1
    - tag2

tags 키워드는 작업을 실행할 Runner를 지정하는데 사용된다.

프로젝트에서 GitLab Runner 설정 시 tag를 입력할 수 있게 되어있는데, tags 키워드가 지정되어 있다면 키워드에 정의된 모든 태그를 가진 Runner만 실행된다.

9. default

default:
  image: ruby:3.0
  before_script:
    - echo "This runs before all jobs"
  tags:
    - docker

job1:
  script:
    - echo "This job uses the default image and before_script"

job2:
  image: python:3.9
  script:
    - echo "This job overrides the default image"

default 키워드는 파이프라인의 모든 작업에 대한 기본 설정을 정의한다.

여러 작업에 공통적으로 적용되는 설정을 한 곳에서 정의해 코드 중복을 줄이고 구성을 간소화 할 수 있다.

default 키워드는 파이프라인 구성 최상위 레벨에 위치해야하며, 개별 작업에서 정의된 설정은 default에 정의된 설정보다 높은 우선순위를 가진다.

전체 예시

stages:
  - build
  - test
  - deploy

variables:
  GLOBAL_VAR: "global value"

default:
  before_script:
    - echo "This runs before all jobs"
  after_script:
    - echo "This runs after all jobs"

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - node_modules/

build_job:
  stage: build
  script:
    - echo "Building the project"
    - npm install
  artifacts:
    paths:
      - dist/
    expire_in: 1 week
  only:
    - main
    - develop
  tags:
    - docker

test_job:
  stage: test
  script:
    - echo "Running tests"
    - npm test
  cache:
    key: ${CI_COMMIT_REF_SLUG}
    paths:
      - node_modules/
    policy: pull
  except:
    - tags

deploy_job:
  stage: deploy
  script:
    - echo "Deploying to production"
  only:
    - main
  tags:
    - production

${CI_COMMIT_REF_SLUG}는 GitLab CI/CD 에서 제공하는 사전 정의된 변수로 브랜치별로 고유 캐시를 생성할 때 사용하기 좋다.