CI (Continuous Integration) : 지속통합. 새로운 소스코드를 자동으로 빌드하여 검증한 뒤, 통과한 경우에 변경사항을 공유 repository에 통합.
CD (Continous Deliver/Deployment) : 지속배포. 지속적으로 릴리즈할 수 있는 프로세스이다. 검증완료된 변경사항을 자동으로 배포.
Pipeline : Build, Test, Staging등 회사 업무 스타일을 고려한 반영 프로세스
GitLab Runner
GitLab과 함께 작동하여 코드 변경 사항을 자동으로 빌드, 테스트 및 배포하는 CI도구이다.
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
Repository에 Push/Merge와 같은 이벤트가 발생했을 경우 테스트/빌드/배포와 같은 작업을 자동으로 수행해 주는 것
develop branch의 변경을 감지하면 build 후 개발 서버에 반영 하도록 구성
GitLab에서는 .gitlab-ci.yml파일을 해당 프로젝트의 Pipeline설정파일로 사용한다.
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
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
빌드 & 배포는 완료 후 API url 호출 문제가 생겨 확인해보니 env 파일에서 develop과 prod의 호출 url을 매핑하지못하여 405에러가 나오는 상황이었습니다.
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을 이해하기에 도움이 많이 되었습니다.
참조