contents
젠킨스(Jenkins) 는 소프트웨어 개발 과정에서 사람이 직접 하지 않는 부분들을 자동화하는 데 도움을 주는 무료 오픈소스 자동화 서버입니다. 주로 지속적 통합 및 지속적 전달(CI/CD) 파이프라인을 구현하는 데 사용되며, 데브옵스(DevOps) 세계의 기초적인 도구입니다.
젠킨스를 코드 변경이 있을 때마다 소프트웨어를 자동으로 빌드, 테스트, 배포하는, 개발팀을 위한 강력하고 맞춤 설정 가능한 로봇으로 생각할 수 있습니다.
젠킨스의 역할 (왜 사용하는가)
젠킨스의 주된 목적은 전체 소프트웨어 전달 생명주기를 자동화하는 것입니다. 이는 버전 관리 시스템(Git 등), 빌드 도구(Maven, Gradle 등), 테스트 프레임워크, 그리고 배포 환경을 연결하는 중앙 제어 허브 역할을 합니다.
이 과정을 자동화함으로써 젠킨스는 몇 가지 핵심 문제를 해결합니다.
- 수동적이고 오류가 발생하기 쉬운 빌드 및 배포 작업을 제거합니다.
- 코드 변경으로 인해 빌드가 깨지거나 테스트가 실패하면 개발자에게 즉각적인 피드백을 제공합니다.
- 테스트를 거친 배포 가능한 버전의 소프트웨어가 항상 준비되도록 보장합니다.
핵심 개념 및 아키텍처 🏗️
젠킨스는 분산된 컨트롤러-에이전트 아키텍처를 사용하여 작업을 관리합니다.
- 젠킨스 컨트롤러 (구 "마스터"): 젠킨스 설치의 중앙 두뇌입니다. 웹 UI를 호스팅하고, 모든 Job 설정을 저장하며, 사용 가능한 에이전트에게 빌드 Job을 스케줄링하고 전달하는 역할을 합니다.
- 젠킨스 에이전트 (구 "슬레이브"): 컨트롤러에 연결되어 실제 빌드 및 테스트 Job을 실행하는 작업용 머신입니다. 여러 에이전트를 둘 수 있어 여러 Job을 병렬로 실행하거나, 다른 운영 체제 및 도구를 가진 에이전트를 둘 수 있습니다(예: .NET 빌드를 위한 윈도우 에이전트, 도커 빌드를 위한 리눅스 에이전트).
- Job (또는 프로젝트): 젠킨스에서 작업의 기본 단위입니다. 코드를 체크아웃하고, 컴파일하고, 테스트를 실행하거나, 애플리케이션을 배포하는 등 젠킨스가 수행하도록 사용자가 설정한 작업입니다.
- 빌드 (Build): Job이 한 번 실행된 것을 의미합니다. 각 빌드는 자체 로그, 아티팩트(결과물), 테스트 결과와 함께 기록됩니다.
- 플러그인 (Plugins) 🔌: 이것이 젠킨스의 슈퍼파워입니다. 핵심 젠킨스 애플리케이션은 비교적 가볍습니다. 진정한 강력함은 1,800개가 넘는 커뮤니티 기여 플러그인 생태계에서 나옵니다. 플러그인을 통해 젠킨스는 소프트웨어 개발 생명주기의 거의 모든 도구와 통합할 수 있습니다.
- 소스 컨트롤: Git, Subversion
- 빌드 도구: Maven, Gradle, Ant
- 클라우드 플랫폼: AWS, Azure, Google Cloud
- 컨테이너: Docker, Kubernetes
- 알림: 이메일, 슬랙
젠킨스 파이프라인 (코드형 파이프라인) 📜
젠킨스를 사용하는 가장 현대적이고 강력한 방법은 파이프라인을 통하는 것입니다. 젠킨스 파이프라인은 전체 CI/CD 프로세스를 일련의 단계(stage)로 정의합니다.
여기서 핵심 개념은 코드형 파이프라인(Pipeline as Code) 입니다. 웹 UI를 통해 Job을 설정하는 대신("프리스타일" Job), **Jenkinsfile**이라는 텍스트 파일에 전체 파이프라인을 정의합니다.
Jenkinsfile:
이 파일은 프로젝트의 소스 코드 저장소(예: Git 리포지토리)에 함께 존재합니다. 빌드, 테스트, 배포 프로세스의 모든 단계와 스텝을 정의합니다.
"코드형 파이프라인"이 왜 중요한가?
- 버전 관리 가능: 파이프라인이 코드와 함께 버전 관리됩니다.
- 감사 가능: 누가 언제 파이프라인을 변경했는지 확인할 수 있습니다.
- 검토 가능: 파이프라인 변경 사항을 풀 리퀘스트를 통해 검토할 수 있습니다.
- 복원력: 젠킨스 서버에 장애가 발생해도 파이프라인 정의는 Git 저장소에 안전하게 보관됩니다.
파이프라인 문법
Jenkinsfile을 작성하는 방법에는 두 가지가 있습니다.
-
선언형 파이프라인 (Declarative Pipeline): 더 새롭고 구조화되었으며 단순한 문법입니다. 대부분의 경우에 권장되는 접근 방식입니다.
pipeline,agent,stages,stage,steps와 같은 명확한 블록을 사용합니다.Jenkinsfile예시 (선언형):pipeline { agent any // 사용 가능한 아무 에이전트에서나 실행 stages { stage('Build') { steps { echo '애플리케이션 빌드 중...' sh './gradlew build' } } stage('Test') { steps { echo '테스트 실행 중...' sh './gradlew test' } } stage('Deploy') { steps { echo '스테이징 환경에 배포 중...' // 배포 명령어가 여기에 들어갑니다. } } } } -
스크립트 파이프라인 (Scripted Pipeline): Groovy 프로그래밍 언어를 기반으로 한 더 유연하고 강력한 문법입니다. 더 많은 프로그래밍적 제어를 제공하지만 학습 곡선이 더 가파릅니다.
젠킨스의 장점과 단점 ⚖️
장점 ✅
- 엄청난 확장성: 거대한 플러그인 생태계가 가장 큰 강점입니다. 어떤 도구든 젠킨스 플러그인이 있을 가능성이 높습니다.
- 무료 및 오픈 소스: 라이선스 비용이 없으며, 크고 활발한 커뮤니티의 지원을 받습니다.
- 유연하고 강력함: 표준 CI/CD뿐만 아니라 거의 모든 자동화 작업을 수행하도록 설정할 수 있습니다.
- 플랫폼 독립성: 자바 기반이므로 젠킨스는 윈도우, macOS, 리눅스 및 기타 유닉스 계열 운영 체제에서 실행될 수 있습니다.
단점 ❌
- 가파른 학습 곡선: 젠킨스 서버, 에이전트, 플러그인을 설정하고 관리하는 것은 특히 초보자에게 매우 복잡할 수 있습니다.
- 오래된 UI: "블루 오션" UI가 더 현대적인 경험을 제공하지만, 클래식 UI는 최신 도구에 비해 구식이고 투박하게 느껴질 수 있습니다.
- 높은 유지보수 부담: 대규모 조직에서는 젠킨스 관리가 정규 업무가 될 수 있습니다. 서버 유지보수, 보안 업데이트, 플러그인 충돌 해결 등을 모두 책임져야 합니다. 이를 종종 "젠킨스 돌보기(Jenkins-babysitting)"라고 부르기도 합니다.
결론적으로, 젠킨스는 데브옵스 세계의 강력하고 유연하며 검증된 일꾼입니다. GitHub Actions나 GitLab CI/CD와 같은 더 새롭고 통합된 도구들이 더 간단한 경험을 제공하지만, 젠킨스의 비할 데 없는 유연성과 플러그인 생태계는 자동화 분야에서 여전히 지배적인 위치를 차지하게 합니다.
references