Docker와 Gitlab CI를 활용한 빌드, 테스트 자동화

​ ​

Gitlab은 설치형 GitHub이라고 이해하시면 편합니다. 무료로 private repository와 CI 서버를 제공해줍니다. 심지어 Docker Registry도 무료로 제공하고 있습니다. 아직 많은 분들이 Gitlab CI의 여러 장점들을 잘 모르시는 것 같아 정리해보았습니다.

Gitlab CI

Gitlab CI는 Gitlab에서 무료로 제공하는 CI 툴 입니다. Gitlab과 완벽하게 연동되며 CI를 위해 CI linter, pipeline, cycle analytics 등 다양한 서비스를 제공합니다.

Gitlab-CI

travis, circle CI와 마찬가지로 Gitlab CI는 gitlab-ci.yml 파일로 설정할 수 있습니다. Gitlab은 DigitalOcean과 제휴하여 CI 서버(Runner)를 따로 제공합니다. 따라서 Runner에 job을 할당하여 돌아가도록 설정할 수 있습니다.

Gitlab-Pipe

그리고 Runner는 Docker 컨테이너 를 기반으로 돌아갑니다. Gitlab CI를 실행해보면 처음에 Ruby 이미지를 받아와서 컨테이너를 실행시키는 것을 볼 수 있습니다. 따라서, Base Image를 내 어플리케이션 이미지로 바꾸면 빌드 및 테스트 속도가 빠르게 향상됩니다.

Gitlab Registry

Gitlab-Registry

Docker 친화적인 Gitlab은 Docker Registry도 무료로 제공해줍니다. Gitlab Registry 탭에 들어가면 Docker Registry의 주소가 적혀있고 친절하게 명령어까지 써있습니다.

아마 많은 분들이 DockerHub를 결제하거나, AWS S3를 이용하여 Docker Registry를 구축하셨을 겁니다. 하지만 Gitlab에서는 그럴 필요가 없습니다.

Docker with Gitlab CI

gitlab-ci 설정파일은 대략 다음과 같습니다.

image: gitlab-registry
stages:
  - build
  - test
  - deploy

job-build:
  stage: build
  script:
  - pip install -r requirements.txt
  - python -m py_compile run.py

job-test:
  stage: test
  script:
  - pytest --pep8 -m pep8 backend/

job-deploy:
  stage: deploy
  script:
  - deployment

Gitlab CI와 Docker를 활용한 빌드 테스트 자동화는 위의 그림과 같이 이루어집니다.

CI

  1. 사용자가 Gitlab 저장소에 push를 하면, Gitlab CI Runner로 전달됩니다.
  2. Gitlab CI는 Gitlab Registry로부터 Docker 이미지를 받아옵니다. Docker 이미지에는 어플리케이션 환경이 설정되어 있습니다.
  3. Docker 컨테이너가 실행되면 첫번째 job에 정의된 대로 필요한 패키지를 설치하고 빌드를 수행합니다.
  4. 빌드가 통과되면 두번째 job에 정의된 대로 테스트를 수행합니다.
  5. 테스트가 통과되면 세번째 job에 정의된 대로 배포 과정을 수행합니다.
  6. 각 과정은 모두 Slack 알림으로 확인할 수 있습니다.

Gitlab

위와 같이 모든 과정을 Gitlab Pipeline을 통해 확인하실 수 있습니다.

Gitlab의 단점이라면 Community 버전의 서버가 조금 불안정하다는 점입니다. 물론 설치형 Gitlab을 사용하신다면 이런 단점마저 존재하지 않습니다. 소규모의 팀이라면 충분히 도입을 검토해볼만 하다고 생각합니다.

​ ​