🎯 Jenkins에 대해 정리합니다.


📗 Today I Learned

Jenkins

Java로 개발된 오픈 소스 자동화 서버로 주로 지속적 인도(Continuous Delivery, CD) 프로세스를 구축할 때 사용되며, 높은 유연성과 확장성 덕분에 널리 활용되고 있습니다.

원래는 Hudson이라는 오픈소스 도구였는데, 오라클이 Hudson을 인수하고 독점 소프트웨어로 전환하기로 하자, 커뮤니티는 Jenkins라는 이름으로 오픈 소스로 분리하여 나와 현재까지 오픈소스 솔루션으로 개발을 지속하고 있습니다.

🤔 CI/CD란?

CI/CD는 소프트웨어 개발에서 빌드(Build), 테스트(Test), 배포(Deploy)의 과정을 자동화하는 대표적인 방식입니다.

  • CI (지속적 통합, Continuous Integration)

    • 여러 개발자가 작성한 코드를 하나의 저장소에 자주 통합하는 것으로 시작됩니다.
    • 통합된 코드는 자동으로 빌드되고, 단위 테스트와 정적 분석 등을 통해 문제가 없는지 확인합니다.
    • 이를 통해 언제든지 배포 가능한 상태를 유지하는 것이 목표입니다.
  • CD (지속적 배포, Continuous Delivery / Deployment)

    • CI 과정을 거쳐 검증된 애플리케이션을 운영 환경까지 안정적으로 배포하는 단계를 자동화합니다.

    • 지속적 전달(Continuous Delivery)은 배포 직전 단계까지 자동화하고, 실제 배포 여부는 사람이 결정합니다.

    • 지속적 배포(Continuous Deployment)는 승인 없이 운영 환경까지 자동으로 배포됩니다.

    • 이 과정에서는 컨테이너 이미지 생성과 Kubernetes 리소스(Pod, Deployment, Service 등)를 이용한 자동 배포가 이루어집니다.




Jenkins 특징

  • 다양한 프로그래밍 언어 지원 : Java, Python, Go, Node.js 등 거의 모든 프로그래밍 언어에 대응합니다.

  • 플러그인을 통한 확장 : 수천 개의 플러그인이 존재하며, 사용자가 직접 플러그인을 만들어 기능을 추가할 수도 있습니다.

  • 이식성 : 로컬 서버뿐 아니라 클라우드, 컨테이너, Kubernetes 클러스터 환경에서도 유연하게 작동합니다.

  • 대부분의 소스 관리 시스템 지원 : Git, Subversion 등 주요 VCS 시스템 대부분을 지원합니다.

  • 분산 처리 지원 : 마스터-슬레이브 구조를 통해 여러 노드에서 병렬 작업이 가능합니다.

  • 코드로 파이프라인 구성 : Jenkinsfile을 사용하여 파이프라인을 코드로 선언하고 버전 관리할 수 있습니다.




Jenkins 아키텍처

Jenkins는 마스터(Master)슬레이브(Slave)로 구성된 분산 아키텍처를 가지고 있습니다.

마스터의 역할

  • 빌드 트리거(예: Git 커밋) 감지

  • 클라이언트 요청을 처리 (Web UI, HTTP API)

  • 에이전트에게 작업 분배 및 우선순위 조정

  • 전체 빌드 환경을 관리

에이전트의 역할

  • 마스터의 명령을 받아 실제 빌드, 테스트, 배포 등의 작업을 실행

  • 자원을 분산시켜 병렬 처리 가능




Jenkins 확장 전략 : 수평적 확장

조직이 커짐에 따라 Jenkins를 어떻게 확장할지도 중요한 고려 사항입니다.

수평적 확장

  • 팀 단위로 마스터 인스턴스를 여러 개 운영하는 방식입니다.

  • 각 팀이 독립된 Jenkins 환경을 가지므로 충돌이 줄어들고, 팀 간 업무 효율성이 증가합니다.

  • 특정 마스터에 문제가 생겨도 다른 팀에는 영향을 주지 않기 때문에 안정성이 뛰어납니다.

  • 통합 자동화가 복잡해진다는 단점이 있습니다.

🤔 수직 확장은 어떨까?

  • 하나의 마스터에 더 많은 CPU, RAM 등 자원을 추가하는 방식입니다.
  • 하지만 하나의 마스터에 모든 업무를 몰아주면 유지보수와 장애 대응이 복잡해질 수 있습니다.



Jenkins 인스턴스

Jenkins 인스턴스는 항상 테스트용 인스턴스와 프로덕션용으로 분리 운용해야 합니다.

  • 테스트 인스턴스 : 새로운 플러그인 설치, Jenkins 업데이트, 파이프라인 변경 사항을 먼저 실험하는 인스턴스입니다.

  • 프로덕션 인스턴스 : 실제 코드 빌드와 배포가 이루어지는 인스턴스입니다.

특히 운영팀은 다음 변경 사항에 대해 반드시 테스트 후 프로덕션에 반영해야 합니다.

  • Jenkins 소프트웨어의 업데이트

  • 신규 플러그인 적용

  • CI/CD 파이프라인의 변경 및 유지보수




Jenkins를 운영하려면 서버가 필요한데, 요즘은 이 서버 역할을 Kubernetes가 대신해줍니다.

Jenkins를 클러스터에 올릴 때 Helm으로 설치하면 아주 간편하기 때문에 Helm을 사용합니다.

Helm

Helm은 Kubernetes의 다양한 리소스를 패키지처럼 묶어 관리할 수 있도록 도와주는 대표적인 Kubernetes용 패키지 매니저입니다.

마치 Ubuntu의 apt나 RedHat의 yum처럼, Helm은 Kubernetes용으로 최적화된 설치/업데이트 도구입니다.

기능

  • 패키지 검색

    • 정한 저장소에서 패키지를 검색할 수 있습니다.
  • 패키지 관리

    • 저장소에서 패키지 정보를 확인하고, 사용자 시스템에 패키지를 설치하거나 삭제, 업그레이드, 롤백할 수 있습니다.
  • 패키지 의존성 관리

    • 패키지를 설치할 때, 의존성 관계에 있는 소프트웨어를 함께 설치하며, 삭제 시에는 불필요해진 소프트웨어도 함께 제거합니다.
  • 패키지 보안 관리

    • 디지털 인증서와 패키지 체크섬을 통해 해당 패키지나 그 의존성들이 변조되지 않았는지를 확인할 수 있습니다.



✏️ 회고

Jenkins를 따로 설치하지 않고 클러스터 위에서 운영할 수 있다는 개념이 신기했습니다. Helm으로 쉽게 설치할 수 있다는 점도 놀라웠지만, 그만큼 다양한 도구를 익혀야 한다는 현실이 쉽지만은 않다는 걸 느꼈습니다.

profile
🌱개발 기록장

0개의 댓글