개발 환경을 나누는 이유는 실제 운영중인 서비스에 장애가 되면 안되기 때문임.
Git Flow
[main]
프로덕션 서버
[staging]
Staging Server
[dev]
Dev Server
[feautre/기능 이름]
서버에 코드를 보내는 것과
반복적으로 진행할 Test를 어떻게 실행하는 방법은?
Dev Branch에 Merge되면 => Local에서 Git Pull & Test 실행 후 코드 배포(FTP, SCP로 파일 전송)
=> 매우 번거로운 일!
그래서 나온 것이 CI/CD
소프트웨어 Workflow 자동화를 도와주는 도구
배포
파이썬, 쉘 스크립트 실행
Github Tag, Release 자동으로 설정
그 외에도 다양한 Workflow를 만들 수 있음
사용자가 만들어서 Workflow 템플릿을 공유하기도 한다.
원하는 기능이 있는 경우 <기능> github action 등으로 검색!
Action Marketplace : https://github.com/marketplace?type=actions
Awesome Github Action : https://github.com/sdras/awesome-actions
단 , Github Action에는 다음의 제약이 있음
- 하나의 Github Repository 당 Workflow는 최대 20개까지만 가능
- Workflow에 존재하는 Job(실행)은 최대 6시간 실행할 수 있으며, 초과시 자동으로 중지됨
- 동시에 실행할 수 있는 Job 제한 존재
Workflow
Event
Job
Step
Action
Runner
# Functions: GitHub Actions work-flow 파일로써, 코드 품질 검사를 자동화하는 설정을 포함하고 있음.
# 본 work-flow의 이름으로써 본 워크플로우 이름을 "check-lint"로 지정함.
name: check-lint
# 본 work-flow는 pull-request가 생성될 때마다 실행됨(본 파일의 목적인 코드 품질 검사를 실행)
on: [pull_request]
# 이하는 작업의 구성 요소를 의미
jobs:
check-lint: # 작업 이름
runs-on: ubuntu-latest # 이 작업은 최신 Ubuntu 환경에서 실행될 것임.
steps: # 작업에서 수행할 단계를 정의함
- name: Checkout code # 첫번째로 실행되는 step
uses: actions/checkout@v4 # actions/setup-python@v4을 사용하여 저장소의 코드를 체크아웃함
# 무슨말이냐면 현재 이 work-flow가 정의된 저장소를 `$GITHUB_WORKSPACE` 디렉토리로 클론한 후에
# 발생되는 이벤트(본 work-flow의 경우 pull-request)에 따라 해당 커밋을 `$GITHUB_WORKSPACE` 디렉토리에서 checkout 함
# Q. 왜 그렇게 해주나요?
# => 아니 코드를 VM으로 가져와야 아래 step들에 해당하는 내용들을 체크하지요..?
# GitHub Actions의 runner는 기본적으로 비어 있어서, 워크플로우에서 코드를 사용할 수 있도록 `actions/checkout`이 필요한 것!
# Q. 왜 하나요?
# => 단순히 로컬에서 push 해버리고 끝! 이게 아니라, CI/CD 파이프라인에서 테스트 및 기타 작업을 하기 위해서 위 단계가 필수적으로 필요한 것.
# code-lint, test, build 등의 자동화 작업에서는 runner 환경에 코드가 존재해야하므로, actions/checkout은 핵심적인 역할을 함.
- name: Set up Python 3.11 # 두번째로 실행되는 step
uses: actions/setup-python@v5 # actions/setup-python@v5을 사용하여 python 버전 확인
with: # 이때 Python 버전은 3.11로 지정
python-version: "3.11"
- name: Install dependencies # 세번째로 실행되는 step: 명령어 실행
run: | # '|'은 멀티라인 문자열로써, run 키워드 다음에 오는 명령어를 여러줄로 작성 가능하게 해줌
python3 -m pip install --upgrade pip
- name: Check Lint # 네번째로 실행되는 step: 명령어 실행
run: |
make quality
배포하기 전에 모델 이미지도 준비해서 모델도 같이 업데이트 하려면!
Docekr Image Registry란?
Docker Image Build
태그 설정
이미지 Push
먼저 GCP에서 artifacts에 들어가서 CREATE REPOSITORY 클릭하고
(Project ID 꼭 확인)
이름 지정한 후에 Format은 Docker로 정의
로컬에서 Docker Image Build
(-t를 통하여 model_deploy:test로 설정)
이제 태그설정을 해야함
docker tag "기존 이미지:태그""새이미지 이름:태그"
새 이미지 이름은 Google Cloud의 Artifact Registry URL
boostcamp-ai-tech-serving은 각자의 Project ID로 변경
docker tag model_deploy:test asia-northeast3-docker.pkg.dev/boostcamp-ai-tech-serving/model-deploy/v1:latest
이제는 푸시를 해주면 된다.
docker push asia-northeast3-docker.pkg.dev/boostcamp-ai-tech-serving/model-deploy/v1:latest
웹 콘솔에서 확인하면 Repository에 올라간 것을 확인할 수 있음
올라간 Docker Image를 Pull하고 싶다면
docker pull asia-northeast3-docker.pkg.dev/boostcamp-ai-tech-serving/model-deploy/v1:latest
예들들면, main에 Merge되면 Docker Image를 새로 만들고, Registry에 Push하는 것
이 작업을 하기 위해 Google Cloud Service Account 설정

여기 Secrets에는 뭘 저장하나요..?
- 서비스 계정 클릭 후 만든 다음
- 생성된 json파일 전체 경로를 넣고 이름 지정하면 됨.
1. Google Cloud Console에서 서비스 계정 생성
2. 서비스 계정 세부 정보 입력
3. 권한 설정
1. Github Secrets 설정
GCP_SA_KEY로 설정.github/workflows/docker-build.yml 생성:
name: Build and Push Docker Image
on:
push:
branches:
- main
env:
REGISTRY: gcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Auth to Google Cloud
uses: google-github-actions/auth@v1
with:
credentials_json: ${{ secrets.GCP_SA_KEY }}
- name: Set up Cloud SDK
uses: google-github-actions/setup-gcloud@v1
- name: Configure Docker
run: gcloud auth configure-docker
- name: Build and Push
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
이 설정을 통해 main 브랜치에 코드가 머지될 때마다 자동으로 새로운 Docker 이미지가 빌드되고 GCR에 푸시됨.
GCP에서 VM 만들 때 내가 위에서 빌드한 컨테이너 이미지를 사용할 수 있음
볼륨마운트도 가능
인스턴스를 띄울 때 Docker Image 기반으로 생성하면, 이후 나온 Image를 기반으로 Container 업데이트가 가능하다.
만약 그냥 서버를 띄웠다면, 새로운 코드를 서버에 전송하고, 그 코드를 기반으로 앱을 재실행(reload 옵션 등이 있으면 설정)
Compute Engine은 이미지로 만들어진 인스턴스를 빠르게 업데이트 할 수 있는 기능을 CLI로 제공한다.
gcloud compute instances update-container <서버이름>-container-image <컨테이너 이미지>
needs 필드를 통해 CI 작업이 정상 완료 되어야 실행