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을 실행하는 프로세스.
shellexecutor는 러너가 설치된 서버에서 바로,dockerexecutor는 매번 새 컨테이너에서 실행한다 - 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 변수 마스킹