jenkins

Jenins | Jenkins에 Node추가하기

no-easy-ray 2021. 12. 14. 23:08

docker container exec -it worker1 /bin/bash이전에는 Jenkins를 Container로 띄워 파이프라인을 실행해보는 예제를 해봤습니다.

 

하지만 여기서 생각해볼 점이 있습니다.

우리가 띄운 Jenkins(master라고 하겠습니다.)는 파이프라인 수행뿐만 아니라 설정 정보도 관리하기 때문에 부하 분산을 위해

주로 Job만을 실행시키기 위한 Node를 따로 사용하게됩니다.

 

다음 그림과 같이 Jenkins Master로 요청이 오면 Node(Slave)에서 Job이 실행되어 파이프라인이 동작하게 되는 방식입니다.

 

그럼 이전의 코드에 Node를 추가하는 방법에 대해서 정리하도록 하겠습니다.

(기존 Master Jenkins가 띄워져 있다고 가정하에 진행하도록 하겠습니다 Jenkins | 01. Jenkins 설치)

 

참고

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

 

먼저 Jenkins Master에 접속하여 RSA 키를 생성합니다.

# jenkins 컨테이너 접속 (master는 컨테이너 이름입니다.)
docker container exec -it master /bin/bash

# rsa key 생성
ssh-keygen -t rsa -C ""

키를 만드는 이유는 앞으로 생성할 Master에서 Jenkins Node에 ssh로 접속하기 위해 사용될 예정입니다.

 

  • Enter file in which to save the key : 키가 저장되는 경로입니다. Enter~
  • Enter passphrase : ssh인증 시 키가 있어도 비밀번호를 입력하도록 설정합니다. (사용하지 않을 것 이기 때문에 Enter~)
  • Enter same passphrase again : Enter~

 

키가 만들어 졌다면 .ssh디렉토리가 생성된 것을 확인할 수 있습니다.

ls /var/jenkins_home/.ssh

#id_rsa와 id_rsa.pub을 확인할 수 있습니다.
  • 각각 private key와 public key입니다.
  • 저희는 이 두 가지 키를 이용하여 연결을 해주도록 합니다.

 

 

다음으로 rsa.pub의 내용을 복사합니다.

# ~/.ssh/
cat id_rsa.pub

# ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAB... 전체를 복사합니다.

 

node생성을 위한 yaml파일을 생성합니다.

# jenkins-nodes.yaml
version: "3"
services: 
    worker1: 
        container_name: worker1 
        image: jenkins/ssh-agent
        volumes:
            - ./worker_jenkins_home:/var/jenkins_home
        environment:
            - JENKINS_AGENT_SSH_PUBKEY=ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC...
  • image의 경우 master에서 사용되는 image와 다른 것을 확인할 수 있습니다.
  • JENKINS_AGENT_SSH_PUBKEY에 위에서 복사한 키를 넣어주도록 합니다.

 

Jenkins Node 컨테이너 실행

# node용 jenkins 실행
docker-compose -f jenkins-nodes.yaml up -d 

# https://docs.docker.com/compose/reference/

 

docker ps를 해보면 다음과 같이 2개의 컨테이너가 동작중인 것을 확인할 수 있습니다.

 

여기까지 완료되었다면 이제 Jenkins에 접속을 해보겠습니다. (localhost:9000)

Jenkins > Jenkins관리 > 노드 관리 메뉴에서 노드를 추가할 수 있습니다.

 

 

새로운 노드를 생성합니다. 이름은 node1이라고 하겠습니다.

 

 

 

노드에 대한 설정을 진행합니다.

  • Remote root directory : /var/jenkins_home
  • Launch method : Launch agents via SSH을 선택합니다.
  • Host : 컨테이너로 띄운 node이름입니다. (저의 경우 worker1로 생성하여 worker1로 진행했습니다.)
  • Credentials : 연결에 사용할 Jenkins Credentials을 지정합니다. (아마 아무것도 없으실 거라 예상합니다. 밑에 Credentials을 추가하는 방법을 참고하여 생성 후 등록하시면 됩니다.)
  • Host Key Verification Strategy : Known hosts file Verification Strategy을 선택합니다. (기본)
  • 고급
    • JavaPath : node로 사용할 컨테이너에 접근 후 java경로를 찾을 후 넣어 줍니다.
      • > docker container exec -it worker1 /bin/bash 
      • > which java

 

Credentials 생성

SSH키를 관리할 Credentials을 생성할 것이기 때문에 다음과 같이 SSH Username with private key를 선택합니다.

 

Jenkins Master에서 생성한 id_rsa(Private Key)의 내용을 추가하여 생성합니다.

 

 

Relaunch agent버튼을 눌러 연결을 시도합니다.

 

연결이 완료되면 다음과 같이 Node가 추가된 것을 확인할 수 있습니다.

 

 

마지막으로 Jenkins > Jenkins 관리 > Configure Global Security로 이동합니다.

TCP port for inbound agents를 Random으로 설정합니다.
 
worker node 실행을 위한 JNLP agent의 TCP/IP port 사용에 대한 설정을 Random으로 선택합니다.
Random 하게 port를 선택하여 에이전트 실행 시 접속 충돌을 방지하기 위함입니다.

 

진짜 마지막으로 Jenkins > Jenkins 관리 > Nodes > Master로 이동합니다.

Jenkins의 executors를 0으로 변경합니다.

앞으로 Master Jenkins에서는 Job이 실행되지 않도록 합니다.

 

 

드디어 설정이 완료되었습니다.

이전에 만들어 두었던 test파이프라인을 실행해보면 새로 추가된 Node1에서 파이프라인이 실행되는 것을 확인하실 수 있습니다.

 

여기까지 Docker Compose를 이용해서 Master Node구조로 Jenkins를 설치해보는 작업을 진행해보았습니다.

이후에는 Jenkins를 좀 더 활용할 수 있는 방법들에 대해서 정리를 해보도록 하겠습니다.

 

감사합니다.