/엔지니어/Git / CI·CD/GitLab CI/CD 파이프라인 완전 가이드
Git / CI·CD중급UbuntuDebianCentOSgitlabcicdpipeline

GitLab CI/CD 파이프라인 완전 가이드

.gitlab-ci.yml 문법, 스테이지·잡·아티팩트 설정, Docker 빌드 자동화, 환경별 배포, GitLab Runner 등록까지 GitLab CI/CD 핵심을 설명합니다.

.gitlab-ci.yml 기본 구조

YAML
# .gitlab-ci.yml

stages:
  - test
  - build
  - deploy

variables:
  NODE_VERSION: "20"
  IMAGE_NAME: $CI_REGISTRY_IMAGE

# 잡 정의
lint:
  stage: test
  image: node:20-alpine
  script:
    - npm ci
    - npm run lint

test:
  stage: test
  image: node:20-alpine
  script:
    - npm ci
    - npm test
  coverage: '/Liness*:s*(d+.d+)%/'
  artifacts:
    reports:
      coverage_report:
        coverage_format: cobertura
        path: coverage/cobertura-coverage.xml

스테이지와 잡 흐름

YAML
stages:
  - test       # 병렬 실행
  - build      # test 완료 후
  - staging    # build 완료 후
  - production # 수동 승인 후

build-image:
  stage: build
  image: docker:24
  services:
    - docker:24-dind
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $IMAGE_NAME:$CI_COMMIT_SHORT_SHA .
    - docker push $IMAGE_NAME:$CI_COMMIT_SHORT_SHA
  only:
    - main
    - develop

환경별 배포

YAML
deploy-staging:
  stage: staging
  environment:
    name: staging
    url: https://staging.example.com
  script:
    - kubectl set image deployment/myapp myapp=$IMAGE_NAME:$CI_COMMIT_SHORT_SHA
  only:
    - develop

deploy-production:
  stage: production
  environment:
    name: production
    url: https://example.com
  script:
    - kubectl set image deployment/myapp myapp=$IMAGE_NAME:$CI_COMMIT_TAG
  when: manual           # 수동 승인 필요
  only:
    - tags

캐시와 아티팩트

YAML
# 캐시 — 잡 간 재사용 (node_modules 등)
cache:
  key: $CI_COMMIT_REF_SLUG
  paths:
    - node_modules/
    - .npm/

# 아티팩트 — 잡 간 파일 전달 + 다운로드 가능
build:
  script:
    - npm run build
  artifacts:
    paths:
      - dist/
    expire_in: 1 week    # 보관 기간

# 아티팩트 사용
deploy:
  dependencies:
    - build
  script:
    - ls dist/           # build 잡의 아티팩트 사용 가능

조건 실행 — rules

YAML
test:
  script: npm test
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
    - if: '$CI_COMMIT_BRANCH == "main"'
    - if: '$CI_COMMIT_TAG'
      when: never        # 태그에서는 실행 안 함

# 파일 변경 시에만 실행
backend-test:
  script: npm test
  rules:
    - changes:
        - src/**/*
        - package.json

GitLab Runner 등록

Bash
# Runner 설치 (Ubuntu)
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
sudo apt install -y gitlab-runner

# GitLab 프로젝트 → Settings → CI/CD → Runners에서 토큰 확인
sudo gitlab-runner register   --url https://gitlab.com   --registration-token YOUR_TOKEN   --executor docker   --docker-image alpine:latest   --description "my-runner"

# 상태 확인
sudo gitlab-runner status
sudo gitlab-runner list

내장 환경변수 주요 목록

변수
$CI_COMMIT_SHA전체 커밋 해시
$CI_COMMIT_SHORT_SHA짧은 커밋 해시
$CI_COMMIT_BRANCH브랜치 이름
$CI_COMMIT_TAG태그 이름
$CI_REGISTRY_IMAGE프로젝트 컨테이너 레지스트리
$CI_ENVIRONMENT_NAME배포 환경 이름
$CI_PIPELINE_SOURCE트리거 소스 (push, schedule 등)
#gitlab#cicd#pipeline#자동화#devops
편집 안내 · Editorial Note

이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.

관련 공식 문서Git 공식 문서

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.