Gitlab으로 CI/CD가 가능한데 기본적인 사항을 정리해 보겠다.
Gitlab에 저장소를 만들고 .gitlab-ci.yml파일을 만들면 그 때부터 시작된다.
샘플은 https://gitlab.com/nanuchi/gitlab-cicd-crash-course 로 하겠다.
샘플프로젝트는 python으로 작성된 시스템모니터링정보를 제공하는 웹서비스이다.
.gitlab-ci.yml파일
variables:
IMAGE_NAME: nanajanashia/demo-app
IMAGE_TAG: python-app-1.0
stages:
- test
- build
- deploy
run_tests:
stage: test
image: python:3.9-slim-buster
before_script:
- apt-get update && apt-get install make
script:
- make test
build_image:
stage: build
image: docker:20.10.16
services:
- docker:20.10.16-dind
variables:
DOCKER_TLS_CERTDIR: "/certs"
before_script:
- docker login -u $REGISTRY_USER -p $REGISTRY_PASS
script:
- docker build -t $IMAGE_NAME:$IMAGE_TAG .
- docker push $IMAGE_NAME:$IMAGE_TAG
deploy:
stage: deploy
before_script:
- chmod 400 $SSH_KEY
script:
- ssh -o StrictHostKeyChecking=no -i $SSH_KEY root@161.35.223.117 "
docker login -u $REGISTRY_USER -p $REGISTRY_PASS &&
docker ps -aq | xargs docker stop | xargs docker rm &&
docker run -d -p 5000:5000 $IMAGE_NAME:$IMAGE_TAG"
variables는 스크립트내에서 사용되는 변수를 정의할 수 있다.
variables:
IMAGE_NAME: nanajanashia/demo-app
IMAGE_TAG: python-app-1.0
stage는 각 작업의 단계를 나타내며 순차적으로 수행이된다. 작업은 병렬로 처리되는데 같은 stage의 작업들 끼리만 병렬로 처리될 수 있으며 중간에 에러 발생 시 다음단계로 넘어가지 않는다. 샘플에서는 3개의 stage가 있으며 각각 run_tests, build_image, deploy 작업이 한개씩만 있다.
stages: // 스테이지 정의
- test
- build
run_tests:
stage: test // run_tests는 test 스테이지
...
build_image:
stage: build // build_image는 build 스테이지
...
run_tests 작업은 test stage이고 python docker image기반에서 make가 설치되어 있어야 하고 make test를 실행하여 테스트를 진행한다.
run_tests:
stage: test
image: python:3.9-slim-buster
before_script:
- apt-get update && apt-get install make
script:
- make test
build_image 작업은 도커이미지를 만들어서 Docker hub에 도커이미지를 push하는 작업까지 진행한다.
deploy 작업은 서버에 접속하여 docker image를 적용하고 서비스를 시작한다.
서버에 접속시 ssh로 접속하기 때문에 인증을 위해 key를 등록해주어야 한다.
gitlab에서는 개인키를 설정 -> CI/CD -> Variables에서 추가해 줄 수 있으며 위 예에서는 SSH_KEY로 등록된 예이다. SSH_KEY의 경우 파일이며 이때는 type을 File로 등록하면 된다.
Variables에 다른 Docker 로그인 계정과 비번도 등록해서 사용하고 있다. REGISTRY_USER, REGISTRY_PASS가 이 샘플의 예이다. 계정이나 비번을 스크립트에 노출시키지 않기 위해서는 이 방법을 추천한다.