::: IT인터넷 :::

리눅스 Docker 컨테이너를 Jenkins 에이전트로 연결하기 (via. SSH)

정보보안썰문가 곰탱이푸우 2021. 8. 16. 08:20
반응형

이전 포스팅에서 jenkins/ssh-agent의 Dockerfile에 Anaconda를 추가하여 Python 빌드를 위한 리눅스 Docker 이미지를 생성하고 배포했다.

자세한 내용은 아래 포스팅을 참고한다.

 

Docker로 Jenkins의 Python 빌드 에이전트 만들기

시놀로지 NAS는 리눅스 기반의 운영체제를 기반으로 한 DSM으로 동작한다. 시놀로지 NAS에 Docker를 기반으로 셋팅한 Jenkins 역시 리눅스 기반이다. 시놀로지 NAS에 Jenkins 구축하기 현재 근무 중인 회

www.bearpooh.com


이제 해당 도커 이미지를 사용해서 컨테이너를 생성하고 Jenkins에 에이전트로 등록해야 한다.

윈도우 환경에서는 Java의 JNLP 파일을 실행하는 방법을 사용했다.
윈도우 가상 환경을 Jenkins로 등록하는 방법은 아래 포스팅을 참고한다.

 

시놀로지 VMM의 윈도우 가상 환경을 Jenkins에 에이전트로 연결하기

Jenkins 자체에 포함 된 빌드 기능을 이용하면 빌드 수행이 가능하다. 그러나 별도의 빌드 에이전트를 Jenkins에 빌드 에이전트로 등록해서 사용할 수 있다. 예전에 개발팀에 있을때 Bamboo에 빌드머

www.bearpooh.com


그러나 리눅스 기반 Docker 컨테이너에서는 SSH 통신을 이용하여 연결한다.

  • 이미지 생성에 사용한 openjdk:8-jdk-buster 이미지는 Debian 리눅스를 사용했다.
  • 해당 이미지에 systemd과 systemctl이 없어 서비스 등록이 불가능하다.
  • 설치를 해도 정상 동작하지 않는다.

 


이러한 이유로 SSH를 이용한 방법을 사용한다.
시놀로지 NAS에서 Docker 컨테이너를 생성하고 Jenkins에 에이전트로 등록하는 방법을 중심으로 정리한다.

일반적인 환경에서 진행하는 방법은 아래 포스팅을 참고한다.

 

[Docker] 젠킨스 SSH 키 생성 및 master-slave 컨테이너 설정

실제 관리 기능이나 작업 실행 지시등은 마스터(Leader) 인스턴스가 맡고, 작업을 실제로 진행하는 것은 슬레이브(Follower) 인스턴스가 담당한다. 이러한 구성의 컴포즈로 만들어 보겠다 !! :) 1 ) mast

chati.tistory.com


다음과 같은 과정으로 진행한다.

  • Docker Network 생성
  • Jenkins Master 컨테이너 재생성
  • Jenkins Master Node에서 SSH Key 생성
  • Python Agent 컨테이너 생성
  • Python Agent 설정 변경
  • Jenkins에 Python Agent 등록
  • Python Agent 정상 연결 여부 확인

 

 

Docker Network 생성

Docker 컨테이너 이름을 사용하여 Jenkins에 에이전트로 추가하기 위해서는 동일한 네트워크에 위치해야 한다.
따라서 기존에 생성 된 Jenkins 컨테이너와 Python 빌드 에이전트의 네트워크를 동일한 네트워크로 변경해야 한다.

먼저 Synology NAS의 Docker 패키지를 실행하고 네트워크 탭을 선택한다.
상단의 추가 버튼을 클릭한다.


네트워크 이름은 Jenkins에서 사용할 것이므로 jenkins_bridge로 지정한다.


jenkins_bridge 네트워크가 정상적으로 생성되었다.
방금 생성했으므로 연결 된 컨테이너는 아직 없다.

 

 

Jenkins Master 컨테이너 재생성

이미 생성 된 컨테이너는 네트워크를 변경할 수 없다.
어쩔 수 없이 기존 Jenkins 컨테이너를 제거하고, 새로 생성한다.

Docker 패키지의 이미지 탭에서 jenkins/jenkins:latest를 더블 클릭한다.
없으면 옆의 레지스트리를 클릭하고 해당 이미지를 다운로드 하고 진행한다.


컨테이너 이름을 지정하고 고급 설정을 클릭한다.


네트워크 탭을 클릭하고 네트워크 이름에서 jenkins_bridge를 선택한다.

 


기존에 존재하던 네트워크 이름을 선택하고 삭제 버튼을 누르면 jenkins_bridge만 존재한다.


나머지 기본적인 설정은 아래 내용과 동일하다.

 

시놀로지 NAS에 Jenkins 구축하기

현재 근무 중인 회사에서는 빌드 및 배포 시스템으로 Atlassian의 Bamboo를 사용 중이다. 기능도 익숙하고 사용하기 편리하지만 상용 제품이다 보니 개인이나 소규모로 사용하기에는 부담이 있다.

www.bearpooh.com


Jenkins Master 컨테이너가 생성되면 아래 내용을 참고하여 초기 설정을 진행한다.

 

Jenkins 설치 후 초기 설정

시놀로지 NAS에서 Docker를 이용한 Jenkins 설치는 아래 포스팅을 참고한다. 시놀로지 NAS에 Jenkins 구축하기 현재 근무 중인 회사에서는 빌드 및 배포 시스템으로 Atlassian의 Bamboo를 사용 중이다. 기능

www.bearpooh.com


윈도우 가상환경을 에이전트로 등록한 경우 아래 내용을 참고하여 다시 설정한다.

 

시놀로지 VMM의 윈도우 가상 환경을 Jenkins에 에이전트로 연결하기

Jenkins 자체에 포함 된 빌드 기능을 이용하면 빌드 수행이 가능하다. 그러나 별도의 빌드 에이전트를 Jenkins에 빌드 에이전트로 등록해서 사용할 수 있다. 예전에 개발팀에 있을때 Bamboo에 빌드머

www.bearpooh.com

 

 

Jenkins Master Node에서 SSH Key 생성

Jenkins Master Node 컨테이너가 정상적으로 생성되면, 해당 쉘에 접근하여 SSH Key를 생성한다.

컨테이너 탭에서 synology-jenkins 컨테이너를 더블클릭한다.


터미널 탭을 선택하고 생성을 클릭한다.


좌측 bash를 클릭하면 우측에 터미널이 연결된다.
아래 명령을 실행하여 SSH를 생성한다.

$ ssh-keygen -t rsa -C "" 

# 더 높은 암호화를 하고자 하는 경우 다음 명령을 사용한다. 
# ssk-keygen -t rsa 4096 -C ""


passphrase는 입력하지 않고 진행한다. 더 높은 암호화를 원하는 경우 사용할 암호를 입력한다.

 


id_rsa.pub 값을 확인한다. Python Agent에 환경변수로 전달할 값이다.


id_rsa 값을 확인한다. Jenkins에 에이전트 등록 과정에서 Private Key로 사용할 값이다.


위의 두 파일은 터미널에서 복사해도 되지만, 중간에 공백이 복사 될 수 있어 권하지 않는다.
컨테이너 생성 과정에서 /var/jenkins_home 경로를 공유 볼륨으로 설정했으므로, 시놀로지 NAS의 File Station을 사용하여 다운로드한다.


위의 과정을 터미널에서 진행하려면 다음과 같이 진행한다.

$ docker container exec -it jenkins-master /bin/bash 
$ ssh-keygen -t rsa -C "" 
$ cd ~/.ssh
$ ls -al 

# jenkins-agent에 환경변수로 전달 
$ cat id_rsa.pub 

# Jenkins UI에서 Agent 등록에 사용 
$ cat id_rsa

 

 

Python Agent 컨테이너 생성

Jenkins에 에이전트로 등록할 컨테이너 생성을 위한 Docker 이미지를 다운로드한다.

Docker 이미지 생성과 배포는 다음 포스팅을 참고한다.

 

Docker로 Jenkins의 Python 빌드 에이전트 만들기

시놀로지 NAS는 리눅스 기반의 운영체제를 기반으로 한 DSM으로 동작한다. 시놀로지 NAS에 Docker를 기반으로 셋팅한 Jenkins 역시 리눅스 기반이다. 시놀로지 NAS에 Jenkins 구축하기 현재 근무 중인 회

www.bearpooh.com

 

사설 저장소로 전환

사용할 Docker 이미지를 Docker 사설 저장소에 배포했으므로, 해당 저장소에서 다운로드해야 한다.

Docker 패키지 좌측의 레지스트리를 클릭하고, 상단의 설정을 클릭한다.


해당 이미지를 배포한 사설 저장소를 선택하고 상단의 사용을 클릭한다.
사설 저장소가 없는 경우 상단의 추가 버튼을 눌러 추가한다.

 

Docker 이미지 다운로드

사설 저장소에 연결되면 이전에 배포한 Docker 이미지를 확인할 수 있다.
상단의 다운로드를 클릭하거나 해당 이미지를 더블 클릭하여 다운로드를 진행한다.


버전 (태그)를 선택한다. lastest도 배포했지만, 명확한 버전을 확인하기 위해 1.0.0을 선택했다.


이미지 크기가 약 5~7GB 정도 되어 다운로드하는데 오래 걸린다. 인내심을 갖고 기다린다.

 

Jenkins 에이전트로 사용할 Docker 컨테이너 생성

다운로드가 완료되면 해당 이미지를 더블클릭한다.


컨테이너 이름을 입력하고 고급 설정을 클릭한다.
이름은 다수의 컨테이너를 추가할 수 있으므로 01을 붙인다.


자동 재시작 활성화에 체크한다.


공유 볼륨을 지정한다.
해당 이미지의 WorkDir은 /home/jenkins이므로 /var/jenkins_home이 직접적인 영향을 주진 않는다.

 


Jenkins Master 컨테이너와 동일하게 네트워크는 jenkins_bridge를 지정하고, 기존 네트워크는 제거한다.


Jenkins Master 컨테이너에서 확인한 id_rsa.pub 파일의 값을 JENKINS_SLAVE_SSH_PUBKEY 환경 변수로 입력한다.
컨테이너 내부의 /home/jenkins/.ssh 경로에 authorized_keys 파일이 자동으로 생성된다.


모든 설정이 완료되면 다음 버튼을 클릭한다.


설정 값들을 확인하고 이상 없으면 완료를 클릭한다.

 

 

Python Agent 설정 변경

이제 가장 중요한 부분이다. 이 부분에서 설정을 제대로 해주지 않아 Jenkins에 연결되지 않는 오류가 발생했다.
원인을 제떄 찾지 못해서 가장 많은 시행 착오를 한 부분이기도 하다.

생성한 Python 에이전트의 속성을 Jenkins 에이전트로 등록에 적합하도록 변경해야 한다.

컨테이너 탭에서 jenkins-python01 컨테이너를 더블클릭한다.


터미널 탭의 생성 버튼을 클릭하고 bash를 선택하면 우측에 Bash 쉘이 출력된다.


/home/jenkins 경로의 .ssh 폴더에 있는 authorized_keys 파일을 사용하여 Jenkins Master 컨테이너에 연결할 예정이다.
해당 폴더와 파일의 소유자와 권한 정보를 확인한다.

  • .ssh 폴더의 소유자와 그룹이 root이고, 접근 권한은 rwx------ (700) 이다.
  • .ssh/authorized_keys의 소유자와 그룹도 root이고, 접근 권한은 rwx------ (700) 이다.

 


아마 Dockerfile로 이미지 생성하면서 setup-sshd를 root 권한으로 실행해서 그런 것으로 보인다.

 

Docker로 Jenkins의 Python 빌드 에이전트 만들기

시놀로지 NAS는 리눅스 기반의 운영체제를 기반으로 한 DSM으로 동작한다. 시놀로지 NAS에 Docker를 기반으로 셋팅한 Jenkins 역시 리눅스 기반이다. 시놀로지 NAS에 Jenkins 구축하기 현재 근무 중인 회

www.bearpooh.com


마지막 setup-sshd 실행 전에 USER ${user} 구문을 추가해서 jenkins 계정 권한으로 실행해야 할 것 같다.
만약 jenkins 계정 권한으로 setup-sshd를 실행할 수 없다면, 아래 내용을 참고해서 소유자와 권한을 수정한다.

(중요!) 이번 포스팅에서 가장 중요한 부분이다.
이 부분에서 몇 가지 부분을 놓쳐서 연결은 되지 않고 많은 시간을 허비했던 경험이 있어 꼼꼼하게 보아야 한다.

  • /home/jenkins/.ssh 폴더의 소유자를 jenkins로 변경한다.
  • /home/jenkins 폴더의 소유자를 jenkins로 변경한다.
  • /home/jenkins/.ssh/authorized_keys 파일의 접근 권한을 600 (rw-------)으로 변환한다.
  • /home/jenkins/.ssh 폴더의 접근 권한을 700 (rwx------)으로 변환한다.
  • /home/jenkins 폴더의 접근 권한을 700 (rwx------)으로 변환한다.


해당 폴더와 파일들의 소유자와 권한이 정상적으로 수정되었는지 확인한다.

  • /home/jenkins/.ssh 폴더의 소유자는 jenkins, 실행 권한은 700 (rwx------)이다.
  • /home/jinekins 폴더의 소유자는 jenkins, 실행 권한은 700 (rwx------)이다.
  • /home/jenkins/.ssh/authorized_keys 파일의 소유자는 jenkins, 실행 권한은 600 (rw-------)이다.


최종적으로 Jenkins 에이전트 연결 설정하면서 입력할 java의 실행 파일 경로를 확인한다.


위의 과정을 터미널에서 진행하려면 다음과 같이 진행한다.

$ docker container exec -it jenkins-python01 /bin/bash 
$ chown -R jenkins /home/jenkins/.ssh 
$ chmod 600 /home/jenkins/.ssh/authorized_keys 
$ chmod 700 /home/jenkins/.ssh 
$ chmod 700 /home/jenkins 
$ chown jenkins /home/jenkins 
$ which java

 

 

Jenkins에 Python Agent 등록

이제 모든 준비를 마쳤으므로 Jenkins에 해당 컨테이너를 에이전트로 등록한다.

Jenkins 화면에서 Jenkins 관리를 클릭한다.


우측 하단의 노드 관리를 클릭한다.


좌측의 신규 노드를 클릭한다.


노드명은 python-agent01로 입력하고, Permanent Agent에 체크하고 OK를 누른다.
여러 개 컨테이너를 에이전트로 등록할 때 이름 지정이 쉽도록 뒤에 01을 붙였다.

 


생성할 에이전트의 상세 정보를 입력한다.

  • Name은 python-agent01 입력
  • Remote root directory는 /home/jenkins 입력
  • Labels는 Name과 동일하게 입력
  • Usage는 Use this node as much as possible 선택


입력하는 항목이 많으므로 에이전트의 상세 정보를 이어서 작성한다.

  • Launch method : 'Launch agent agents via SSH'로 선택
  • Host는 jenkins-python01 선택 (Docker Container 이름)
  • Credentials [Add] 버튼 ⇢ 'Jenkins' 선택


Host에 IP도 URL도 아닌 Docker 컨테이너 이름을 지정했다는 것이 중요하다.
Docker 컨테이너 이름으로 지정하려고 Docker 네트워크 추가하고, Jenkins 컨테이너를 재생성한 것이다.

만약 ‘Launch agent agents via SSH’가 없다면 아래와 같이 진행한다.

  • Jenkins 설치 후 초기 설정에서 권장 플러그인 설치에 포함
  • 없다면 SSH Plug-in 설치 (SSH Build Agents plugin)


Credential - Add - jenkins를 순서대로 클릭하면 Credential 추가 화면이 팝업으로 출력된다.
다음과 같이 입력한다.

  • Kind - SSH Username with private key 선택
  • Domain과 Scope 항목은 항목은 초기 설정 값을 유지한다.


나머지 항목들도 입력한다.

  • Username : jenkins
  • Private Key : Enter Directly 체크하고 Add 클릭

 


Add 버튼을 클릭하면 입력창이 나타난다.
Jenkins Master 컨테이너의 /.ssh/id_rsa 값을 붙여넣기 한다.


Host Key Verification Strategy는 'Non Verifying Verification Strategy'를 선택한다.
고급 버튼을 누르면 Java 관련 설정 화면이 나타난다.


JavaPath 부분에 에이전트 컨테이너에서 확인한 Java 실행 경로를 지정한다.
보통 /usr/local/openjdk-8/bin/java이다.


아래로 스크롤을 내려서 Remoting Work directory에 SSH 연결 이후 작업할 경로를 지정한다.
지정하지 않으면 Remote Root Directory인 /home/jenkins에서 작업을 수행한다.


모든 입력이 완료되면 Save 버튼을 클릭하고 정상 연결 되는지 확인한다.

 

 

Python Agent 정상 연결 여부 확인

처음 노드를 생성하면 목록에는 확인되지만 X 표시가 되어 있다.
생성한 Python-Agent01 에이전트를 클릭한다. 이름 부분을 클릭하면 상세 페이지로 이동한다.


Relaunch agent를 클릭해서 연결을 재시도한다.


설정에 이상이 없었다면 아래와 같이 연결에 성공해야 한다.


연결에 성공하면 좌측 메뉴가 여러 개 추가된다.
연결된 에이전트의 상세 정보도 확인할 수 있다.

 

반응형