jenkins 를 설치하는데 계속 검색하기도 귀찮고 해서 간단하게 남겨볼까 합니다.

최신버전의 jenkins 는 jdk11 을 지원하지만, 아직 불안정하다는 공식 문서에 의해 jdk8 기반으로 진행할 예정입니다.

실습을 시작하기 전 nginx 설치와 인증서 발급과 디피헬만 그룹 생성은 완료해 주시기 바랍니다. (nginx 설치하기, 인증서 발급받기 참고) 또한 필자의 domain 은 jenkins.kscory.com 로 진행합니다.

java 설치 및 환경변수 설정

설치는 공식문서 기반으로 진행합니다.

# 패키지 업데이트
$ sudo apt-get update

# jdk 파일 다운
$ sudo apt-get install openjdk-8-jdk

# 경로 확인
update-java-alternatives -l # jdk1.8 path 확인

# 환경변수 설정
$ echo 'JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-amd64"' | sudo tee -a /etc/environment

# path 적용
$ source /etc/environment

# java 버전 확인
java -version

아래와 같은 결과가 나오면 됩니다.

openjdk version "1.8.0_232"
OpenJDK Runtime Environment (build 1.8.0_232-8u232-b09-0ubuntu1~18.04.1-b09)
OpenJDK 64-Bit Server VM (build 25.232-b09, mixed mode)

jenkins 설치

젠킨스 설치 또한 공식문서 를 기반으로 진행합니다.

# 시스템에 저장소 키 추가 (OK 나오는지 체크)
$ wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -

# 데비안 패키지 저장소 주소 추가
$ echo "deb https://pkg.jenkins.io/debian-stable binary/" | sudo tee /etc/apt/sources.list.d/jenkins.list

# 패키지 업데이트
$ sudo apt-get update

# 젠킨스 설치
$ sudo apt-get install jenkins

nginx proxy 설정

nginx 설정은 Jenkins wiki 를 바탕으로 진행됩니다.

먼저 proxy param 을 수정합니다. 이 파일은 /etc/nginx/proxy_params 에 위치합니다.

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

# Required for new HTTP-based CLI
proxy_http_version 1.1;
proxy_request_buffering off;
proxy_buffering off; # Required for HTTP-based CLI to work over SSL

그 다음으로 ssl config 를 설정합니다. 이 파일은 /etc/nginx/snippets/ssl-params.conf 에 위치합니다.

ssl_protocols TLSv1.3;# Requires nginx >= 1.13.0 else use TLSv1.2
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_timeout  10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
resolver 8.8.8.8 8.8.4.4 valid=300s; # resolver $DNS-IP-1 $DNS-IP-2 valid=300s;
resolver_timeout 5s; 
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

마지막으로 proxy를 위한 nginx 설정을 합니다. 파일은 /etc/nginx/sites-available/proxy.conf 에 위치합니다.

아래에서 주목해야 할 디렉티브는 proxy_redirect 부분입니다. 이 설정은 jenkins 에서 응답이 redirect 로 일어났을 때 그대로 클라이언트에 전달하게 되면 localhost 로 클라가 접속하려 하게 됩니다. 따라서 jenkins 에서 redirect 가 일어났을 경우 우리가 원하는 url 로 변경해서 전달하도록 하는 설정입니다.

server {
  listen  80;
  server_name jenkins.kscory.com;

  access_log /var/log/nginx/proxy/access.log;
  error_log /var/log/nginx/proxy/error.log;

  location ~ /\.well-known/acme-challenge/ {
    allow all;
    root /var/www/letsencrypt;
  }

  location / {
    return 301 https://$server_name$request_uri;
  } 
}

server {
  listen  443 ssl http2;
  server_name jenkins.kscory.com;

  access_log /var/log/nginx/proxy/access.log;
  error_log /var/log/nginx/proxy/error.log;

  ssl_certificate /etc/letsencrypt/live/jenkins.kscory.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/jenkins.kscory.com/privkey.pem;

  include snippets/ssl-params.conf;

  location / {
    include /etc/nginx/proxy_params;
    proxy_pass http://localhost:8080;
    proxy_read_timeout 90;
    proxy_redirect http://localhost:8080 jenkins.kscory.com;

    # workaround for https://issues.jenkins-ci.org/browse/JENKINS-45651
    add_header 'X-SSH-Endpoint' 'jenkins.domain.tld:50022' always;
  }
}

nginx 설정에 오류가 없다면 다시 실행시켜 줍니다.

# 오류 확인
sudo service nginx configtest

# 다시 실행
sudo service nginx restart

jenkins 서버 설정

젠킨스를 nginx 와 연동하려면 젠킨스 서버가 모든 인터페이스(0.0.0.0) 이 아니라 localhost 혹은 젠킨스의 IP 주소나 도메인을 통해서만 동작하게 설정해서 기존의 8080 포트로 접근하는 것을 방지하도록 하겠습니다.

/etc/default/jenkins 설정파일을 열어 JENKINS_ARGS 부분을 아래처럼 수정합니다.

# "--httpListenAddress={jenkins 의 ip address}" 추가
JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT --httpListenAddress=127.0.0.1"

그 후 젠킨스를 다시 실행하겠습니다.

# 젠킨스 재실행
$ sudo service jenkins restart

# 동작 확인
$ sudo service jenkins status

jenkins 테스트

그럼 이제 proxy 로 적용한 jenkins 에 접근해보겠습니다. 아래 사진과 같이 접속이 되었다면 설정이 완료된 것입니다.

jenkins-install-01

그럼 초기 패스워드를 입력해서 완료하겠습니다. ui 에 나와있듯이 처음 패스워드는 /var/lib/jenkins/secrets/initialAdminPassword 에 위치해 있습니다. 아래 명령어의 결과를 붙여 넣도록 합니다.

$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword

그러면 아래와 같은 사진이 나올 것입니다.

jenkins-install-02

install suggeted plugins 를 클릭해서 기본 플러그인들을 다운받겠습니다.

jenkins-install-03

기본 플러그인들이 설치되면 이제 초기 계정을 만들라는 화면이 나옵니다. 관리자 계정을 추가하고 넘어가도록 하겠습니다.

jenkins-install-04

그 후 domain 설정을 합니다. 저는 https://jenkins.kscory.com/ 으로 설정했습니다.

jenkins-install-05

이제 아래와 같이 젠킨스 메인 화면이 나왔다면 설치에 성공한 것입니다.

jenkins-install-06

마무리

젠킨스 설치하는 방법에 대한 포스팅이 끝났습니다. 이제 툴을 설치했으니 잘 사용하는 방법만 남았겠네요. ^^

참고 자료

https://kkensu.tistory.com/58

https://wiki.jenkins.io/display/JENKINS/Jenkins+behind+an+NGinX+reverse+proxy

https://www.digitalocean.com/community/tutorials/how-to-configure-jenkins-with-ssl-using-an-nginx-reverse-proxy-on-ubuntu-18-04