소스 변경부터 배포 전후 작업까지 연결하는 자동화 플랫폼
정해진 절차를 서버에서 일관되게 자동 실행
역할
CI 실행 엔진
CI 자동화 ex)
- GitHub에 코드 push
- Jenkins가 변경 감지
- 저장소에서 코드 가져옴
- 빌드 수행
- 테스트 수행
- 결과 저장 및 성공/실패 표시
CD 파이프라인 제어 도구
ex)
- Docker 이미지 생성
- 레지스트리 업로드
- 원격 서버에 배포 스크립트 실행
- Kubernetes 배포 명령 실행
- Helm 배포 수행
오케스트레이션 서버
오케스트레이션 역할 → 여러 단계 순서대로 실행 / 조건에 따라 분기
ex)
- Build 성공 시에만 Test 실행
- Test 성공 시에만 Docker Build 실행
- main 브랜치일 때만 Release Job 실행
- 운영 배포 전 승인 단계 대기
→ 절차를 정의하고 제어하는 엔진
특징
-
오픈소스 기반
- 자유롭게 설치 및 확장 가능
-
Plugin 기반 확장성
- 다양한 플러그인 추가 가능
- GitHub 연동
- Docker 연동
- Kubernetes 연동
- Slack 알림
- Maven / Gradle 지원
- 테스트 리포트 표시
- 인증 연동
- 보안 스캔 연동
- 조직 환경에 맞게 확장
- 다양한 플러그인 추가 가능
-
파이프라인 코드화 (Pipeline as Code)
Jenkinsfile을 저장소에 배치 → 파이프라인 자체를 코드처럼 관리- 장점
- 파이프라인 변경 이력이 Git에 남음
- 코드와 파이프라인 정의를 함께 관리 가능
- 리뷰와 버전 관리 쉬움
- 환경 재현성 높음
- 파이프라인 정의 자체를 코드로 다루는 방식
-
분산 실행 가능
- 필요 시 여러 노드에 작업 분산하여 실행 가능
아키텍처
Jenkins → Controller / Agend 구조
Controller
Jenkins의 중심 서버
역할
- Jenkins 웹 UI 제공
- Job / Pipeline 설정 저장
- 빌드 요청 수신
- 실행 스케줄 관리
- Agent에 작업 할당
- 플러그인 관리
- 사용자 및 권한 관리
- 빌드 결과 기록 → Jenkins의 메인 제어
Agent
실제 작업 수행하는 실행 노드
역할
- Git clone
- Maven build
- npm install
- Docker build
- Test 실행
- 스크립트 실행행
Controller / Agent 분리 목적
-
부하 분산
- build & test → CPU, Memory, Disk I/O 사용량 높음
- 전부 Controller 에서 수행 시 Jenkins 느려짐
-
실행 환경 분리
- 프로젝트 특성에 맞는 실행 환경 사용 가능
-
보안 분리
- 빌드 실행 노드 분리 → 격리 효과
-
확장성
- 빌드 양 많을 시 → Agent 늘림
Controller / Agent 구조
동작 흐름
개발자 코드 변경
↓
Git 저장소 이벤트 발생
↓
Jenkins Controller가 Job 트리거
↓
Controller가 실행 가능한 Agent 선택
↓
Agent가 작업 디렉터리 생성 후 소스코드 다운로드
↓
빌드 / 테스트 / 배포 명령 수행
↓
실행 결과를 Controller에 전달
↓
Controller가 UI와 로그에 결과 표시
Workspace
Jenkins가 작업을 실행하는 특정 디렉터리
보통
- 소스코드 다운로드
- 의존성 설치
- 빌드 산출물 생성
- 테스트 결과 파일 생성
Executor
Jenkins Agent의 동시 실행 단위
if) Agent 1개에 Executor 2개 → 동시 2 개 Job 가능
병렬성이 중요 / But, 동시에 실행 가능한 범위는 인프라 자원과 작업 성격 고려 필요
구성 요소
Job
Jenkins에서 실행 가능한 작업 단위 가장 기본적인 자동화 단위
유형
-
Freestyle Project
- 웹 UI에서 빌드 명령, 트리거, 후처리 작업 설정 가능
- 특징
- 입문 쉬움
- 간단한 작업 구성
- UI 기반 → 빠르게 생성 가능
- 한계
- 설정 이력 관리 어려움
- 복잡한 흐름 표현이 불편
- 재사용성과 코드 리뷰 약함
-
Pipeline
- 단계별 흐름을 코드로 정의
- 특징
- 버전 관리 가능
- 복잡한 절차 표현 가능
- 조건 분기, 병렬 처리 가능
- 코드 리뷰 가능
- 재현성 높음
-
Multibranch Pipeline
- 여러 브랜치 자동 인식 → 각 브랜치의 Jenkinsfile 기준 파이프라인 실행
- 장점
- 브랜치별 자동 파이프라인
- PR 기반 흐름, Git 중심 운영에 유리
Project
Job을 프로젝트 형태로 관리 Freestyle Project, Pipeline Project, Multibranch Pipeline 등
Build
Job이 한 번 실행된 결과 Job 실행 이력 단위
Node
작업을 수행할 수 있는 실행 대상
Label
특정 Agent 분류 태그
Pipeline 중요성
-
UI 설정보다 코드 관리 유리
Jenkinsfile→ Git에 저장- 변경 이력 추적
- 코드 리뷰
- 브랜치별 분리
- 프로젝트와 함께 관리
-
복잡한 흐름 표현 쉬움
Plugin 구조의 장점 / 주의점
필요한 기능을 Plugin으로 추가 가능 → 관리 포인트 많아짐
Jenkins 잘 맞는 환경
- 자체 인프라 중심 환경
- 복잡한 커스텀 파이프라인
- 다양한 실행 환경이 필요한 경우
- 기존 레거시 자동화 자산이 많은 경우
한계 및 고려사항
- 직접 운영 부담
- 플러그인 의존성
- UI 중심 운영의 위험
- Controller 과부하 가능성
- 보안 관리 중요
최종
아키텍처 관점
Developer
↓
Git Repository
↓
Jenkins Controller
↓
Jenkins Agent
↓
Build / Test / Package
↓
Artifact Repository / Container Registry
↓
Deployment Target
- Jenkins가 트리거를 받고 파이프라인 실행, 결과를 다음 단계로 넘기는 중심 허브 역할
요약
Jenkins → CI/CD 자동화를 위한 오픈소스 자동화 서버
단순 빌드 도구 X, 파이프라인 실행과 흐름 제어 담당
기본 구조 = Controller / Agent
Jenkins 활용의 핵심 → Pipeline as Code + Jenkinsfile