CI/CD 사용법 및 이유

이eun·2025년 3월 19일

Jenkins, Amazon ECR, 그리고 Argo CD를 활용한 CI/CD 파이프라인 구성 방법과 아키텍처에 대해 상세히 설명해볼게.


1. CI/CD 개요 및 도입 이유

CI/CD(Continuous Integration/Continuous Deployment)는 코드 변경 사항을 자동으로 빌드, 테스트, 배포하는 프로세스를 의미해.
이를 통해 개발 생산성을 높이고, 배포 속도를 개선하며, 신뢰성을 강화할 수 있어.

  • CI(Continuous Integration): 코드 변경 사항이 푸시될 때마다 자동으로 빌드 및 테스트가 수행됨.
  • CD(Continuous Deployment/Delivery): 테스트를 통과한 애플리케이션이 자동으로 배포됨.

도입 시 기대 효과

자동화된 배포 → 개발자가 배포를 직접 수행할 필요 없음
신속한 피드백 → 코드 변경이 즉시 빌드/테스트됨
일관된 환경 제공 → 컨테이너 기반 배포로 환경 차이 최소화
GitOps 방식 적용 가능 → Git을 단일 소스로 활용하여 배포 이력을 체계적으로 관리


2. 아키텍처 설계

Jenkins, Amazon ECR, Argo CD를 활용한 CI/CD 아키텍처 구성은 다음과 같아.

🔹 아키텍처 다이어그램

개발자 → GitHub → Jenkins → ECR → ArgoCD → Kubernetes (EKS)

🔹 주요 컴포넌트

  1. Jenkins (CI)

    • 코드 변경이 감지되면 빌드, 테스트, Docker 이미지 생성 및 Amazon ECR에 푸시함.
  2. Amazon Elastic Container Registry (ECR)

    • Docker 이미지를 저장하는 AWS의 컨테이너 이미지 레지스트리.
  3. Argo CD (CD)

    • GitOps 기반으로 애플리케이션을 Kubernetes(EKS)에 배포하는 도구.
    • 선언형 배포를 지원하여 Git의 변경 사항을 자동으로 동기화함.
  4. Amazon Elastic Kubernetes Service (EKS)

    • 컨테이너 기반 애플리케이션을 실행하는 관리형 Kubernetes 서비스.

3. CI/CD 파이프라인 구축 방법

각 단계별 구성 방법을 설명할게.


🔹 1단계: Jenkins (CI) 설정

(1) Jenkins 설치 및 플러그인 설정

  • Jenkins를 설치하고 아래 플러그인을 추가해야 해.
    • Git Plugin: Git 저장소에서 코드 변경 사항을 가져옴.
    • Pipeline Plugin: Jenkins 파이프라인을 스크립트로 정의할 수 있음.
    • Docker Pipeline Plugin: Docker 이미지를 빌드하고 관리함.
    • Amazon ECR Plugin: AWS ECR에 Docker 이미지를 푸시할 수 있음.

(2) AWS 자격 증명 설정

Jenkins가 ECR에 접근하려면 AWS 인증이 필요해.

  • AWS IAM Role을 생성하고 AmazonEC2ContainerRegistryFullAccess 정책을 추가함.
  • Jenkins 서버에 AWS CLI를 설치하고 aws configure를 통해 자격 증명을 설정함.

(3) Jenkins Pipeline Script 작성

Jenkinsfile을 작성하여 CI 파이프라인을 정의해.

pipeline {
    agent any
    environment {
        AWS_REGION = "ap-northeast-2"
        ECR_REGISTRY = "123456789012.dkr.ecr.ap-northeast-2.amazonaws.com"
        ECR_REPOSITORY = "my-app"
        IMAGE_TAG = "latest"
    }
    stages {
        stage('Checkout Code') {
            steps {
                git 'https://github.com/my-repo.git'
            }
        }
        stage('Build Docker Image') {
            steps {
                sh 'docker build -t $ECR_REPOSITORY:$IMAGE_TAG .'
            }
        }
        stage('Login to ECR') {
            steps {
                sh 'aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $ECR_REGISTRY'
            }
        }
        stage('Push Image to ECR') {
            steps {
                sh 'docker tag $ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG'
                sh 'docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG'
            }
        }
    }
}

🔹 2단계: Argo CD (CD) 설정

(1) Argo CD 설치

EKS 클러스터에 Argo CD를 설치해.

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

(2) Argo CD 로그인

Argo CD에 접속하고 관리자 패스워드를 설정해.

kubectl port-forward svc/argocd-server -n argocd 8080:443
argocd login localhost:8080

(3) GitOps 방식으로 배포 자동화

Argo CD는 Git 저장소를 모니터링하고, 변경 사항이 발생하면 EKS에 자동 배포함.
아래 Application 리소스를 정의해서 Argo CD가 배포를 관리하도록 설정해.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: 'https://github.com/my-org/k8s-manifests.git'
    targetRevision: main
    path: my-app
  destination:
    server: https://kubernetes.default.svc
    namespace: my-app
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
  • repoURL: Kubernetes 배포 매니페스트를 관리하는 Git 저장소
  • syncPolicy.automated.prune: 불필요한 리소스 삭제 여부
  • syncPolicy.automated.selfHeal: 변경 사항 자동 반영

4. CI/CD 파이프라인 작동 과정

🔹 코드 변경 → 빌드 → 배포

  1. 개발자가 GitHub에 코드 푸시
  2. Jenkins가 변경 사항 감지
    • 코드를 빌드하고 Docker 이미지를 생성
    • Amazon ECR에 Docker 이미지를 푸시
  3. Argo CD가 Git 저장소의 Kubernetes 매니페스트를 감시
    • 새로운 컨테이너 이미지 태그가 감지되면 자동으로 업데이트
  4. EKS에 새로운 버전 배포 완료

5. Argo CD 도입의 장점

  • GitOps 방식 지원 → Git에서 모든 변경 사항을 추적 가능
  • 자동화된 배포 → Git 변경 시 자동으로 Kubernetes에 배포됨
  • 배포 이력 관리 → Git 커밋을 기준으로 롤백 가능
  • Self-Healing → Kubernetes 리소스가 손상되면 자동으로 복구

6. 결론

  • Jenkins는 코드 변경을 감지하고 Docker 이미지를 빌드 및 푸시하는 역할을 함.
  • Amazon ECR은 컨테이너 이미지를 저장하는 역할을 함.
  • Argo CD는 GitOps 방식으로 Kubernetes 클러스터에 배포를 자동화함.
  • 이 조합을 사용하면 안정적이고 자동화된 CI/CD 파이프라인을 구축할 수 있어.

이해가 잘 됐어? 추가로 궁금한 점 있으면 물어봐! 😊

0개의 댓글