노트

GitLab CI/CD 파이프라인

GitLab CI/CD Pipeline

인프라#ci#git · 연결된 개념 6개

쉽게 말하면

GitLab CI/CD는 커밋이 들어올 때마다 자동으로 도는 세차장 라인 같아요. 테스트, 빌드, 배포 칸을 차례로 지나가고, 실제 일은 GitLab 서버가 아니라 따로 등록한 러너가 해요.

비유가 깨지는 곳 세차장은 한 칸씩 지나가지만 같은 stage 안의 job은 병렬로 돌아요. 또 docker executor는 매번 깨끗한 환경이라 설치가 느리니 cache를 남겨요. 비밀값은 masked·protected 변수로 둬요.

GitLab CI/CD(Continuous Integration/Continuous Delivery)는 저장소 루트의 .gitlab-ci.yml에 적은 파이프라인을 커밋·머지 때마다 실행하는 기능이다. 실제 작업은 GitLab 서버가 아니라 따로 등록한 러너(runner)가 수행한다.

구성 요소

  • stage: 작업 단계(test → build → deploy). 같은 stage의 job은 병렬, stage끼리는 순서대로 돈다
  • job: stage 안의 개별 작업. script에 셸 명령을 적는다
  • runner·executor: job을 실행하는 프로세스. shell executor는 러너가 설치된 서버에서 바로, docker executor는 매번 새 컨테이너에서 실행한다
  • tags: job을 특정 러너에 배정한다. rules(예전 only)로 브랜치 조건을, when: manual로 수동 실행을 건다
  • CI/CD 변수: 프로젝트 설정에 비밀값(배포 키 등)을 저장하고 job에서 환경변수로 읽는다. masked·protected 옵션을 켠다
flowchart LR
  subgraph T["test"]
    T1["job"]
    T2["job"]
  end
  subgraph B["build"]
    B1["job"]
    B2["job"]
  end
  subgraph D["deploy"]
    D1["job"]
  end
  T --> B --> D
stages: [build, deploy]
 
build:
  stage: build
  image: node:22
  script:
    - npm ci
    - npm run build
  artifacts:
    paths: [dist/]
 
deploy:
  stage: deploy
  script: ./scripts/deploy.sh
  rules:
    - if: $CI_COMMIT_BRANCH == "main"
      when: manual

자주 만나는 함정

  • CI=true가 기본으로 잡혀 있어 일부 빌드 도구는 경고를 오류로 다룬다. 끄기보다 경고를 고치는 게 낫다
  • cp -r src/* dest는 숨김 파일(.env.example 등)을 빠뜨린다. src/.을 쓴다
  • job 안에서 서버를 포그라운드로 띄우면 파이프라인이 끝나지 않는다. 프로세스 매니저나 배포 스크립트로 백그라운드에서 띄운다
  • SSH로 배포할 때 StrictHostKeyChecking no로 호스트 확인을 끄면 중간자 공격(Man-in-the-Middle, MITM)에 열린다. 서버의 호스트 키를 known_hosts용 변수로 등록해 쓴다(SSH 키: Ed25519와 RSA)
  • docker executor는 매번 깨끗한 환경이라 의존성 설치가 느리다. cache로 패키지 캐시를 남기고 npm ci를 쓴다

빌드와 배포를 git 기록에 묶는다는 점에서 GitOps와 이어지고, 컨테이너 이미지를 만드는 단계는 Dockerfile: 레이어 캐시와 멀티 스테이지을 본다.

출처: GitLab CI/CD YAML 문법: stages · rules · Runner executors · CI/CD 변수 마스킹

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • kubectl 디버깅 치트시트

    kubectl은 쿠버네티스 클러스터를 조회·조작하는 CLI(Command-Line Interface)다. 앱 개발자가 가장 자주 쓰는 건 "내 Pod가 떠 있나, 왜 죽었나"를 확인하는 명령들이다.

  • 원격 근무 선언과 비동기 협업

    전원 원격으로 일하는 GitLab이 정리한 원칙. 말보다 기록, 동기보다 비동기, 근무 시간보다 결과를 앞세운다.

  • Docker Compose

    Docker Compose는 여러 컨테이너로 이뤄진 앱 스택을 YAML 파일 하나로 정의하고, 명령 하나로 띄우고 내리는 도구다. 길어지는 docker run 옵션을 선언형 파일로 옮긴 것이라 보면 된다.

  • 컨테이너 네트워킹

    컨테이너는 각자 격리된 네트워크를 가지므로, 서로 통신하려면 같은 도커 네트워크에 붙인다. 같은 사용자 정의 네트워크(user-defined network) 안에서는 도커 내장 DNS(Domain Name System)가 컨테이너 이름(또는 별칭)을 IP로 풀어 주어, IP 대신 이름으로 접속한다.

  • CPU 아키텍처와 네이티브 모듈

    CPU 아키텍처는 CPU가 실행하는 명령어 집합(Instruction Set Architecture, ISA)의 종류다. 서버와 PC에서는 x86-64와 ARM64 두 계열이 주로 쓰이고, 한 계열용으로 컴파일된 기계어는 다른 계열 CPU에서 실행되지 않는다. Node.js 프로젝트에서는 이 차이가 네이티브 모듈에서 드러난다.

보기 옵션