설치

환경

젠킨스는 자바로 개발되었으며 서블릿 컨테이너 위에서 구동된다. 

톰캣이나 제티(Jetty) 같은 서블릿 컨테이너를 써도 되며 Winstone 이라는 경량 컨테이너를 내장하고 있으므로 Java Runtime 만 있으면 바로 사용할 수도 있다.

설치 파일은 war 파일로 제공되지만 윈도에서는 msi, RHEL 에서는 rpm 등의 운영체제 전용 설치 패키지도 제공하고 있다. 

전용 패키지로 설치해도 되지만 개인적으로 선호하는 방법은 톰캣이나 제티(Jetty)같은 서블릿 컨테이너를 설치하고 이 위에 war 파일로 구동하는 방법이다.

자바로 개발 되었으므로 JRE 가 필요하며 JRE 는 OpenJDK 보다는 오라클이 배포하는 JRE 를 사용하기를 권장한다. 톰캣을 설치한 독자라면 JRE 가 이미 설치되어 있을 것이다.

설치되지 않은 독자는 톰캣 설치 부분을 참고하여 설치하자.

빌드는 CPU와 메모리, 디스크를 많이 소비하는 작업이다.

지속적인 통합 서버는 동시에 여러 개의 빌드를 수행하고 결과물을 갖고 있어야 하므로 이슈 관리나 버전 관리, 아티팩트 관리보다 더 많은 하드웨어 자원이 필요하다.

별도의 서버가 있다면 젠킨스 전용으로 분리시키고 그럴 여유가 없다면 젠킨스를 구동하는 WAS 에 메모리와 디스크를 여유있게 할당하도록 하자.

젠킨스 홈 디렉토리

젠킨스는 데이타 베이스를 사용하지 않고 모든 설정 파일 및 빌드 데이타를 파일로 관리한다.

이런 데이타가 저장되는 곳이 젠킨스 홈 디렉터리이며 기본적으로 젠킨스를 구동한 계정의 .jenkins 디렉터리로 설정된다.

사용자의 홈 디렉터리에 저장되면 사용자가 실수로 삭제할 수 있으며 운영자가 관리하기 힘드므로 별도의 경로로 분리해서 사용하는 것을 권장한다.

이런 용도로 적당한 디렉터리는 /var 디렉터리이다. 리눅스 설치시에 /var 에 용량을 많이 할당해야 하는 이유도 이런 이유이다.

먼저 관리자 권한으로 젠킨스를 구동할 계정을 생성하자. 계정명은 jenkins 라고 가정하겠다.

addgroup jenkins

adduser jenkins -g jenkins

이제 젠킨스 홈 디렉터리를 /var 밑에 생성하고 소유자를 젠킨스 구동 계정으로 변경해 보자. 전체 경로는 /var/jenkins 이다.

mkdir /var/jenkins
chown jenkins:jenkins /var/jenkins 


WAS 설치

제티도 좋은 서블릿 컨테이너지만 우리는 톰캣에 대해서 학습했으므로 톰캣으로 젠킨스를 설정해 보자.

이제 젠킨스 사용자로 로그인하여 나머지 설치 작업을 진행하자.

먼저 톰캣을 설치해야 한다. 톰캣 버전은  전 장에서 설치한 것과 동일한 버전을 설치하면 된다. 먼받아 놓은 톰캣이 있다면 압축을 해제해 주고 없다면 새로 받자.

  1. 톰캣 공식 사이트(http://tomcat.apache.org/download-70.cgi)에서 7.x 버전의 마지막 버전을 다운로드한다. 현재 버전은 7.0.54 이다.

  2. 다운로드 받은 톰캣의 압축을 해제한다.

    tar zxvf apache-tomcat-7.0.54.tar.gz

  3. 어떤 용도의 톰캣인지 알 수 있게 심볼릭 링크를 건다.

    ln -s  apache-tomcat-7.0.54 jenkins

  4. 압축이 해제된 디렉터리로 이동한다.

    cd jenkins

  5. 젠킨스는 많은 자원을 필요로 한다. VM 에 별도의 옵션을 주기위해 bin/setenv.sh 파일을 만들고 다음 내용을 추가하자.

    #!/bin/sh

    # VM의 초기 크기
    MIN_MEMORY="512m"
    # VM 의 최대 크기. 큰 어플리케이션을 구동하거나 시스템에 메모리 여유가 있다면 늘리는 것을 권장한다.
    MAX_MEMORY="2048m"
    # permanent space 영역의 크기를 지정한다.
    MAX_PERM_SIZE="512m"
    # 최종 JVM 옵션
    JAVA_OPTS="-Xms${MIN_MEMORY} -Xmx${MAX_MEMORY} -XX:MaxPermSize=${MAX_PERM_SIZE} ${JAVA_OPTS}"

    위는 예시일 뿐이며 하드웨어의 자원에 따라 적절하게 가감하자.

  6. conf/server.xml 을 설정한다. 

    <Server port="8005" shutdown="SHUTDOWN">

    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>

    <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />-->

    </Server>

    Server port=8005 : 8005 가 기본 포트이지만 한 서버에 여러 톰캣을 구동했을 경우 포트를 변경해 주어야 한다.
    Connector port=8080 : 8080이 기본 포트이지만 마찬 가지로 다른 톰캣이나 서비스가 있다면 변경하자. 변경시 SSL 이 사용하는 포트인 8443 도 같이 변경해야 한다. 한글이 깨지지 않기 위해서는 커텍터 설정에 URIEncoding 부분을 추가해야 한다.
    Connector port=8009 : 이 책에서는 젠킨스를 아파치의 mod_proxy 로 연동할 것이므로 AJP Connector 는 주석 처리해도 된다. 혹시 mod_jk 로 연결하고 싶은 독자는 주석 처리하지 말고 AJP 커넥터를 사용하자.

  7. 톰캣에 포함되어 있는 manager, host-manager 등의 기본 웹 어플리케이션은 필요가 없으니 삭제해도 된다. (선택). webapps 디렉터리는 지워지지 않게 주의하자.

    rm -rf webapps/*


젠킨스 설치

젠킨스 설치전에 수행할 중요한 설정이 있다. 

우리는 젠킨스 홈 디렉터리를 변경할 것이므로 젠킨스 설치전에 해당 항목을 설정해야 한다.

젠킨스는 JENKINS_HOME 환경 변수가 설정되어 있는 경우 지정된 경로를 "젠킨스 홈 디렉터리"로 사용하며 설정되지 않으면 구동한 사용자의 .jenkins 를 사용하므로 사용자의 설정에 환경 변수 설정 부분을 넣어야 한다

jenkins 계정의 .bash_profile 에 export JENKINS_HOME=/var/jenkins 를 추가하자.

export JENKINS_HOME=/var/jenkins

설정을 마쳤으면 source 명령어로 환경 변수를 반영하자.

source ~/.bash_profile

정상 설정 여부는 echo 명령어로 환경 변수의 설정 유무를 확인하면 된다.

$ echo $JENKINS_HOME

/var/jenkins

이제 젠킨스 설치 파일을 다운로드 받자. 젠킨스는 매주 버그를 수정하고 새 기능을 추가한 버전을 출시한다.

사용자의 요구에 매우 발빠르게 대응하는 셈이지만 반대 급부로 새로운 버그등이 발생할 수 있다.

안정적인 버전의 젠킨스를 사용하고 싶은 사용자를 위해 중요한 버그만 잡은 안정 버전을 별도로 제공하며 이를 우분투 리눅스처럼 LTS(Long-Term Support) 버전이라고 한다.

일반적으로 LTS 를 사용해서 개발 환경을 만드는 것을 선호하므로 마지막 LTS 버전을 다운로드 받아 보자.

LTS 는 젠킨스 홈페이지에서 LTS 탭을 누르면 다운로드 받을 수 있다. 이 책을 쓰는 현재 마지막 LTS 버전은 1.565.1 이다.

  1. 젠킨스 war 파일을 다운받는다.

    curl -L -O http://mirrors.jenkins-ci.org/war-stable/latest/jenkins.war

  2. war 파일이므로 톰캣의 webapps 에 옮기면 바로 사용이 가능하지만 여기서 잠깐 고민해 보자.
    war 파일명이 jenkins.war 이므로 sername/jenkins 로 연결해야 사용이 가능하다.
    이것보다는 http://ci.example.com 이나 http://jenkins.example.com 처럼 뒤에 컨텍스트 경로없이 연결하는게 URL 외우기가 더 좋다. 이를 위해서는 젠킨스를 루트 컨텍스트로 구동해야 한다.
    여러 가지 방법이 있지만 가장 손쉬운 방법인 war 파일을 ROOT.war 로 이름을 변경하자.

    mv jenkins.war webapps/ROOT.war

  3. 톰캣을 구동하면 ROOT.war 가 디플로이된다.

    ./bin/startup.sh

  4. 정상적으로 구동됐는지 로그 파일을 확인한다.

    tail -f logs/catalina.out 

    다음과 같은 메시지가 표시되면 정상 구동된 것이다.

    로그파일 결과



아파치 연동

젠킨스를 구동한 서버의 IP와 포트로 연결하는 것 보다는 ci.example.com 이나 jenkins.example.com 으로 연결하는 게 더 편리하다.

이를 위해서 아파치 웹서버와 젠킨스를 연동해 보자. 연결 방법은 mod_proxy 를 사용할 것이다.

  1. conf/httpd-vhost.conf 에 가상 호스트를 추가한다. 이 파일은 RHEL 이나 CentOS 의 기본 설정 파일이 아니므로 conf/httpd.conf 의 마지막에 Include conf/httpd-vhost.conf 가 추가되어야 한다.

    <VirtualHost *:80> 

    ServerName ci.example.com 

    ServerAlias jenkins.example.com

    CustomLog logs/ci-access_log combined 

    ErrorLog logs/ci-error_log

    ProxyRequests Off 

    ProxyPreserveHost On

    <Proxy *> 

    Order deny,allow 

    Allow from all 

    </Proxy>

    ProxyPass / http://localhost:8080/ 

    ProxyPassReverse / http://localhost:8080/ 

    </VirtualHost>

  2. 아파치 웹서버가 젠킨스 포트에 연결할 수 있게 SELinux 설정을 변경한다. 8080 이 아니라 다른 포트일 경우 해당 포트를 명시하고 -m(--modify) 옵션 대신 -a(--add) 옵션을 사용하자.

    semanage port -m -p tcp -t http_port_t  8080

  3. 아파치 웹서버를 재구동한다.

    service httpd restart

  4. 웹 브라우저로 연결하여 다음과 같은 대시보드 화면이 보이면 정상 설치된 것이다.

    젠킨스 대쉬보드