프로그래밍 노트/인프라

젠킨스 Master/Slave 분산 빌드 환경 도커로 구축하기

깡냉쓰 2021. 1. 30. 12:58
728x90
반응형

젠킨스를 Master/Slave로 보통 구성한다고 한다. (사실 실무에서는 사용해본적이 없지만, 많은 블로그나 책에서 이렇게 사용한다고 한다.)
도커 컴포즈를 연습해볼겸 젠킨스를 Master/Slave로 구축을 해보자,

  • Master : 관리 기능 및 작업 실행 지시
  • Slave : 실제 작업 진행

Master 젠킨스 컨테이너 실행하기

1.docker-compose.yml 작성

version: "3"
services:
  master:
    container_name: master
    image: jenkins/jenkins:lts
    ports:
      - 9900:8080
    volumes:
      - ./master_jenkins_home:/var/jenkins_home

volumes 항목은 호스트와 컨테이너 사이에 파일을 공유할 수 있는 메커니즘이다. (파일 복사 x)
젠킨스 컨테이너를 호스트 쪽에서 편리하게 다룰 수 있도록 docker-compose.yml 파일에 volume을 정의해 호스트 쪽 현재 작업 디렉터리 바로 아래에 jenkins_home 디렉터리를 ./master_jenkins_home에 마운트한다.

2. jenkins master 실행 및 설정

$ docker-compose up

젠킨스 컨테이너를 실행시키자. 젠킨스를 실행시키면 초기 설정에서 패스워드가 생성되게되는데 잘 복사해 놓자

초기비밀번호

http://localhost:9900 으로 접근하게 되면, 앞에 복사해둔 초기 패스워드를 입력받는 페이지가 나온다. 초기 패스워드를 입력하고 설명을 따라 설정을 진행한다.

비밀번호 입력

Install suggested plugins을 선택하여 기본 플그인을 설치를 진행하면, 젠킨스 홈 화면이 나타난다.

젠킨스홈

젠킨스 공식 이미지에서는 /var/jenkins_home에 젠킨스 데이터들이 저정된다. 그러므로 컴포즈를 실행한 컨테이너를 재시작해도 초기 설정이 유지된다.

Slave 젠킨스 컨테이너 실행하기

1. 마스터 젠킨스 용 SSH 키 생성

Master-Slave 젠킨스 구조를 사용하기 위해서는, 마스터가 슬레이브에 접속할 수 있도록 마스터 컨테이너에서 SSH키를 생성해야 한다. (Master-Slave 의 소통을 위해서 필수)
마스터 컨테이너에 접속하여 SSH키를 생성하자.

$ docker container exec -it master ssh-keygen -t rsa -C ""
Generating public/private rsa key pair.
Enter file in which to save the key (/var/jenkins_home/.ssh/id_rsa): 
Created directory '/var/jenkins_home/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /var/jenkins_home/.ssh/id_rsa.
Your public key has been saved in /var/jenkins_home/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:ygSD36TAkljxJ6A1SkJjnOtOqXVVcEzL0kN70QPhOzg 
The key's randomart image is:
+---[RSA 2048]----+
|+=B.  .++ ++     |
|=X.=   =o+ .o    |
|* = = +.* o  .   |
| o o O.. + .     |
|. . o.o E o      |
| +. .o . . .     |
|+. .  o          |
|..               |
|                 |
+----[SHA256]-----+

2. docker-compose.yml 수정(젠킨스 컨테이너 추가)

슬레이브 인스턴스 역할을 할 젠킨스 컨테이너를 추가한다.

version: "3"
services:
  master:
    container_name: master
    image: jenkins/jenkins:lts
    ports:
      - 9900:8080
    volumes:
      - ./master_jenkins_home:/var/jenkins_home
    links:
      - slave01
  slave01:
    container_name: slave01
    image: jenkins/ssh-agent
    environment:
      - JENKINS_AGENT_SSH_PUBKEY=ssh-rsa AAAA...

SSH 접속 허용 설정

  • SSH로 접속하는 슬레이브 용도로 구성된 도커 이미지(jenkins/ssh-slave) 사용
  • JENKINS_AGENT_SSH_PUBKEY 환경 변수를 사용하여, 마스터 젠킨스를 식별할 수 있게 한다. (https://hub.docker.com/r/jenkins/ssh-slave)

SSH 접속 대상 설정

  • 컴포즈 links 요소를 사용하여, 다른 services 그룹에 해당하는 다른 컨테이너와 통신을 할 수 있게 한다.
  • master에 slave01에 대한 link를 추가하여, master에서 slave01이라는 이름으로 슬레이브 컨테이너를 찾아갈 수 있게 한다.
$ docker-compose up -d
$ docker-compose ps
Name                Command               State                 Ports              
------------------------------------------------------------------------------------
master    /sbin/tini -- /usr/local/b ...   Up      50000/tcp, 0.0.0.0:9900->8080/tcp
slave01   setup-sshd                       Up      22/tcp

3. 마지막 젠킨스 설정

마스터 젠킨스가 슬레이브 젠킨스를 인식하게 하려면, 마지막 설정이 필요하다.
Jenkins 관리 > 노드 관리 페이지에서 신규 노드를 생성한다.

신규 노드 생성

Host 입력란에 ip를 적어도 되지만, slave01로 컨테이너를 찾을 수 있다.
밑에 캡쳐본을 참고해서 slave01 컨테이너관련 SSH 설정을 완료한다.

노드 설정 추가

위와 같이 JavaPath도 설정을 해줘야 한다. 처음에 JavaPath설정을 안해줬더니 slave jenkins에서 java를 찾지 못하는 오류가 계속 발생하였다.해당 오류는 (https://chati.tistory.com/129 을 참고하였다.)

추가완료

위의 그림처럼 뜬다면, master/slave 설정이 완료된 것이다.

참고) 도커/쿠버네티스를 활용한 컨테이너 개발 실전 입문

728x90
반응형