
Jenkins는 소프트웨어 개발 과정에서 반복적으로 수행되는 작업을 자동화하기 위한 오픈소스 자동화 서버다.
가장 대표적으로는 다음 작업을 자동화하는 데 사용됨.
즉, Jenkins는 단순히 코드를 컴파일하는 도구가 아니라,
소스 변경부터 배포 전후 작업까지 연결하는 자동화 플랫폼으로 이해하는 것이 맞음.
초기 개발 환경에서는 개발자가 직접 다음 작업을 수행하는 경우가 많았음.
이 방식은 규모가 작을 때는 가능하지만, 협업 인원이 늘고 변경이 많아질수록 한계가 분명해짐.
대표적인 문제는 다음과 같음.
Jenkins는 이런 문제를 해결하기 위해 정해진 절차를 서버에서 일관되게 자동 실행하도록 만들어줌.
Jenkins는 CI/CD 파이프라인 전체에서 여러 역할을 수행할 수 있음.
조직마다 활용 범위는 다르지만, 보통 다음 역할로 설명할 수 있음.
가장 기본적인 역할은 CI 자동화다.
예를 들면 다음과 같은 흐름이다.
이 구조에서 Jenkins는 CI 파이프라인의 실행 주체가 된다.
Jenkins는 빌드까지만 하는 것이 아니라, 배포 단계까지 연결할 수 있음.
예:
즉, Jenkins는 CI뿐 아니라 CD까지 이어지는 자동화 흐름을 제어하는 중심 도구가 될 수 있음.
Jenkins는 하나의 명령만 실행하는 도구가 아니라, 여러 단계를 순서대로 실행하고 조건에 따라 분기하는 오케스트레이션 역할도 한다.
예를 들면 다음처럼 구성할 수 있음.
즉, Jenkins는 단순 명령 실행기가 아니라 절차를 정의하고 제어하는 엔진이다.
Jenkins가 오랫동안 널리 사용된 이유는 몇 가지 특징 때문임.
Jenkins는 오픈소스 프로젝트라서 자유롭게 설치하고 확장할 수 있음.
특정 벤더 종속성이 낮고, 자체 인프라 환경에서도 운영이 가능함.
이 특징 때문에 다음 환경에서 특히 많이 사용됐음.
Jenkins의 가장 큰 특징 중 하나는 Plugin 구조다.
기본 기능만으로도 파이프라인을 만들 수 있지만, 다양한 플러그인을 추가해서 기능을 넓힐 수 있음.
예를 들면 다음과 같은 확장이 가능함.
즉, Jenkins는 기본 엔진 위에 여러 기능을 붙여서 조직 환경에 맞게 확장하는 방식이 강함.
예전에는 Jenkins Job 설정을 웹 UI에서 일일이 입력하는 방식이 많았음.
하지만 현재는 Jenkinsfile을 저장소에 함께 두고, 파이프라인 자체를 코드처럼 관리하는 방식이 중요함.
이 접근 방식의 장점은 다음과 같음.
즉, Jenkins는 단순 UI 설정형 도구를 넘어서 파이프라인 정의 자체를 코드로 다루는 방식으로 발전했음.
Jenkins는 모든 작업을 한 서버에서만 수행해야 하는 구조가 아님.
필요하면 여러 노드에 작업을 분산해서 실행할 수 있음.
예:
이 구조 덕분에 빌드 부하를 분산하고, 다양한 실행 환경을 다룰 수 있음.
Jenkins는 보통 Controller / Agent 구조로 설명함.
예전에는 Master / Slave 용어를 많이 썼지만, 현재는 보통 Controller / Agent라고 표현함.
Controller는 Jenkins의 중심 서버다.
주요 역할은 다음과 같음.
즉, Controller는 Jenkins의 제어 두뇌 역할을 한다.
Agent는 실제 작업을 수행하는 실행 노드다.
예를 들어 다음과 같은 작업을 Agent가 수행할 수 있음.
Controller가 계획을 세우고 지시하면, Agent가 실제 명령을 실행하는 구조다.
모든 작업을 Controller 한 대에서 수행할 수도 있음.
하지만 규모가 커질수록 분리가 필요해짐.
분리 이유는 다음과 같음.
빌드와 테스트는 CPU, Memory, Disk I/O를 많이 사용할 수 있음.
이 작업을 전부 Controller에서 수행하면 Jenkins 자체가 느려질 수 있음.
어떤 프로젝트는 Linux에서 빌드하고, 어떤 프로젝트는 Windows에서 빌드해야 할 수 있음.
Controller와 별도 Agent를 두면 프로젝트 특성에 맞는 실행 환경을 사용할 수 있음.
모든 권한과 실행을 한 서버에 몰아두면 리스크가 커짐.
빌드 실행 노드를 분리하면 격리 효과를 기대할 수 있음.
빌드 양이 많아질수록 Agent를 늘려서 확장할 수 있음.
Jenkins 파이프라인 실행 흐름을 단순화하면 다음과 같음.
개발자 코드 변경
↓
Git 저장소 이벤트 발생
↓
Jenkins Controller가 Job 트리거
↓
Controller가 실행 가능한 Agent 선택
↓
Agent가 작업 디렉터리 생성 후 소스코드 다운로드
↓
빌드 / 테스트 / 배포 명령 수행
↓
실행 결과를 Controller에 전달
↓
Controller가 UI와 로그에 결과 표시
Jenkins가 작업을 실행할 때는 보통 특정 디렉터리에서 작업을 수행함.
이 작업 디렉터리를 Workspace라고 부른다.
Workspace에서는 보통 다음 작업이 일어남.
즉, Workspace는 파이프라인이 실제로 실행되는 작업 공간이다.
실무에서는 Workspace가 오염되지 않도록 관리하는 것이 중요함.
이전 빌드 결과가 남아 있으면 다음 빌드에 영향을 줄 수 있기 때문임.
Jenkins Agent는 동시에 여러 작업을 수행할 수 있도록 설정할 수 있음.
이때 동시 실행 단위를 흔히 Executor라고 본다.
예를 들어 Agent 하나에 Executor가 2개면 동시에 두 개 Job을 돌릴 수 있음.
하지만 무조건 많이 주는 것이 좋은 것은 아님.
이유는 다음과 같음.
즉, Jenkins는 병렬성이 중요하지만, 동시에 실행 가능한 범위는 인프라 자원과 작업 성격을 함께 고려해야 함.
Jenkins를 제대로 이해하려면 자주 등장하는 용어를 먼저 정리해야 함.
Job은 Jenkins에서 실행 가능한 작업 단위다.
가장 기본적인 자동화 단위라고 보면 됨.
예:
즉, Job은 Jenkins가 실행하는 "업무 단위"다.
Jenkins UI에서는 Job을 프로젝트 형태로 관리하는 경우가 많음.
Freestyle Project, Pipeline Project, Multibranch Pipeline 등이 이에 해당함.
즉, "Project"는 UI 상의 관리 단위이고, 실제 자동화 관점에서는 Job 또는 Pipeline 실행 단위로 이해하면 됨.
Build는 Job이 한 번 실행된 결과다.
보통 실행 기록이 순번으로 남음.
예:
이 기록을 통해 다음을 확인할 수 있음.
즉, Build는 단순 컴파일 결과가 아니라 Job 실행 이력 단위다.
Node는 Jenkins가 작업을 수행할 수 있는 실행 대상이다.
Controller 자체도 Node가 될 수 있고, 별도 Agent도 Node가 될 수 있음.
Pipeline 코드에서 특정 Node를 지정하면 그 환경에서 작업을 실행하게 됨.
Label은 특정 Agent를 분류하는 태그 개념이다.
예를 들어 다음처럼 구분할 수 있음.
linuxwindowsdockermavengpu파이프라인에서 특정 Label을 요구하면, 해당 Label을 가진 Agent에서 작업이 수행됨.
이 구조는 실무에서 매우 중요함.
프로젝트마다 필요한 실행 환경이 다르기 때문임.
Jenkins에는 여러 Job 유형이 있지만, 강의 초반에는 대표 유형만 정확히 구분하면 충분함.

가장 전통적인 방식이다.
웹 UI에서 빌드 명령, 트리거, 후처리 작업을 설정할 수 있음.
즉, Freestyle은 개념 학습용으로는 좋지만, 복잡한 실무 파이프라인에는 한계가 있음.
Pipeline은 Jenkinsfile을 사용해서 단계별 흐름을 코드로 정의하는 방식이다.
즉, 현재 Jenkins를 이야기할 때 핵심은 대부분 Pipeline이다.
멀티브랜치 파이프라인은 저장소의 여러 브랜치를 자동으로 인식하고, 각 브랜치의 Jenkinsfile을 기준으로 파이프라인을 실행하는 구조다.
즉, Git 기반 현대적 개발 방식과 잘 연결되는 Jenkins 구조라고 볼 수 있음.
Jenkins를 오래 사용한 조직도 요즘은 대부분 Pipeline 중심으로 운영함.
그 이유는 명확함.
UI에서 클릭으로 구성한 Job은 다음 문제가 생기기 쉬움.
반면 Jenkinsfile은 Git에 저장되므로 다음이 가능함.
즉, 파이프라인을 코드화하면 DevOps의 핵심 원칙 중 하나인 변경의 추적 가능성이 높아짐.
실무 파이프라인은 단순하지 않음.
예를 들면 다음 흐름이 필요할 수 있음.
이런 구조는 Pipeline 코드 방식이 훨씬 잘 맞음.
Jenkins는 플러그인을 통해 기능을 폭넓게 확장할 수 있음.
예:
즉, Jenkins는 기본 엔진이 있고, 필요한 기능을 플러그인으로 추가하는 구조임.
플러그인이 많다는 것은 강점이지만 동시에 관리 포인트도 많다는 뜻임.
주의할 점은 다음과 같음.
즉, Jenkins를 운영할 때는 단순 설치보다 플러그인 생태계 관리가 중요한 과제가 됨.
Jenkins는 모든 조직에서 무조건 최선은 아니지만, 다음 환경에는 특히 잘 맞는 편임.
사내망, 폐쇄망, 자체 서버 운영 환경에서는 Jenkins의 통제력이 강점이 됨.
단순 SaaS 워크플로우보다 복잡한 절차와 레거시 시스템 연동이 필요한 경우 Jenkins가 유리할 수 있음.
Linux, Windows, Docker, 특정 사내 도구 등 여러 환경을 혼합해야 할 때 Agent 구조가 유용함.
이미 수많은 Jenkins Job과 Script가 있는 조직에서는 Jenkins가 여전히 핵심 플랫폼일 수 있음.
Jenkins는 강력하지만, 운영 난이도도 함께 고려해야 함.
Jenkins는 설치형 도구라서 서버 운영, 백업, 업그레이드, 보안 패치 등을 직접 관리해야 함.
확장성은 좋지만 관리 복잡도도 커짐.
Pipeline as Code를 쓰지 않으면 설정이 산발적으로 흩어질 수 있음.
잘못 설계하면 모든 작업이 Controller에 몰려 성능 문제가 생길 수 있음.
Credential 관리, 권한 분리, 에이전트 격리, 외부 연동 보안 등을 신경 써야 함.
즉, Jenkins는 강력한 만큼 "운영형 도구"라는 점을 반드시 기억해야 함.
CI/CD 전체 구조에서 Jenkins는 보통 다음 위치에 놓임.
Developer
↓
Git Repository
↓
Jenkins Controller
↓
Jenkins Agent
↓
Build / Test / Package
↓
Artifact Repository / Container Registry
↓
Deployment Target
이 구조에서 Jenkins는 트리거를 받고 파이프라인을 실행하며 결과를 다음 단계로 넘기는 중심 허브 역할을 한다.
즉, Jenkins는 코드 저장소와 실행 환경 사이를 연결하는 자동화 오케스트레이터라고 볼 수 있음.