Jenkins, Amazon ECR, 그리고 Argo CD를 활용한 CI/CD 파이프라인 구성 방법과 아키텍처에 대해 상세히 설명해볼게.
CI/CD(Continuous Integration/Continuous Deployment)는 코드 변경 사항을 자동으로 빌드, 테스트, 배포하는 프로세스를 의미해.
이를 통해 개발 생산성을 높이고, 배포 속도를 개선하며, 신뢰성을 강화할 수 있어.
✅ 자동화된 배포 → 개발자가 배포를 직접 수행할 필요 없음
✅ 신속한 피드백 → 코드 변경이 즉시 빌드/테스트됨
✅ 일관된 환경 제공 → 컨테이너 기반 배포로 환경 차이 최소화
✅ GitOps 방식 적용 가능 → Git을 단일 소스로 활용하여 배포 이력을 체계적으로 관리
Jenkins, Amazon ECR, Argo CD를 활용한 CI/CD 아키텍처 구성은 다음과 같아.
개발자 → GitHub → Jenkins → ECR → ArgoCD → Kubernetes (EKS)
Jenkins (CI)
Amazon Elastic Container Registry (ECR)
Argo CD (CD)
Amazon Elastic Kubernetes Service (EKS)
각 단계별 구성 방법을 설명할게.
Jenkins를 설치하고 아래 플러그인을 추가해야 해.Jenkins가 ECR에 접근하려면 AWS 인증이 필요해.
AWS IAM Role을 생성하고 AmazonEC2ContainerRegistryFullAccess 정책을 추가함.aws configure를 통해 자격 증명을 설정함.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'
}
}
}
}
EKS 클러스터에 Argo CD를 설치해.
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
Argo CD에 접속하고 관리자 패스워드를 설정해.
kubectl port-forward svc/argocd-server -n argocd 8080:443
argocd login localhost:8080
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
이해가 잘 됐어? 추가로 궁금한 점 있으면 물어봐! 😊