
작성한 CI/CD 작업을 실행하는 agent를 GitLab Runner라고 한다. 즉, 테스트, 빌드, 배포 등의 과정이 이뤄지는 곳 이다. Gitlab.com을 사용하는 경우 기본적으로 제공된다. 별도의 Runner를 사용할 수 있다.
GitHub에도 CI/CD를 위한 GitHub Action이 존재한다.
공통점
GitHub에만 있는 기능
GitLab에만 있는 기능
CI/CD과정에서 필요한 값(ssh key, 배포 서버 IP, container registry ID 등)을 저장하고 사용할 수 있다. GitHub Action의 Secrets와 비슷하다.


stages: 실행할 stage를 정의한다. 각 stage내의 작업은 모두 동시에(parallel) 진행된다.stage: 파이프라인에서 실행할 단계를 의미하며 여러개의 작업으로 구성되어 있다. stage내 작업은 모두 동시에 진행되며 하나의 작업이 실패하는 경우 다음 stage로 넘어가지 않게 된다.variables: 파이프라인에서 사용될 변수를 정의할 수 있다. 정의한 변수는 CI/CD설정의 variables와 같이 $를 통해 사용할 수 있다.image: 해당 작업을 실행할 때 사용할 Docker의 이미지를 나타낸다. Docker Hub의 이미지 뿐만 아니라 container registry의 이미지도 사용 가능하다.only: 특정 브랜치에서만 실행되도록 지정한다. (rules에서 더 많은 기능을 사용할 수 있으므로 GitLab문서에서는 rule의 사용을 추천한다.)rules: 해당 파이프라인의 실행 등의 조건을 설정할 수 있다.job:
script: echo "Hello, Rules!"
rules:
- if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH
when: never
- if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/
when: manual
allow_failure: true
- if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAMEscript: 해당 작업에서 실행될 스크립트이다. CI/CD variables를 사용할 수 있다.services: 스크립트의 실행을 위한 추가적인 Docker 이미지를 의미한다.stages:
- test
- build_and_push
- deploy
test:
stage: test
image: python:3.12
only:
- develop
- main
script:
- pip3 install -r requirements.txt
- cd src
- cp $ENV_TEST .env.local
- python3 manage.py migrate
- python3 manage.py check
- python3 manage.py test
build_and_push:
stage: build_and_push
image: docker:latest
services:
- docker:dind
only:
- main
script:
- docker version
- docker-compose version
- docker login -u $REGISTRY_USER -p $REGISTRY_PASSWORD $REGISTRY
- cp $ENV_PROD .env.prod
- echo "Docker build started..."
- docker-compose build
- echo "Docker build completed..."
- docker tag 컨테이너_명 $IMAGE_TAG
- echo "Docker push started..."
- docker push $IMAGE_TAG
- echo "Docker push completed..."
deploy:
stage: deploy
script:
- chmod 400 $SSH_KEY
- scp -i $SSH_KEY -P 2223 -o StrictHostKeyChecking=no $ENV_PROD root@$SERVER_IP:~/gitlab_ci
- ssh -i $SSH_KEY -p 2223 -o StrictHostKeyChecking=no root@$SERVER_IP "
docker login -u $REGISTRY_USER -p $REGISTRY_PASSWORD $REGISTRY &&
cd ~/gitlab_ci &&
cp $ENV_PROD .env.prod &&
docker pull $IMAGE_TAG &&
docker stop app || true &&
docker rm app || true &&
docker run -p 8000:8000 -d --name app --restart unless-stopped -e ENV=prod --env-file .env.prod $IMAGE_TAG"
only:
- main
dind: Docker in Docker, 말 그대로 도커 안의 도커라는 뜻으로 CI환경에서 Docker를 사용하기 위해 사용한다.