Docker 와 Gitlab CI/CD

김지환·2025년 6월 12일
0

Front-end

목록 보기
16/16

CI/CD

CI (Continuous Integration) : 지속통합. 새로운 소스코드를 자동으로 빌드하여 검증한 뒤, 통과한 경우에 변경사항을 공유 repository에 통합.
CD (Continous Deliver/Deployment) : 지속배포. 지속적으로 릴리즈할 수 있는 프로세스이다. 검증완료된 변경사항을 자동으로 배포.
Pipeline : Build, Test, Staging등 회사 업무 스타일을 고려한 반영 프로세스

GitLab CI구성

GitLab Runner
GitLab과 함께 작동하여 코드 변경 사항을 자동으로 빌드, 테스트 및 배포하는 CI도구이다.

  • Pipeline이 구성된 GItLab Repository에 코드 변경 사항을 푸시하면 GitLab은 하나 이상의 작업이 포함된 새 파이프 라인을 생성
  • GItLab Runner는 GitLab서버에서 실행할 새 작업을 주기적으로 확인하고 실행
  • Runner는 .gitlab-ci.yml파일에 정의된 작업 단계를 실행
  • Runner가 작업을 실행하면 실시간 상태 업데이트, 로그 등을 GitLab서버로 보냄
  • 작업이 완료되면 Runner는 최종상태를 GitLab서버에 보고
  1. gitLab에 runner 등록 (이 url로 어떤 token을 가진 어떤 tag의 러너가 올건지 받아드리기위한 준비)
  2. Docker에 파이프라인을 수행할 gitlab runner 설치

Docker 설치 및 컨테이너 등록

Gitlab Runner를 설치하려면 Docker가 필요하다.

GitLab Runner 도커 이미지 설치

docker pull gitlab/gitlab-runner:alpine3.12-v14.10.0

컨테이너 실행

docker run -d --name gitlab-runner --restart always \
  -v $HOME/gitlab-runner-config:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:latest

Docker에 GitLab Runner 정보 등록

docker exec -it gitlab-runner-fe gitlab-runner register

이후 새롭게 GitLab Runner를 등록하여 사용하려면 terminal에서 입력

Please enter the gitlab-ci coordinator URL:
Please enter the registration token:
Please enter a description for the runner:
Please enter tags for the runner (comma-separated):
Please enter the executor:
Please enter the default Docker image:

서버가 없을때
Please enter the executor:는 Docker를 쓸거지만,
서버가 없을때는, shell로 등록하면 몇가지 더 설치 후 굳이 Docker를 띄우지 않아도 된다.
Local에서 shell script로 말아서 사용한다.

Runner를 공유하고싶을때
이미 백엔드에서 등록한 Runner를 같이 사용하고싶을땐,
Runner를 Block하지않고 Shared 설정해주어 모든 repo에서 사용할수있도록 해준다.(단점은 같이 공유해서 사용하기 때문에 Job이 대기 상태로 밀림현상과 node 버전이 충돌날 수 있다.

PipeLine 구성

Pipeline
Repository에 Push/Merge와 같은 이벤트가 발생했을 경우 테스트/빌드/배포와 같은 작업을 자동으로 수행해 주는 것
develop branch의 변경을 감지하면 build 후 개발 서버에 반영 하도록 구성
GitLab에서는 .gitlab-ci.yml파일을 해당 프로젝트의 Pipeline설정파일로 사용한다.

gitlab-ci.yml 작성

  • Job : 수행할 작업을 정의한다. (ex 반영 , 빌드 등) Runner가 실행해야하는 명령 모음.
  • Stages : 작업의 실행 시기를 정의한다. (ex 빌드 후 반영)
image: node:20-alpine

stages:
  - install
  - build
  - deploy

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - node_modules/

before_script:
  - npm ci

# ✅ 개발 브랜치(dev)에 푸시될 경우 실행
build_dev:
  stage: build
  script:
    - npm run build:dev
  artifacts:
    paths:
      - dist/
  only:
    - develop

deploy_dev:
  stage: deploy
  tags:
    - aiotion
    - saas
  script:
    - npm run deploy-s3:dev
  only:
    - develop
  environment:
    name: development
    url: https://aiotion.wss.ai/login

# ✅ 운영 브랜치(main)에 푸시될 경우 실행
build_prod:
  stage: build
  script:
    - npm run build:prod
  artifacts:
    paths:
      - dist/
  only:
    - develop

deploy_prod:
  stage: deploy
  tags:
    - aiotion
    - saas
  script:
    - npm run deploy-s3:prod
  only:
    - develop
  environment:
    name: production
    url: https://aiotion-advanced.wss.ai/login

gitlab-ci.yml 개선

  • Serverless 라이브러리를 사용하지않아서 Docker 이미지에는 awscli가 설치되어 있지 않기 때문에 Job이 aws s3 sync 등을 실행하면 실패합니다.
  • node + awscli를 미리 포함한 커스텀 Dockerfile을 만들거나, AWS CLI 포함된 이미지를 직접 설치한다.
  • 최종적으로 before_script에 apt를 이용한 AWS CLI 포함된 이미지를 설치하고 실행시킵니다.
image: node:20-bullseye

stages:
  - install
  - build
  - deploy

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - node_modules/

before_script:
  - apt-get update && apt-get install -y python3-pip curl
  - pip install --upgrade pip
  - pip install awscli --break-system-packages
  - npm ci

# ✅ 개발 브랜치에 Push될 경우
build_dev:
  stage: build
  tags:
    - aiotion
    - saas
  script:
    - npm run build:dev
  artifacts:
    paths:
      - dist/
  only:
    - develop

deploy_dev:
  stage: deploy
  tags:
    - aiotion
    - saas
  script:
    - npm run deploy-s3:dev
  only:
    - develop
  environment:
    name: development
    url: http://aiotion-cloudfront-product-fe-dev.s3-website.ap-northeast-2.amazonaws.com

# ✅ 운영 브랜치(master)에 Push될 경우
build_prod:
  stage: build
  tags:
    - aiotion
    - saas
  script:
    - npm run build:prod
  artifacts:
    paths:
      - dist/
  only:
    - master

deploy_prod:
  stage: deploy
  tags:
    - aiotion
    - saas
  script:
    - npm run deploy-s3:prod
  only:
    - master
  environment:
    name: production
    url: https://aiotion-advanced.wss.ai/login

Variables 구성

빌드 & 배포는 완료 후 API url 호출 문제가 생겨 확인해보니 env 파일에서 develop과 prod의 호출 url을 매핑하지못하여 405에러가 나오는 상황이었습니다.

  • before_script 다시 작성
  • env url 설정에 맞게 Gitlab CI/CD Variables에 등록
before_script:
  - apt-get update && apt-get install -y python3-pip curl
  - pip install --upgrade pip
  - pip install awscli --break-system-packages     
  - |
     if [ "$CI_COMMIT_REF_NAME" == "develop" ]; then
        echo "VITE_LOGIN_API_LINK=$VITE_LOGIN_API_LINK_DEV" >> .env
        echo "VITE_API_LINK=$VITE_API_LINK_DEV" >> .env
        echo "VITE_AWS_ACCOUNT_URL=$VITE_AWS_ACCOUNT_URL_DEV" >> .env
        echo "🧪 DEBUG ENV FILE:"
        cat .env
      elif [ "$CI_COMMIT_REF_NAME" == "master" ]; then
        echo "VITE_LOGIN_API_LINK=$VITE_LOGIN_API_LINK_PROD" >> .env
        echo "VITE_API_LINK=$VITE_API_LINK_PROD" >> .env
        echo "VITE_AWS_ACCOUNT_URL=$VITE_AWS_ACCOUNT_URL_PROD" >> .env
        echo "🧪 DEBUG ENV FILE:"
        cat .env
      fi
  - npm ci

정리

Docker와 Gitlab CI/CD를 처음 사용해보았는데, 여러모로 공부가 많이 된 것 같다.
중간에 Gitlab-Runner를 설치하고, 먼저 등록된 Runner를 공유받아 사용하는데 어려움이 있었지만,
최종적으로 Docker 이미지와 컨테이너 개념 그리고 Pipeline을 이해하기에 도움이 많이 되었습니다.

참조

profile
FE Developer

0개의 댓글