GitLab CI, Jenkins, ArgoCD로 완성하는 완벽한 CI/CD 파이프라인 구축 가이드 (feat. 단계별 설정, 장단점 비교)

서론: DevOps 시대, CI/CD는 선택이 아닌 필수!

 

안녕하세요, 여러분! 개발자라면 누구나 한 번쯤 “배포”라는 단어 앞에서 고민해 본 경험이 있을 겁니다. 코드를 완성하고 나면, 이제 이 코드가 세상에 나올 수 있도록 만드는 과정이 남아있죠. 예전에는 이 과정이 수동적이고 번거로웠습니다. 코드를 빌드하고, 테스트하고, 서버에 접속해서 파일을 옮기고, 재부팅하는 일련의 작업들을 모두 직접 해야 했죠. 이 과정에서 실수라도 발생하면 밤샘 작업은 기본이고, 주말을 반납해야 하는 불상사도 흔했습니다.

하지만, 기술이 발전하면서 이제는 이런 번거로운 과정을 자동화하는 시대가 도래했습니다. 바로 **CI/CD(지속적 통합/지속적 배포)**라는 개념 덕분이죠. CI/CD는 개발자가 코드를 커밋하는 순간부터 빌드, 테스트, 배포까지의 모든 과정을 자동화하여 개발 생산성을 극대화하고, 오류를 줄이는 데 큰 도움을 줍니다. 그리고 오늘 우리가 다룰 GitLab CI, Jenkins, ArgoCD는 이 CI/CD 파이프라인을 구축하는 데 있어 가장 강력하고 인기 있는 조합 중 하나입니다.

이 글에서는 GitLab CI, Jenkins, ArgoCD를 활용하여 CI/CD 파이프라인을 구축하는 방법을 단계별로 상세하게 설명해 드릴 거예요. 또한, 각각의 장점과 단점을 비교하고, 현업에서 이 세 가지 도구를 어떻게 효율적으로 활용할 수 있는지에 대한 실질적인 팁까지 아낌없이 풀어놓겠습니다. 만약 여러분이 아직 CI/CD 파이프라인 구축에 막연한 두려움을 갖고 있거나, 더 효율적인 방법을 찾고 있다면 이 글이 큰 도움이 될 것입니다.


 

본론 1: CI/CD 파이프라인의 핵심, CI 도구 파헤치기 (GitLab CI vs. Jenkins)

 

CI/CD 파이프라인의 첫 단추는 바로 **CI(지속적 통합)**입니다. 개발자가 코드를 커밋하면, 자동으로 코드를 빌드하고, 테스트하고, 컨테이너 이미지를 만드는 과정이죠. 이 중요한 역할을 수행하는 두 가지 대표적인 도구, GitLab CIJenkins를 비교해 보겠습니다.

 

1-1. GitLab CI란 무엇인가?

 

GitLab CI는 GitLab에 내장된 CI/CD 서비스입니다. 별도의 젠킨스(Jenkins) 서버를 구축하거나 외부 서비스를 연동할 필요 없이, GitLab 하나만으로 코드 저장소 관리부터 CI/CD까지 모든 것을 해결할 수 있다는 것이 가장 큰 장점이죠. .gitlab-ci.yml이라는 간단한 YAML 파일을 통해 빌드, 테스트, 배포 스크립트를 정의하면, 코드가 푸시될 때마다 자동으로 파이프라인이 실행됩니다.

GitLab CI는 크게 세 가지 핵심 구성 요소로 이루어져 있습니다.

  • 파이프라인 (Pipeline): CI/CD의 전체적인 작업 흐름을 정의합니다. 여러 개의 스테이지와 잡(Job)으로 구성됩니다.
  • 스테이지 (Stage): 파이프라인 내에서 순차적으로 실행되는 논리적인 작업 그룹입니다. 예를 들어, build, test, deploy와 같은 스테이지를 정의할 수 있습니다.
  • 잡 (Job): 스테이지 내에서 병렬로 실행되는 실제 작업 단위입니다. 셸 스크립트나 커맨드를 실행하는 역할을 합니다.

 

1-2. Jenkins란 무엇인가?

 

Jenkins는 CI/CD 분야에서 가장 오랫동안 사용되어 온 오픈소스 자동화 서버입니다. 다양한 프로그래밍 언어와 소스 코드 관리 시스템을 지원하며, 수많은 플러그인을 통해 거의 모든 종류의 CI/CD 파이프라인을 구축할 수 있다는 것이 가장 큰 강점입니다. 흔히 ‘만능 툴’이라고 불릴 정도로, 그 유연성과 확장성은 타의 추종을 불허합니다.

Jenkins는 파이프라인을 정의하는 방식에 따라 크게 두 가지로 나눌 수 있습니다.

  • Freestyle Project: 웹 UI를 통해 빌드 단계를 직접 설정하는 방식입니다. 간단한 프로젝트에 적합합니다.
  • Jenkins Pipeline: Jenkinsfile이라는 스크립트 파일을 통해 파이프라인을 코드로 작성하는 방식입니다. 복잡한 파이프라인을 관리하기 용이하며, 버전 관리가 가능하다는 장점이 있습니다.

 

1-3. GitLab CI와 Jenkins, 무엇을 선택해야 할까?

 

구분 GitLab CI Jenkins
플랫폼 통합 GitLab에 완벽하게 통합 독립적인 서버로 구성
설정 방식 .gitlab-ci.yml 파일로 설정 웹 UI 또는 Jenkinsfile로 설정
유연성 상대적으로 낮음 (단일 프로젝트에 적합) 매우 높음 (플러그인으로 무한 확장 가능)
관리 편의성 GitLab 하나로 통합 관리 별도의 서버 및 플러그인 관리 필요
배우는 난이도 쉬움 (YAML 기반) 어려움 (UI, Pipeline 스크립트 등)
사용 사례 GitLab을 사용하는 모든 프로젝트 복잡하고 다양한 환경, 레거시 시스템

 

GitLab CI는 GitLab을 이미 사용하고 있다면 가장 쉽게 CI/CD를 시작할 수 있는 최적의 선택입니다. 별도의 인프라를 구축할 필요 없이 .gitlab-ci.yml 파일만 작성하면 되기 때문에 개발자들이 빠르게 적응할 수 있습니다. 반면, Jenkins는 복잡한 파이프라인, 다양한 환경, 혹은 레거시 시스템과의 연동이 필요한 경우에 빛을 발합니다. 방대한 플러그인 생태계 덕분에 어떤 요구사항이든 맞춤형으로 구현할 수 있죠.


 

본론 2: CD의 새로운 패러다임, ArgoCD 살펴보기

GitLab CI, Jenkins, ArgoCD로 완성하는 완벽한 CI/CD 파이프라인 구축 가이드 (feat. 단계별 설정, 장단점 비교) 2

이제 CI 과정을 통해 만들어진 Docker 이미지를 쿠버네티스 클러스터에 배포하는 CD(지속적 배포) 단계를 살펴보겠습니다. 이 역할을 담당하는 도구로 ArgoCD를 소개합니다.

 

2-1. ArgoCD란 무엇인가?

 

ArgoCD는 쿠버네티스(Kubernetes) 환경을 위한 선언적(Declarative) GitOps 기반의 지속적 배포(Continuous Deployment) 도구입니다. GitOps는 코드와 인프라의 상태를 Git 저장소에 선언적으로 정의하고, 이 상태를 실제 환경에 동기화하는 것을 핵심으로 합니다. 즉, ArgoCD는 Git 저장소에 정의된 애플리케이션의 상태(배포 정보, 버전 등)를 감시하고, 실제 쿠버네티스 클러스터의 상태와 일치하도록 자동으로 동기화하는 역할을 합니다.

기존의 푸시(Push) 기반 배포 방식은 CI 툴이 직접 쿠버네티스 클러스터에 접속하여 배포 명령을 실행하는 방식이었습니다. 하지만 ArgoCD는 풀(Pull) 기반 배포 방식을 사용합니다. ArgoCD가 직접 Git 저장소의 변경 사항을 감지하고, 클러스터 내부에서 배포를 진행하기 때문에 보안성이 뛰어나고, 배포 상태를 중앙에서 관리할 수 있다는 장점이 있습니다.

 

2-2. ArgoCD 설정, 단계별로 따라하기

 

이제 ArgoCD를 사용하여 GitLab CI 또는 Jenkins를 통해 빌드된 이미지를 쿠버네티스 클러스터에 배포하는 CD 파이프라인을 구축해 보겠습니다.

단계 1: 쿠버네티스 클러스터에 ArgoCD 설치

먼저, 여러분의 쿠버네티스 클러스터에 ArgoCD를 설치해야 합니다. 다음 명령어를 통해 간단하게 설치할 수 있습니다.

Bash

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

단계 2: GitOps 저장소 준비

ArgoCD는 Git 저장소에 정의된 배포 Manifest 파일을 기반으로 작동합니다. 따라서, 배포하려는 애플리케이션의 쿠버네티스 Manifest 파일들(Deployment, Service, Ingress 등)을 담을 별도의 Git 저장소를 준비해야 합니다. 이 저장소를 “GitOps 저장소“라고 부르겠습니다.

단계 3: ArgoCD에 애플리케이션 등록

ArgoCD UI에 접속하여 새로운 애플리케이션을 등록합니다.

  • Source: GitOps 저장소의 URL, 브랜치, Manifest 파일 경로를 설정합니다.
  • Destination: 배포할 쿠버네티스 클러스터와 네임스페이스를 지정합니다.
  • Sync Policy: Automatic으로 설정하여 Git 저장소의 변경 사항을 자동으로 클러스터에 동기화하도록 합니다.

단계 4: CI 도구와 ArgoCD 연동

이제 GitLab CI 또는 JenkinsArgoCD를 연결해야 합니다. CI 단계에서 Docker 이미지를 빌드하고 레지스트리에 푸시했다면, 이제 GitOps 저장소의 Manifest 파일 내 이미지 태그를 업데이트하는 잡을 추가해야 합니다.

  • GitLab CI의 경우: .gitlab-ci.yml 파일에 GitOps 저장소를 클론하고, sed 명령어를 통해 이미지 태그를 변경한 뒤 다시 푸시하는 deploy 잡을 추가합니다.
  • Jenkins의 경우: Jenkinsfile에 GitOps 저장소를 체크아웃하고, 스크립트(예: sh "sed -i...")를 통해 이미지 태그를 변경한 뒤 git push를 수행하는 단계를 추가합니다.

이렇게 GitOps 저장소에 변경 사항이 푸시되면, ArgoCD가 이를 감지하고 자동으로 새로운 버전의 애플리케이션을 쿠버네티스 클러스터에 배포하게 됩니다.

 

2-3. ArgoCD의 장점과 단점

 

  • 장점:
    • GitOps 기반: 배포 상태가 Git 저장소에 정의되므로, 단일 진실의 원천(Single Source of Truth) 역할을 합니다.
    • 보안성: 쿠버네티스 클러스터 내에서 배포를 진행하므로, 외부에서 클러스터에 접근할 필요가 없어 보안성이 뛰어납니다.
    • 상태 가시성: ArgoCD UI를 통해 배포 상태를 직관적으로 확인할 수 있으며, 동기화되지 않은 리소스를 쉽게 파악할 수 있습니다.
  • 단점:
    • 복잡성: GitOps 개념에 익숙하지 않으면 초기 설정이 다소 복잡하게 느껴질 수 있습니다.
    • 쿠버네티스 의존성: 쿠버네티스 환경에 특화된 도구이므로, 다른 환경에서는 사용하기 어렵습니다.

 

본론 3: CI/CD 파이프라인 구축 사례와 팁

 

 

3-1. GitLab CI + ArgoCD 조합

 

GitLab CI와 ArgoCD는 CI/CD 파이프라인을 구축하는 가장 현대적이고 효율적인 조합 중 하나입니다.

  • CI 단계: GitLab CI가 코드 커밋을 감지하여 빌드, 테스트를 수행하고 Docker 이미지를 생성, 컨테이너 레지스트리에 푸시합니다.
  • CD 단계: GitLab CI의 마지막 잡에서 GitOps 저장소의 Manifest 파일에 있는 이미지 태그를 최신 버전으로 업데이트하여 푸시합니다. ArgoCD는 이 변경을 감지하여 자동으로 쿠버네티스 클러스터에 배포합니다.

이 조합은 CI/CD의 각 단계를 명확하게 분리하고, GitOps 원칙을 준수하여 안정성과 보안성을 극대화할 수 있습니다.

 

3-2. Jenkins + ArgoCD 조합

 

기존에 Jenkins를 사용하고 있거나, 복잡한 파이프라인이 필요한 경우에는 이 조합이 유용합니다.

  • CI 단계: Jenkins 파이프라인에서 복잡한 빌드, 테스트, 보안 검사 등을 수행하고 Docker 이미지를 생성, 컨테이너 레지스트리에 푸시합니다.
  • CD 단계: Jenkins 파이프라인의 마지막 단계에서 GitOps 저장소의 이미지 태그를 업데이트하여 푸시합니다. ArgoCD는 이 변경을 감지하고 자동으로 쿠버네티스에 배포합니다.

이 조합은 Jenkins의 유연성을 활용하여 CI 단계를 세밀하게 제어하면서, ArgoCD의 안정적인 GitOps 배포를 동시에 누릴 수 있는 장점이 있습니다.

 

FAQ: 자주 묻는 질문

 

Q1. Jenkins는 너무 복잡한데, 꼭 사용해야 하나요?

A1. 아닙니다. 간단한 웹 서비스나 마이크로서비스 아키텍처라면 GitLab CI만으로도 충분히 강력한 CI 파이프라인을 구축할 수 있습니다. Jenkins는 복잡한 의존성 관리, 다양한 테스트 환경, 레거시 시스템 연동 등 특수한 요구사항이 있을 때 고려해 볼 만한 선택지입니다.

Q2. GitLab CI와 Jenkins, 어떤 것을 먼저 배워야 할까요?

A2. 만약 GitLab을 사용하고 있다면 GitLab CI를 먼저 배우는 것을 추천합니다. 이미 익숙한 환경에서 CI/CD 개념을 자연스럽게 익힐 수 있습니다. 이후에 더 복잡한 파이프라인이 필요할 때 Jenkins를 학습하는 것이 효율적입니다.

Q3. ArgoCD를 사용하면 수동 배포는 아예 불가능한가요?

A3. 그렇지 않습니다. ArgoCD는 수동 동기화(Manual Sync) 기능을 지원합니다. auto-sync 기능을 꺼두거나, 필요에 따라 특정 버전으로 롤백하거나 수동으로 동기화를 트리거할 수 있습니다.


 

결론: GitLab CI, Jenkins, ArgoCD로 미래의 개발 환경을 구축하자!

 

지금까지 GitLab CI, Jenkins, ArgoCD를 활용한 CI/CD 파이프라인 구축 방법에 대해 깊이 있게 살펴보았습니다. 이 세 가지 도구는 각각 CI와 CD라는 명확한 역할을 수행하며 시너지를 발휘하는 최적의 조합입니다.

GitLab CI는 CI 과정의 자동화를 통해 개발자가 코딩에만 집중할 수 있도록 돕고, Jenkins는 높은 유연성으로 어떤 복잡한 요구사항도 충족할 수 있게 해줍니다. 그리고 ArgoCD는 GitOps 기반의 안정적인 배포를 통해 운영의 안정성을 극대화합니다. 이 도구들의 조합은 단순히 배포를 자동화하는 것을 넘어, 팀의 협업 방식을 개선하고, 개발과 운영의 경계를 허무는 DevOps 문화의 핵심을 이룹니다.

이 글을 통해 여러분의 프로젝트에 최적의 CI/CD 파이프라인을 구축하는 데 성공하시기를 바랍니다. 더 나아가, 지속적인 배포를 통해 더 빠르고, 더 안정적인 서비스를 제공하는 개발자로 성장하는 계기가 되기를 진심으로 응원합니다!