
CI : Continuous Integration → 지속적 통합
CD: Continuous Delivery / Deployment → 지속적 제공/배포
전체적인 파이프라인
1. 개발자가 작은 단위로 코드를 짜고, 메인 레포지토리에 merge를 진행
2. 자동으로 빌드(소스코드 파일을 실행할 수 있는 독립적인 형태로 변환하는 과정과 결과) ⇒ docker build
3. 자동으로 테스트(테스트 컨테이너 활용, 통합 테스트 실행 가능)
4. 릴리즈 ⇒ docker push image, Docker image를 레지스트리에 푸시함
5. 배포 ⇒ docker image 기반 kubernetes로 배포
특정 레포지토리에 merge되는 순간 이러한 파이프라인 순서대로 실행해주는 관리 체계
⇒ work flow 자동화 툴
⇒ ex) github actions, gitlab CI
workflow
자동화된 전체 프로세스. 하나 이상의 Job으로 구성되고, Event에 의해 예약되거나 트리거될 수 있는 자동화된 절차
YAML으로 작성되고, Github Repository의 .github/workflows 아래에 저장
Github에게 YAML 파일로 정의한 자동화 동작을 전달하면, Github Actions는 해당 파일을 기반으로 그대로 실행
event
Workflow를 트리거하는 특정 활동이나 규칙
job
여러 Step으로 구성됨. 단일 가상 환경에서 실행
다른 Job에 의존 관계를 가질 수도 있고, 독립적으로 병렬 실행
step
Job 안에서 순차적으로 실행되는 프로세스 단위
step에서 명령을 내리거나, action을 실행 가능

action
깃허브에서 미리 정의해둔 작업으로, step에서 정의하여 사용

공개적으로 오픈된 마켓플레이스에서 액션들 사용 가능
runner
job을 실행시키는 주체, 각 job들은 독립적인 runner에서 실행
runner는 VM 머신 또는 컨테이너로 생각하면 됨

name: CI/CD for Express
on:
push:
branches:
- main
jobs:
build-and-deploy:
runs-on: ubuntu-latest
env:
IMAGE_NAME: username/repository-name
steps:
# 1. 코드 체크아웃
- name: Checkout code
uses: actions/checkout@v3
# 2. Docker 로그인 FOR 릴리즈
- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# 3. Docker 이미지 빌드 및 푸시
- name: Build and Push Docker Image
run: |
docker build -t $IMAGE_NAME:${{ github.sha }} .
docker tag $IMAGE_NAME:${{ github.sha }} $IMAGE_NAME:latest
docker push $IMAGE_NAME:${{ github.sha }}
docker push $IMAGE_NAME:latest
stages:
- build
- deploy
variables:
DOCKER_REGISTRY: registry.gitlab.com
IMAGE: $DOCKER_REGISTRY/$CI_PROJECT_PATH
build:
stage: build
script:
- docker build -t $IMAGE:$CI_COMMIT_SHORT_SHA .
- docker push $IMAGE:$CI_COMMIT_SHORT_SHA
only:
- main
deploy:
stage: deploy
script:
- docker pull $IMAGE:$CI_COMMIT_SHORT_SHA
- docker run -d -p 3000:3000 $IMAGE:$CI_COMMIT_SHORT_SHA
only:
- main

CI는 동일한 과정으로 진행 → CD에 대한 다양한 고민
1. 순서형 배포 파이프라인
DevOps 전략
# 4. Kubernetes 배포
- name: Set up kubectl
run: |
echo "${{ secrets.KUBECONFIG_CONTENT }}" > kubeconfig
export KUBECONFIG=$PWD/kubeconfig
- name: Deploy to Kubernetes
run: |
kubectl apply -f k8s/deployment.yaml
kubectl apply -f k8s/service.yaml

2. 선언형 배포 파이프라인
GitOps 전략
CI와 CD의 분리, 배포에 필요한 파일들은 다른 레포지토리로 분리 진행
선언형은 현재 상태에 상관없이 배포되길 원하는 최종 상태로 기술하면 알아서 배포를 진행
시스템 구성 정보를 기록하고 관리함으로써 변경 이력 추적, 롤백, 감사 등이 모두 가능
CD가 발생하는 시점에 자동으로 변경 이력을 확인하고 CD 과정을 진행함 ⇒ ArgoCD의 도움!

https://velog.io/@choiyoorim/GitOps%EC%99%80-ArgoCD
통합테스트를 진행하기 위한 도구
통합 테스트 : 서로 다른 부분들이 원활하게 작동하는지 확인하기 위해 여러 모듈을 같이 테스트하는 과정
다른 단계의 테스트와는 달리 어려운 점 존재
⇒ 내가 제어하여 테스트 코드를 작성할 수 있는 부분과 달리 외부 모듈은 테스트 코드로 관리할 수 없기 때문에
이러한 어려운 통합 테스트를 진행하는 것을 지원하기 위해 개발된 오픈소스 라이브러리
⇒ 도커 컨테이너를 활용하여 외부 의존성들을 포함한 테스트 환경을 구축하고 관리하는 것을 간편하게 해줌
⇒ 테스트 컨테이너란 코드로 도커 컨테이너를 제어하여 통합 테스트를 도와주는 라이브러리
⇒ 로컬에 설치된 도커데몬과 연동되어 테스트 코드가 실행되기 전 코드를 통해 해당 테스트를 위한 일회성 컨테이너를 생성
⇒ 테스트 수행 후 컨테이너를 삭제
참고자료)
https://velog.io/@suhongkim98/Testcontainers를-활용하여-통합테스트-환경-구축하기
https://jh-labs.tistory.com/416
https://velog.io/@ggong/Github-Action에-대한-소개와-사용법
https://llshl.tistory.com/50