Jenkins

개요

서버 어플리케이션에 기능을 추가 하려면 개발자가 개발자의 로컬 컴퓨터에서 개발을 완료 하고, 테스트까지 한 다음에 이상이 없으면 사용자가 사용할 수 있게 수정된 내용을 서버에 반영해야 한다. 여기서 서버에 반영을 하는 것을 ‘배포’라고 하고 배포 하기 위한 준비 과정을 ‘빌드’라고 한다.

Build란?

빌드는 서버에 올릴 수 있는 상태로 만드는 것을 빌드라고 하고, 서버에 올려서 사용자가 사용 할 수 있게 하는 것은 배포(Deploy)라고 한다.
예를 들어, SpringBoot 어플리케이션을 쿠버네티스에 배포하는 경우 먼저 Maven이나 Gradle로 빌드를 해서 .jar이나 .war를 만든 후 Docker 빌드를 해서 Docker Image를 만든다. 그리고 k8s에서 .yml파일에 이미지 버젼이 바뀐것을 반영하게 된다.

Build를 자동화 해야하는 이유

빌드는 하루에 한번을 할 수도 있고 안할수도 있지만 1주일, 1달로 따지면 꽤 많이 한다. 그리고 이게 1년이면 꽤 많은 시간이라고 할 수 있다.

예를들면, 옛날에는 자바를 빌드 할 때 javac라는 커맨드를 직접 사용 했지만, 지금은 IDEA를 이용하면 main() 메소드를 실행했을 때 javac를 하고 java가 실행이 된다. 이렇게 반복되는 과정은 버튼 하나 또는 단축키로 자동화 시킬 필요가 있다.

왜냐하면 이 작업을 하는데도 집중력, 긴장감 등이 소모 되기 때문이다. 그리고 빌드는 시간이 꽤 걸리는 작업인데(최소 30초 이상 걸림) 빌드를 실행 시키고 나서 빌드가 될 때까지 기다리는 시간도 모아보면 엄청 긴 시간이다.

개발자의 작업 시간을 최소화 하기 위해서는 최대한 반복작업은 자동화 할 필요가 있다.

Jenkins 개요

위에서 설명하였듯이 개발자에게 번거로운 개발 소스 빌드를 자동화 해주는 도구이다.

Jenkins
Jenkins 공식 사이트

Jenkins(젠킨스)는 개발 작업의 자동화를 목적으로 Java로 구현된 오픈 소스의 서버 소프트웨어(CI 도구)로써, 주로 다음 두 가지 기술적 실현에 도움이 된다.

  • 지속적 통합(CI)
    • 소프트웨어 개발 프로세스 전체의 단순 작업 자동화
  • 지속적인 전달 (CD)
    • 지속적인 통합으로 완성 된 소프트웨어를 테스트 및 프로덕션 환경에 자동으로 배포

Jenkins(젠킨스) 자체는 war 파일로 제공되며 Apache Tomcat과 같은 서블릿 컨테이너에 배포하여 시작할 수 있다.
또, 이 war 파일은 서블릿 컨테이너의 기능도 포함한 실행 가능한 형식으로 빌드되고 있어, java -jar jenkins.war 와 같이 단독으로 실행할 수도 있다.

Jenkins(젠킨스)는 AccuRev, CVS, Subversion, Git, Mercurial, Perforce, ClearCase, RTC 등의 SCM 도구를 지원하며 Apache Ant 및 Apache Maven 기반 프로젝트뿐만 아니라 모든 쉘 스크립트 및 Windows 배치 명령 실행할 수 있다.

빌드는 다양한 트리거로 실행할 수 있다. 예를 들어 버전 제어 시스템에 커밋하는 cron과 같은 메커니즘을 통해 스케줄링하는 특정 빌드 URL에 요청을 보내도록 지정할 수 있다.
또한, 큐에 있는 다른 빌드가 완료되었음을 트리거로 다음 빌드를 실행할 수도 있다.

Jenkins(젠킨스)는 원래 Sun Microsystems에서 Hudson(허드슨)이라는 이름으로 개발되었지만. Oracle이 Sun을 인수한 후 Hudson이라는 이름을 상표 등록했기 때문에 Jenkins로 개명되어 독립적인 오픈 소스 프로젝트 중 에서 개발이 계속되고 있다. Jenkins (젠킨스)의 가장 큰 기술적 장점 중 하나는 확장 가능하다는 것이다. 이 외에도 커뮤니티는 향상 요청을 매우 환영하기 때문에 현재 1200개 이상의 플러그인이 있으며 수백 명의 개발자가 매월 새로운 플러그인을 만들고 공식 업데이트 센터에서 사용할 수 있다.

2016년에는 버전 2가 출시되어 지속적인 전달을 위한 파이프라인이 표준으로 통합되었다.
Jenkins의 개발은 활발하며 출시는 거의 매주 진행된다.

Jenkins의 주요 특징

  • 지속적 통합(CI) 및 지속적 전달(CD)
    • 확장 가능한 자동화 서버이므로 간단한 CI 서버로 사용하거나 임의 프로젝트에 대한 지속적인 전달의 허브로 사용할 수 있다.
    • Jenkins는 Java로 개발된 오픈 소스 지속적 통합(CI) 서버형 도구이다.
    • 소프트웨어 빌드 > 검증 > 서버 설치의 일련을 자동화를 할 수 있게 해준다.
  • 간편한 설치
    • Jenkins는 자체 완성된 Java 기반 프로그램이며 Windows, Mac OS X 및 기타 Unix 기반 OS용 패키지로 즉시 실행할 수 있다.
    • 또한 Docker 이미지도 배포되므로 Docker에서 바로 실행할 수 있다.
  • 구성하기 쉽다
    • 즉각적인 오류 검사와 내장 도움말이 포함된 웹 인터페이스를 통해 쉽게 설정하고 구성할 수 있습니다.
  • 다양한 플러그인
    • 빌드를 하는 환경도 다양하고 빌드를 할 때 바꿔 주어야 하는 옵션도 다양하고 각각 개발 환경과 개발한 언어도 다 다르다.
    • 이런 것들을 커버하기 위해 젠킨스는 다양한 플러그인을 제공한다.
    • 업데이트 센터의 1800개 이상의 플러그인을 통해 지속적인 통합과 지속적인 전달에 다양한 기능을 통합할 수 있다.
    • 작업 단위 관리할 수 있고 플러그인으로 기능 확장이 가능하다.
  • 확장 가능
    • 플러그인 아키텍처를 통해 확장함으로써 Jenkins가 할 수있는 일에 대한 무한한 가능성을 제공합니다.
  • 대쉬보드 제공
    • 여러가지 배포 작업의 상황을 모니터링 할 수 있다.
  • 배포 스크립트 실행기능
    • 배포 스크립트를 개발자 로컬에서도 실행 할 수 있는데 젠킨스 프로그램을 띄워놓으면 스케쥴링을 할 수 있다.
  • 분산형
    • 여러 플랫폼에서 빌드, 테스트 및 배포를 신속하게 실행할 수 있도록 여러 컴퓨터에 작업을 분산시킬 수 있다.

젠킨스와 허드슨

Jenkins 프로젝트는 원래 Hudson 이라는 이름이었으나, 오라클과의 상표권 분쟁으로 인해 Jekins라는 이름으로 변경되었다.

2004년에 코스케 가와구치는 썬(Sun Microsystems)의 자바 개발자였다. 가와구치는 개발 작업에서 빌드를 깨는 것에 질려서, 코드를 리포지토리에 커밋하기 전에 해당 코드의 동작 여부를 알 수 있는 방법을 찾고 싶었다. 그래서 가와구치는 자바에서 이를 가능케 하는 자동화 서버를 자바로 개발했고, 허드슨이라는 이름을 붙였다. 허드슨은 썬에서 유명해졌으며, 오픈소스로 다른 기업들에게 확산됐다.

2011년으로 접어들면서, (썬을 인수한) 오라클 그리고 독자적인 허드슨 오픈소스 커뮤니티 간의 분쟁으로 젠킨스란 새로운 이름을 달고 갈라지게 되었다. 두 분류 모두 존속했지만, 젠킨스가 훨씬 더 활동적이었다. 2014년에 가와구치는 젠킨스 기반의 지속적 배포(Continuous Delivery, CD) 제품을 공급하고 있는 클라우드비즈(CloudBees)의 CTO가 되었다.

Jenkins의 운영 환경

전제가 되는 동작 환경은 다음과 같다.

  • OS

    • 도커
    • 우분투 / 데비안
    • CentOS / Fedora / Red Hat
    • Windows
    • openSUSE
    • FreeBSD
    • macOS
  • 하드웨어 최소 구성

    • 256MB RAM
    • 1GB의 여유 공간(단, Jenkins를 Docker 컨테이너로 실행하는 경우 10GB 이상을 권장한다)
  • 미들웨어 요구 사항

    • Java 8 - JRE(Java Runtime Environment) 또는 JDK(Java Development Kit).
    • OpenJDK JDK/JRE 8 - 64비트
    • OpenJDK JDK/JRE 11 - 64비트
  • 동작 대상 브라우저

    • Google 크롬
    • Mozilla Firefox
    • Microsoft Edge
    • Apple Safari

Jenkins 라이센스

Jenkins는 MIT 라이센스의 오픈 소스 소프트웨어이다. MIT 라이센스의 소프트웨어는 무상으로 재배포, 상용 이용 등이 가능해지고 있어, 다른 오픈 소스 라이센스에 비해 제한이 매우 느슨한 라이센스이다.

참고