9. Jenkins

9. Jenkins
  • 공식 사이트 – https://jenkins.io/

너무나 유명하여 소개하기 민망한 Jenkins입니다. Gitlab에도 내부에 CI가 있어 빌드/테스트를 자동화 할 수 있습니다. 저희도 Gitlab CI를 사용하지만, 대부분의 경우는 Jenkins를 사용하고 있고, Build Monitor Plugin을 통해서 항상 빌드를 보고 있습니다.

빌드 모니터 – jenkins.io에서 가져옴

Jenkins도 LDAP을 통해서 계정 통합을 할 수 있지만 저희는 Jenkins와 Sonar 의 경우 gitlab 인증을 하고 있습니다. 어떻게 구성해도 결국은 LDAP에 인증 받는 것이지만 다음과 같은 이유로 gitlab인증이 가능한 경우 그것을 우선적으로 사용하고 있습니다.

  • gitlab에 로그인 되지 않는 경우 jenkins에 로그인 되는 것이 의미가 없다
  • LDAP없이 gitlab이 standalone으로 사용 될 수도 있다(외부 사이트에 파견나가서 현지에 gitlab을 별도로 설치하는 경우).
  • Directory 서버에는 계정을 만들지 않고 gitlab 내부 DB에 Standard로 계정을 생성 하는 경우(외주 직원등)에도 Jenkins는 로그인 되어야 한다.

물론 gitlab 이 다운되면 Jenkins와 Sonar에 로그인 할 수 없는 것이 단점입니다.

설치

리눅스 서버에 ~/docker/jenkins 디렉토리를 만들고 다음 명령을 수행합니다.

sudo docker run  --detach \
     --publish 8005:8080 \
     --publish 8006:50000 \
     --name jenkins \
     --restart always \
     --volume /home/anakin/docker/jenkins/data:/var/jenkins_home \
     --volume /var/run/docker.sock:/var/run/docker.sock \
     -e JENKINS_OPTS="--prefix=/jenkins" \
     -e JAVA_OPTS="-Duser.timezone=Asia/Seoul -Dhudson.model.DirectoryBrowserSupport.CSP=" \
     jenkins/jenkins

jenkins는 https://dev.example.io/jenkins 로 연결 됩니다. 따라서 –prefix=/jenkins가 필요합니다. 정상적으로 수행되었다면, purple.example.io:8005/jenkins 에서 페이지가 뜨게 될것입니다.

Reverse Proxy

이 방법은 DSM7 에서 동작 하지 않는것 같습니다. 주의 바랍니다.

이제 https://dev.example.io/jenkins 로 들어오기 위해서는 이제 까지 사용했던 응용 프로그램 포탈을 사용할 수 없습니다. 호스트명이 git, wiki 처럼 아예 달라야 virtual host 를 사용할 수가 있는데, dev.example.io로 호스트명은 같기 때문에(앞으로 연결될 sonar, nexus등과) dev.example.io 로 들어온다음 path에 따라 분기해야 합니다. 우리는 Synology Web Station으로 nginx를 선택 했기 때문에 Synology의 nginx설정을 변경해야 합니다.

nginx설정을 바꾸기 위해서는 NAS에 ssh로 접속해야 합니다. 제어판-터미널 및 SNMP를 선택하시고 터미널 탭에서 SSH 서비스 활성화를 체크 하십시오. 포트는 보통 디폴트인 22에서 임의의 포트로 변경하시는 것이 보안상 낫습니다. 포트를 2201로 바꾸고 적용을 누릅니다.

SSH 설정

이제 터미널 에서 ssh -p 2201 admin@work.example.io 로 접속합니다. 파일 /etc/nginx/app.d/server.webstation-vhost.conf 를 열어서 include /usr/local/etc/nginx/conf.d/XXXXXXXXXXXX/user.conf*; 부분을 확인하고 XXXXXXXXXXXX 부분을 복사해 둡니다.
/etc/nginx/conf.d 로 이동하여 ls 명령으로 위에서 확인한 XXXXXXXXXXXX 디렉토리로 이동합니다. 여기에 다음 내용으로 user.conf.jenkins 파일을 만듭니다.

location /jenkins {
     proxy_set_header        Host                $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;
     proxy_set_header        X-Forwarded-Host    $host:$server_port;
     proxy_set_header        X-Forwarded-Server  $host;
     proxy_http_version      1.1;
     proxy_request_buffering off;
     proxy_redirect http://purple.example.io:8005/jenkins https://dev.example.io/jenkins;
     sendfile off;
     proxy_pass http://purple.example.io:8005/jenkins;
     proxy_read_timeout 90;
     add_header 'X-SSH-Endpoint'    'dev.example.io:50022' always;
 }

다음 명령으로 nginx 를 재시작 하고 브라우저에서 https://dev.example.io/jenkins 로 접속했을때 정상적으로 뜬다면 성공입니다.
sudo synoservice –restart nginx

Gitlab 인증

앞으로 계정통합 작업등을 하다가 무언가 잘못되어 jenkins에 로그인 할 수 없게 되는 경우에는 ~/docker/jenkins/data/config.xml 을 열어서 <useSecurity>true</useSecurity> 이 부분을 찾아 false로 바꾸고 재시작 하시면 로그인 없이 다시 설정 하실 수 있습니다.

Gitlab에서

gitlab에 어드민으로 로그인 합니다. Admin Area에서 Applications 를 선택 합니다. New application을 클릭하고 다음 항목을 채워 넣습니다.

  • Name : Jenkins
  • Redirect URI : https://dev.example.io/jenkins/securityRealm/finishLogin
  • Trusted : check 해줍니다.
  • Scope 에서 api, read_user, read_repository, write_repository, email 등을 check 해 줍니다.

Submit 해줍니다. 이때 화면에 Application ID와 Secret 이 나오는데 둘다 text editor 등에 복사해 둡니다. 화면을 빠져 나가면 다시 알아낼 방법이 없습니다. 연동될 때 까지 반드시 어딘가 저장해 두어야 합니다.

Jenkins 에서

Jenkins에 Admin으로 로그인 한후 (아직 security가 적용되지 않았다면 로그인 없이 바로 admin 상태 일것입니다), Jenkins 관리-plugin 관리로 들어갑니다. 설치 가능 탭을 선택 하시고 gitlab을 검색 하시고, 아래 플러그 인들을 설치해 줍니다.

설치후 Jenkins 관리-Configure Global Security로 들어 갑니다. Enable security를 누르시고 Security Realm 에서 Gitlab Authentication Plugin 을 선택 합니다. Gitlab Web URI와 Gitlab API URI에 https://git.example.io 를 입력하시고 Client ID에는 아까 gitlab에서 취득한 Applicaiton ID를 Client Secret에는 gitlab 에서 취득한 Secret을 입력하십시오.

Authorization은 각 회사의 상황에 맞게 지정하시면 되는데, 보통은 Gitlab Commiter Authorization Strategy를 이용하시면 gitlab의 권한과 동일하게 유지할 수 있습니다. 저희는 프로젝트 별로 좀더 세분화 하기 위해 Project-based Matrix Authorization Strategy를 사용하고 있습니다. 그래서 gitlab 에서와는 좀 다른 접근 권한을 가질수도 있습니다(프로젝트 관련자는 아니지만 빌드 버튼은 누르게 해준다거나 하는 경우).

이제 Jenkins 페이지로 진입하면 gitlab의 로그인 페이지가 보이게 되며, gitlab에 로그인하면 jenkins에도 로그인 됩니다.

Triggered Build

gitlab에 코드를 push 하면 자동으로 jenkins가 빌드를 시작할 수 있도록 구성 합니다. jenkins 프로젝트 구성-빌드 유발 에서 “Build when a change is pushed to Gitlab.”을 체크 합니다(해당 항목이 없다면 플러그인이 설치 되지 않은 것입니다. 플러그인 관리에서 gitlab 플러그인을 설치해 줍니다). Push Events 를 체크 합니다. 고급을 눌러 Secret token을 저장 합니다. 비어있다면 Generate 를 눌러서 token을 생성하면 됩니다.

Gitlab 프로젝트의 Settings-Integrations에서 webhook을 하나 만듭니다. URL에 https://dev.example.io/jenkins/project/<Jenkins 프로젝트명> 을 입력하고 Secret Token에 Jenkins에서 생성한 토큰을 입력 합니다. Trigger의 Push events 를 체크 하고 저장한 다음 Test를 눌러서 Jenkins가 빌드를 시작하는지 확인 합니다.

3 comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다