Develop/infra

Docker Compose를 사용한 Jenkins master/worker(slave) 설정

kudl 2020. 11. 23. 15:07

docker-compose 를 사용하여 jenkins 설정을 한다.

master 인스턴스에서는 관리 기능, 작업 지시를 실행하고 worker(slave) 인스턴스에서는 실제 작업을 진행한다.

이미지는 jenkins 공식 이미지를 사용하며 Master(docker-compose-master.yaml), Worker(docker-compose-worker.yaml) 파일 두개를 이용하여 설정을 한다.   

jenkiins

 

Docker Hub

 

hub.docker.com

 jenkins-agent 

 

Docker Hub

 

hub.docker.com

 

Master Yaml

docker-compose 3버전, volume을 지정, 컨테이너명은 jenkins-master로 설정한 후 docker-compose-master.yaml 로 파일을 생성하였다.

# MASTER PRE-REQS
# Install docker, docker-compose
version: "3"
services:
  jenkins-master:
    container_name: jenkins-master
    image: jenkins/jenkins:lts
    ports:
      - 8080:8080
      - 50000:50000
    restart: always
    volumes:
    - ~/infra/jenkins_master:/var/jenkins_home
    environment:
      TZ: "Asia/Seoul"

 

Master 설치 및 실행

Master 컨테이너를 실행한다.

 

docker-compose -f ./docker-compose-master.yaml up -d

 

브라우저로 localhost:8080/ 에 접근하게 되면 password를 묻는데 password는 Master 컨테이너의  /var/jenkins_home/secrets/initialAdminPassword 에서 확인을 할수 있다.

docker container exec -it jenkins-master /bin/bash
cat /var/jenkins_home/secrets/initialAdminPassword

 

위 명령어를 통해 얻은 패스워드 입력한다.

Jenkins Plugins 인스톨을 진행한다. 기본 Plugins 설치를 위해 Install suggested plugins 를 클릭한다.

Plugins 설치 화면

Plugins 설치가 완료되면 계정 추가를 한다.

 

Master 인스턴스로 접근 후 ssh-keygen 실행을 해야한다.

 docker container exec -it jenkins-master /bin/bash
 ssh-keygen -t rsa -C ""

ssh 폴더로 이동 후 id_rsa, id_rsa.pub 파일이 생성되었는지 확인한다.

cd ~/.ssh 
ls -al

 

Worker Yaml

docker-compose-worker.yaml 로 파일 생성한다. worker 더 추가하고 싶다면 컨테이너명을 바꿔서 추가한다.

# MASTER PRE-REQS
# Install docker, docker-compose
version: "3"
services:
  jenkins-worker01:
    container_name: jenkins-worker01
    image: jenkins/ssh-agent
    restart: always
    volumes:
      - ~/infra/jenkins_worker:/var/jenkins_home
    environment:
      - JENKINS_SLAVE_SSH_PUBKEY=ssh-rsa AAAAB....

Worker 설정

Master 인스턴스에서 worker로 ssh 접근을 위해 docker-compose-worker.yaml 파일의 JENKINS_SLAVE_SSH_PUBKEY 값을 Master 인스턴스의 id_rsa.pub 값을 넣어준다.

docker container exec -it jenkins-master /bin/bash
cat ~/.ssh/id_rsa.pub

 

worker를 실행한다.

docker-compose -f ./docker-compose-worker.yaml up -d

 

Master 인스턴스에서 ssh-copy-id 를 사용하여 Master 인스턴스 공용 키를 원격 호스트의 authorized_keys 파일에 복사한다.

docker container exec -it jenkins-master /bin/bash
ssh-copy-id jenkins@jenkins-worker01

 

Jenkins Master <-> Slave 설정

localhost:8080 로그인을 한다.

Jenkins관리 > 노드관리 > 신규 노드 메뉴에서 노드명 : jenkins-worker01 입력, Permanent Agent 체크 한다.

노드 설정을 한다.

  • Remote root directory : /var/jenkins_home (docker-compose-worker.yaml 파일의 volumn 설정한 경로를 넣어준다.)
  • Launch method : Launch agents via SSH
    • Host : jenkins-worker01 (docker-compose-worker.yaml 파일의 컨테이너명을 넣어주면된다)
    • Credentials : ADD 버튼을 클릭한다.
      • Kind : SSH Username with private key
      • UserName : jenkins   (ssh-copy-Id 에 넣은 값이 들어가야한다.)
      • Private Key : Enter directly 체크 후 ADD버튼을 클릭한 후 Master 인스턴스에서 ~/.ssh/id_rsa 내용을 넣어준다. 아래 캡쳐 이미지를 참고
        • docker container exec -it jenkins-master /bin/bash
        • cat ~/.ssh/id_rsa
  • Host Key Verification Strategy : Known hosts file Verification Strategy 선택
  • 고급 버튼 클릭
    • JavaPath : jenkins-worker 컨테이너에 접근 후 java 경로를 찾고 값을 넣어준다.
      • docker container exec -it jenkins-worker01 /bin/bash
      • which java

 

 

 

설정 결과

도커 조회 ( docker ps -a --filter name=jenkins )

Jenkins 노드 화면