CI/CD 파이프라인 With Docker

스우·2024년 12월 11일

DevOps

목록 보기
2/2

CI/CD 파이프라인

CI : Continuous Integration → 지속적 통합

  • 개발자들은 최대한 작은 단위로 만들어서 개발해가며 빈번하게 merge 해야 함
  • 애플리케이션들의 빌드, 테스트, 병합하는 과정을 주기적으로 자동화시켜야 함

CD: Continuous Delivery / Deployment → 지속적 제공/배포

  • CI를 통해서 빌드, 테스트가 완료되어 배포될 준비가 끝난 애플리케이션을 개발자가 수동으로 혹은 자동으로 배포를 진행하는 것
  • 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

Github Actions 개념

workflow

자동화된 전체 프로세스. 하나 이상의 Job으로 구성되고, Event에 의해 예약되거나 트리거될 수 있는 자동화된 절차

YAML으로 작성되고, Github Repository의 .github/workflows 아래에 저장

Github에게 YAML 파일로 정의한 자동화 동작을 전달하면, Github Actions는 해당 파일을 기반으로 그대로 실행

event

Workflow를 트리거하는 특정 활동이나 규칙

  • 커밋을 레포지토리에 푸시
  • 풀 요청 생성 …etc

job

여러 Step으로 구성됨. 단일 가상 환경에서 실행

다른 Job에 의존 관계를 가질 수도 있고, 독립적으로 병렬 실행

step

Job 안에서 순차적으로 실행되는 프로세스 단위

step에서 명령을 내리거나, action을 실행 가능

action

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

공개적으로 오픈된 마켓플레이스에서 액션들 사용 가능

runner

job을 실행시키는 주체, 각 job들은 독립적인 runner에서 실행

runner는 VM 머신 또는 컨테이너로 생각하면 됨

Github Actions와 Docker 연동

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

Gitlab CI와 Docker 연동

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

공통 흐름

  1. 코드 변경 사항 감지
  2. Docker 이미지 빌드
  3. Docker 이미지 푸시
  4. 컨테이너 실행 및 테스트
  5. 배포

빌드 시 이미지 자동 생성 및 Push 전략

배포 자동화 파이프라인 설계

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

테스트 컨테이너(Test Containers)

통합테스트를 진행하기 위한 도구

통합 테스트 : 서로 다른 부분들이 원활하게 작동하는지 확인하기 위해 여러 모듈을 같이 테스트하는 과정

다른 단계의 테스트와는 달리 어려운 점 존재

⇒ 내가 제어하여 테스트 코드를 작성할 수 있는 부분과 달리 외부 모듈은 테스트 코드로 관리할 수 없기 때문에

이러한 어려운 통합 테스트를 진행하는 것을 지원하기 위해 개발된 오픈소스 라이브러리

⇒ 도커 컨테이너를 활용하여 외부 의존성들을 포함한 테스트 환경을 구축하고 관리하는 것을 간편하게 해줌

⇒ 테스트 컨테이너란 코드로 도커 컨테이너를 제어하여 통합 테스트를 도와주는 라이브러리

⇒ 로컬에 설치된 도커데몬과 연동되어 테스트 코드가 실행되기 전 코드를 통해 해당 테스트를 위한 일회성 컨테이너를 생성

⇒ 테스트 수행 후 컨테이너를 삭제

참고자료)
https://velog.io/@suhongkim98/Testcontainers를-활용하여-통합테스트-환경-구축하기
https://jh-labs.tistory.com/416
https://velog.io/@ggong/Github-Action에-대한-소개와-사용법
https://llshl.tistory.com/50

0개의 댓글