Skip to main content

Jenkins

최근 새로운 프로젝트에 참여하면서, CI/CD 환경 구축을 담당하게 되었습니다.
그 과정에서 잘 모르던 젠킨스 Jenkins에 대해 학습할 필요가 생겼습니다.
젠킨스의 용도, 원리, 역할 및 사용법에 대해 간략히 노트를 남깁니다.


개요

The leading open source automation server, Jenkins provides hundreds of plugins to support building, deploying and automating any project.
젠킨스는 프로젝트의 빌드, 배포 그리고 자동화를 지원하는 수백개의 플러그인을 제공하는 오픈 소스 자동화 서버입니다.

출처: Jenkins 공식 홈페이지

CI/CD 서버라고 하니, 큰 용도는 감이 잡힙니다. 하지만 일반적인 클라우드에서의 배포 환경을 가리키는 것인지, 사실 아직은 구체적으로 감이 잡히지 않습니다. (Vite 같은 것인가-싶었습니다.)
그래서 학습을 위해 LLM으로 간단한 조사를 해본 뒤에 공식문서를 읽어보았습니다.
공식 문서는 개요와 Docker 설치 방법 위주로 살펴보았습니다.


원리

Jenkins는 크게 세 가지 구성 요소로 작동한다고 합니다.

  1. Controller (Master)
    • Jenkins UI가 있는 서버 (파이프라인 관리, 스케줄링 담당)
    • GitHub 등에서 Webhook으로 이벤트를 받아 파이프라인 실행
  2. Agent (Node)
    • 실제 코드를 빌드하고 테스트하는 머신 (Docker, EC2 등)
    • Jenkinsfile에 정의된 환경을 (agent { dockerfile { ... } })에서 실행
  3. Pipeline (Jenkinsfile)
    • 빌드, 테스트, 배포의 “단계(Stage)”를 정의한 코드 (yml, Dockerfile의 역할로 이해했습니다.)
    • Groovy 문법 기반의 선언형 스크립트로 작성

정리하자면,

Controller는 UI이자 webhook event로 파이프라인 실행의 트리거로. Agent는 실제 코드를 실행하는 컨테이너, Pipeline은 일반적인 yaml과 같은 일반적인 배포 스크립트의 역할을 한다- 정도로 이해했습니다.

설명을 보니, 서버에 배포된 development, production의 배포 코드(IaC)를 젠킨스 서버에서 적용하여 동일한 환경으로 실행시켜볼 수 있겠다는 생각이 들었습니다.
dev, prod 등 특정 배포 환경에서만 재현되는 버그가 상당히 골치 아팠는데,
이런 경우에 동일한 환경에서 테스트 해보면 유용하지 않을까 싶었습니다.


공식 문서

공식 문서의 첫 페이지를 읽으면서, 젠킨스를 더 구체적으로 파악해보겠습니다.
이해에 도움이 되는 부분들은 볼드 처리하였습니다.

Jenkins is a self-contained, open source automation server which can be used to automate all sorts of tasks related to building, testing, and delivering or deploying software. Jenkins can be installed through native system packages, Docker, or even run standalone by any machine with a Java Runtime Environment (JRE) installed. Jenkins는 소프트웨어 빌드, 테스트, 제공 또는 배포와 관련된 모든 종류의 작업을 자동화하는 데 사용할 수 있는 독립형 오픈 소스 자동화 서버입니다. Jenkins는 네이티브 시스템 패키지, Docker를 통해 설치하거나, Java Runtime Environment(JRE)가 설치된 모든 컴퓨터에서 단독으로 실행할 수도 있습니다.

출처: What is Jenkins?

CI/CD의 각 과정에서 필요한 작업들을 실행할 수 있는 독립형 서버라고 이해했습니다.
현업에서 로컬 개발 환경-dev-prod 간의 각기 다른 환경마다 관리할 요소들이 많은데,
이러한 복잡한 CICD 파이프라인 개발 및 관리를 위해 사용하는 툴인듯 싶습니다.

설치 가이드

프로젝트에서 유용하게 사용할 것 같아 공식 문서를 살펴봤습니다.

Due to Docker's fundamental platform and container design, a Docker image for a given application, such as Jenkins, can be run on any supported operating system or cloud service also running Docker. Supported operating systems include macOS, Linux and Windows, and supported cloud services include AWS and Azure. Docker의 기본 플랫폼과 컨테이너 설계로 Jenkins와 같은 Docker 이미지는 모든 OS 혹은 클라우드 서비스에서 실행될 수 있습니다. 지원 운영 체제에는 macOS, Linux, Windows가 있으며, 지원 클라우드 서비스에는 AWSAzure가 있습니다.

출처: Jenkins 공식 문서 - Installation / Docker

도커 컨테이너로 젠킨스 서버를 띄울 수 있다고 합니다.

Docker Hub repository jenkins image에서 젠킨스 이미지를 받을 수 있습니다.
하지만 이 이미지는 도커 CLI를 포함하지 않고, 자주 사용되는 플러그인인 Blue Ocean을 사용하지 않기 때문에 하단의 설치 과정을 추천한다고 합니다.

# jenkins 도커 네트워크 생성
docker network create jenkins
# 해당 네트워크로 jenkins 컨테이너 생성+실행
docker run
--name jenkins-docker
--rm
-d
--privileged
--network jenkins
--network-alias docker
--env DOCKER_TLS_CERTDIR=/certs
--volume jenkins-docker-certs:/certs/client
--volume jenkins-data:/var/jenkins_home
--publish 2376:2376
docker:dind
--storage-driver overlay2

익숙한 도커 컨테이너 생성-실행 명령어이지만, 모르는 부분 위주로 찾아봤습니다.

  • --volume jenkins-docker-certs:.. :

    • 컨테이너 내부의 /certs/clientjenkins-docker-certs 도커 볼륨과 맵핑하기 위해 사용합니다.
  • docker:dind (Docker in Docker):

    • Docker-in-Docker(DinD)는 하나의 도커 컨테이너 안에서 또 다른 도커 데몬을 실행하여, 그 안에서 자체적으로 컨테이너를 생성하고 관리할 수 있도록 하는 기술-이라고 합니다.
    • docker:dind는 왜 포함되나 보니, "젠킨스 노드에서 Docker 명령어를 실행하기 위해" 사용한다고 합니다.

여기까지 완료가 되면, 도커 파일을 작성하고 이미지를 빌드합니다.

FROM jenkins/jenkins:2.528.1-jdk21
USER root
RUN apt-get update && apt-get install -y lsb-release ca-certificates curl && \
install -m 0755 -d /etc/apt/keyrings && \
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc && \
chmod a+r /etc/apt/keyrings/docker.asc && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/debian $(. /etc/os-release && echo \"$VERSION_CODENAME\") stable" \
| tee /etc/apt/sources.list.d/docker.list > /dev/null && \
apt-get update && apt-get install -y docker-ce-cli && \
apt-get clean && rm -rf /var/lib/apt/lists/*
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean docker-workflow json-path-api"

이후 빌드된 이미지로 blueocean 플러그인과 docker-ce-cli가 포함된 젠킨스 컨테이너를 실행할 수 있습니다.

docker run 
--name jenkins-blueocean
--restart=on-failure
--detach
--network jenkins
--env DOCKER_HOST=tcp://docker:2376
--env DOCKER_CERT_PATH=/certs/client
--env DOCKER_TLS_VERIFY=1
--publish 8080:8080
--publish 50000:50000
--volume jenkins-data:/var/jenkins_home
--volume jenkins-docker-certs:/certs/client:ro
myjenkins-blueocean:2.528.1-1