2025-07-25 01:02
Status:
Tags: 데브옵스
젠킨스
자바 런타임에서 돌아가는 오픈소스 CI CD 도구 플러그인과 파이프라인 조합
왜 만들어졌는가? → 어떤 문제 해결
코드 커밋할때마다 빌드 실패하는 상황과 팀원들의 분노를 피하기 위해 만들어짐 → 수동 빌드와 테스트를 자동화, 지속적으로 통합해서 오류 줄이고, 배포를 쉽게
여러 배포 환경 관리 핵심: 인프라를 모듈화하여 어떤것이 변수인지 잘 설정하고 이를 잘 설계하는 것
젠킨스 아키텍쳐
마스터 에이전트 또는 컨트롤러 노드 아키텍쳐를 기반으로 함
컨트롤러(마스터)
전체 시스템 두뇌 역할
- 작업 스케쥴링
- 에이전트 모니터링
- 웹 인터페이스
- 플러그인
- 구성 정보 저장
에이전트(노예)
실제 작업을 수행하는 워커 노드
- 작업 실행
- 환경 격리
- 확장성 제공
젠킨스 실제 구조
JENKINS_HOME/
├── config.xml (Jenkins 루트 구성)
├── jobs/
│ └── [JOB_NAME]/
│ ├── config.xml (작업 구성 파일)
│ └── builds/
│ └── [BUILD_ID]/
│ ├── build.xml
│ └── log
├── workspace/ (작업 공간)
├── plugins/ (플러그인 저장소)
└── secrets/ (보안 정보)
젠킨스 설치 (도커 인 도커)
젠킨스 이미지 받기
docker pull jenkins/jenkins:lts
젠킨스 컨테이너 실행
docker run -d --name jenkins -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home -v //var/run/docker.sock:/var/run/docker.sock -u root jenkins/jenkins:lts
젠킨스 컨테이너 접속
docker exec -it jenkins /bin/bash
권한 부여
chmod 666 /var/run/docker.sock
젠킨스 컨테이너 내부에 도커 설치
# 기존 Docker 관련 패키지 제거
apt-get remove docker docker-engine docker.io containerd runc
# 필요한 패키지 설치
apt-get update
apt-get install ca-certificates curl gnupg lsb-release
# Docker GPG 키 추가
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# Docker 리포지토리 추가
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
# Docker CLI만 설치
apt-get update
apt-get install docker-ce-cli
내부에서 도커 테스트
docker --version
초기 비밀번호 확인
docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
웹 브라우저에서 접속 http://localhost:8080 으로 접속해서, 위에서 확인한 비밀번호로 로그인하면 젠킨스 설정을 시작. 플러그인 설치 화면으로 가서 추천 플러그인 설치 가능 아이디는 기본 admin 이고 이후 설정에서 비번 설정 가능
젠킨스 사용법
파이프라인 기본 구조
CI CD 파이프라인을 젠킨스에 구현하기 위한 일련의 플러그인들의 집합이자 구성 플러그인들이 파이프라인에서 용도에 맞게 사용되고 정의
- 파이프라인: 일련의 작업 명세서 (레시피)로, 어떤 순서로 작업이 수행되는지 정의
Declarative Pipeline의 기본 틀
모든 유요한 declarative pipeline은 pipeline
블록 내에 정의되어야 한다.
pipeline {{
stage('Build'){
steps {
echo 'Building...'
}
}
}
}
필수 구성 요소
- agent: 파이프라인이 실행될 위치 지정
- stages: 하나 이상의 stage 블록 포함
- stage: 개별 작업 단위 정의
- steps: stage 내에서 실행될 구체적 명령어들
Declarative Pipeline 문법 DSL
Pipeline 블록 구조
pipeline {
/* Declarative Pipeline 내용 */
}
기본 규칙:
- 최상위 레벨은 반드시
pipeline { }
블록이어야 함 - 세미콜론 없음 (각 문장은 별도 줄에 작성)
- 블록은 Sections, Directives, Steps, 또는 할당문으로만 구성
Agent 지시문
agent 는 파이프라인이 실행될 위치 지정
pipeline {
agent any // 사용 가능한 모든 agent
agent none // 글로벌 agent 없음, 각 stage 에서 정의
agent {
label 'linux-machine' // 특정 라벨의 agent
}
agent {
docker {
image 'node:18' // 도커 컨테이너에서 실행
}
}
}
Stages와 Steps
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git 'https://github.com/username/repository.git'
}
}
stage('Build') {
steps {
sh 'npm install'
sh 'npm run build'
}
}
stage('Test') {
steps {
sh 'npm test'
}
}
}
}
자바 펫클리닉 예시 스크립트
(실제로는 pipeline 으로 시작하는 부분만 넣어야함) 더 자세한 코드들은 아래 노트로 젠킨스 스크립트 모음 Jenkins 사용법과 실제 문법 핸드북
# Jenkins를 이용한 자동빌드
# item name: petclinic
#설명 : 1. GIT: petclinic build
# Pipeline : pipeline script
# Jenkins 설치시 추천 플러그인 설치하면 git 관련된 플러그인이 포함되어 있음
# Checkout 스테이지에서 git source 다운로드
# Build 스테이지에서 sh 플러그인을 통해 mvnw 실행
# Build 작업 완료후 생성된 jar 파일을 아카이브아키펙트로 전달
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git branch: 'main', url:'https://github.com/237summit/petclinic.git'
}
}
stage('Build') {
steps {
sh "./mvnw clean package"
}
post {
success {
archiveArtifacts 'target/*.jar'
}
}
}
}
}
# 빌드 진행 : [지금 빌드]
# 콘솔 로그 보기
# POST : 아카이브아티팩트 링크 확인
References
CI CD Jenkins 핸드북_ 초보자부터 중급자까지 Jenkins 사용법과 실제 문법 핸드북 2025-07-26