GCP에서의 CI/CD 파이프라인 구축

2021. 6. 29. 20:31Cloud

현재 진행중인 프로젝트에서 GCP에 구축한 CI/CD 파이프라인에 대해서 간단히 소개하고자 한다. GCP에서는 CI/CD 파이프라인을 구축할 수 있도록 몇가지 서비스를 제공하고 있다. 자체적인 스크립트 작성은 최소화하면서 최대한 GCP의 서비스들을 이용하는 방향으로 CI/CD 파이프라인을 구축했다. 현재 운영중인 서비스의 특징은 다음과 같다.

 

  • API 서버는 사내 AI 서비스를 사용하고자 하는 유저들에게 API 를 제공하고 있다. 유저들은 이 API를 사용하여 자신의 데이터로 Data preprocessing, Training, Inference 등을 할 수 있다. 또한 이 API 서버는 특정 어플리케이션에도 바인딩 되어 서비스를 하는 등 활용범위가 매우 넓다.
  • API 서버는 Fast API 라는 Python 프레임워크를 이용한 마이크로 서비스이며, 도커라이징하여 배포한다. (현재 우리 팀에서 운영하는 대부분의 서비스는 도커라이징 하여 쿠버네티스 또는 Docker-compose 로 서비스중이다)
  • API 서버 개발자가 소스코드의 특정 브랜치에 소스코드를 Push 할 경우 GCP의 CI/CD 서비스를 거쳐서 자동으로 빌드되고 배포될 수 있는 파이프라인이 구축되어 있다. 따라서 API 서버 개발자는 단순히 소스코드를 Push 하기만 하면 되고, Push 직후 약5~10분내로 배포가 완료된다.

 

 

CI/CD 파이프라인 Overview

  1. 클라이언트 PC (API 서버 개발자 PC): 개발자는 로컬에서 API의 개발, 테스트가 끝나면 GCP의 Cloud Source Repositories 의 배포용 Branch에 소스코드를 Push 한다. 소스코드를 Push 하기 위해서는 Cloud Source Repositories 에 클라이언트 PC의 SSH Key 가 등록이 되어 있어야 한다.
  2. Cloud Source Repositories: Cloud Source Repositories 는 Github 과 같은 소스코드 저장소이며, git 을 베이스로 하기 때문에 사실상 Private한 Git 저장소와 같다고 보면 된다.
  3. Cloud Build: Cloud Source Repositories 내의 특정 Repository 의 특정 Branch에 소스코드가 Push 될 경우를 감지하여 특정 액션을 취할 수 있는 Trigger를 만들 수 있다. 우리 프로젝트에서는 소스코드 내의 Dockerfile를 기반으로 소스코드를 도커라이징하고 Container Registry 로 이미지를 Push하는 액션을 하는 트리거를 만들어 두었다. 간단한 액션의 경우에는 스크립트를 만들지 않고 간단하게 Console 상에서도 액션을 구성할 수도 있고, 복잡한 액션인 경우에는 cloudbuild.yaml 과 같이 YAML 파일을 만들어서 액션을 구체화 할 수도 있다. 생각보다 상당히 유연한 기능을 제공함에도 불구하고 사용법 역시 간단해서 GCP로 CI/CD 파이프라인을 구성하는 분들께는 강력 추천하고 싶다. 조만간 Cloud Build 에 대해서도 자세히 다뤄볼까 한다.
  4. Container Registry: GCP 내의 Private Container Registry 이다. Cloud Build가 소스코드를 빌드하여 이곳으로 빌드된 이미지를 Push 한다.
  5. Shell Script (Registry Watcher):  API 서버 도커 이미지가 새롭게 Push 되었는지를 감지하는 Shell script 이다. crontab 으로 5분에 한번씩 Container Registry 를 체크하도록 구성했다.
  6. Docker Container (API Server): 도커라이징 된 API 서버이다. 특정 포트를 통해 유저에게 API 서버를 제공한다.

 

앞으로 해야 할 것

  • CI/CD 파이프라인 내에 테스트 과정을 녹여내야 한다. 지금은 개발자가 각자 테스트를 거쳐 문제가 없을 경우 배포용 Branch로 배포를 하게 하도록 하고 있지만, 배포의 정확성과 안전을 위해서 테스트 과정을 넣어, 배포용 Branch에 코드를 Push 해도 서비스에 문제가 생길경우에는 배포가 되지 않도록 하는 장치가 필요하다.
  • Registry Watcher (Shell Script) 도 GCP 내의 서비스로 대체할 수 없을까? 한번 찾아보니 Cloud Build 내에서 GCE에 에 한번에 배포까지 가능하도록 YAML 파일을 구성할 수 있는 것 같았다. 하지만 Container Registry를 체크하는 스크립트를 만드는 것도 크게 어렵지 않았고 일단 스크립트로 운영해도 크게 문제가 없을 것으로 판단해 Crontab 스크립트로 운영하고 있다. 하지만 좀 더 세련되게 GCP를 쓰기 위해서 이부분도 Cloud Build 또는 다른 서비스로 대체할 수 있도록 계속 공부해봐야 겠다.