[CI/CD] NCP와 Gitlab의 Container Registry를 통해 gitlab-ci를 사용해보자. -3(gitlab-ci.yml작성)

Junseo Jung·2024년 5월 4일

NCP+GitLab

목록 보기
3/3
post-thumbnail

GitLab Runner

작성한 CI/CD 작업을 실행하는 agent를 GitLab Runner라고 한다. 즉, 테스트, 빌드, 배포 등의 과정이 이뤄지는 곳 이다. Gitlab.com을 사용하는 경우 기본적으로 제공된다. 별도의 Runner를 사용할 수 있다.

GitLab CI/CD v.s GitHub Action

GitHub에도 CI/CD를 위한 GitHub Action이 존재한다.

공통점

  • 리포지토리에 저장된 코드에 직접 접근하여 CI/CD기능을 수행함
  • YAML로 작성됨
  • 다른 컨테이너 이미지를 사용할 수 있음

GitHub에만 있는 기능

  • 마켓플레이스를 통해 다양한 기능 사용 가능

GitLab에만 있는 기능

  • 서드파티 없이 자체적 CI/CD기능 내장
  • Stage안에 자식 파이프라인을 구성할 수 있으며 해당 파이프라인은 동시에 동작할 수 있다.
  • 자체 container registry제공
  • Kubernetes 자체 지원

CI/CD Variables

CI/CD과정에서 필요한 값(ssh key, 배포 서버 IP, container registry ID 등)을 저장하고 사용할 수 있다. GitHub Action의 Secrets와 비슷하다.

GitLab CI/CD

YAML 키워드

  • 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_NAME
  • script: 해당 작업에서 실행될 스크립트이다. CI/CD variables를 사용할 수 있다.
  • services: 스크립트의 실행을 위한 추가적인 Docker 이미지를 의미한다.

gitlab-ci.yml 예시

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를 사용하기 위해 사용한다.

참고.

GitLab CI/CD vs GitHub Action 비교하기

[Gitlab] dind 란?, 트러블 슈팅, error during connect: Post http://dind:2375/v1.40/auth: dial tcp: lookup dind on 172.31.0.2:53: no such host

0개의 댓글