[Jenkins] Jenkins Multi nodes 구성 - Master + Slaves

2024. 8. 2. 13:37·Infra/Jenkins

Jenkins

 

이번 포스팅에서는 Jenkins Multi nodes 구성에 관하여 알아볼 것이다.

흔히, Master + Slaves 구성으로 부르게 되는 내용이다.

 

Jenkins Slave

https://digitalvarys.com/how-to-configure-jenkins-master-slave-setup/

 

Jenkins Slave

  • Remote에서 실행되는 Jenkins 실행 Node
  • Jenkins Master의 요청 처리
  • Master로부터 전달된 Job 실행
  • 다양한 운영체제에서 실행 가능
  • Jenkins 프로젝트 생성 시 특정 Slave를 선택하여 실행이 가능하다. 
    • 리소스가 충분히 확보되어있는 노드에 실행하도록 할 수도 있다.
  • 다른 것 없이 JVM만 추가되어있는 상태여서 Master의 Job을 실행

 

클라이언트가 요청한 모든 작업을 Master가 다 하는것이 아닌 Slave로 위임한 후 결과를 전달받는 방식이다.

 

Jenkins Slave 컨테이너 생성

우선, Slave Node로 사용될 도커 서버를 2개 생성해보자.

docker run --privileged -d -p 30022:22 --name jenkins-test-node1 hanyoonsoo/mycentos init
docker run --privileged -d -p 40022:22 --name jenkins-test-node2 hanyoonsoo/mycentos init

 

 

그리고 Slave(Agent) Node는 Jenkins Master의 명령을 받아서 수행하기 위해

JVM이 설치되어 있어야 하므로, 설치해준다.

 

 

Java JVM 설치

yum install -y ncurses git
yum list java*jdk-devel
yum install -y java-17-openjdk-devel.aarch64

 

 

Jenkins에서 Slave Node 접속확인

ssh root@{Slave Node1 IP}
ssh root@{Slave Node2 IP}

# 나중에 패스워드 없이 접속하기 위해 키 복사
ssh-copy-id root@{Slave Node1 IP}
ssh-copy-id root@{Slave Node2 IP}

 

 

Jenkins Master 노드에서 Slave 등록

 

Manager Jenkins -> Manage Nodes -> New Node

 

 

 

 

 

  • Node Name: 노드의 이름
  • Description: 간단한 설명
  • Number of executors: 추가하고 있는 노드에서 마스터의 요청을 받았을 때 최대 몇 개 실행할지
  • Remote root directory: 결과 파일이 저장되고자 하는 디렉토리 지정
  • labels: 현재 사용하고 있는 젠킨스 프로젝트에서 다른쪽에 있는 프로젝트/파이프라인이 추가하는 노드를 지칭할 때 사용
  • Usage: Use this node as much as possible
    • 사용할 수 있는 노드 선택
  • Launch Method: 접속하려고 하는 방식(SSH로 접속)
    • Host: Slave의 IP
    • Port: 22
    • Credentials: ID/Password

 

Slave 연동/동작 확인

 

 

우선, 위처럼 Slave1의 시스템 정보가 잘 표시되면 연동이 된 것이다.

 

 

Jenkins 아이템(프로젝트)를 하나 선택해서 Restrict where this project can be run 부분에
Slave1을 추가하고 해당 아이템을 빌드해보자.

 

 

정상 빌드가 되었다면 아래 사진과 같이 해당 Slave에 아까 지정했던 Remote root directory 경로가 생길것이다.

 

 

Jenkins Slave 노드에서 빌드하기

 

Slave 2번은 위에서 설정했던 것과 같이 등록되어 있다고 가정한다.

 

새롭게 Pipeline을 만드는 것보다 이전 포스팅에서 사용한 Pipeline을 재사용하자.

 

pipeline {
    agent {
        label 'slave1'
    }
    
    tools {
        maven 'Maven3.9.8'
    }
    
    stages{
        stage('git clone'){
            steps{
                git branch: 'main', url: 'https://github.com/HanYoonSoo/cicd-web-project'    
            }
        }
        
        stage('build'){
            steps{
                sh '''
                    echo build start
                    mvn clean compile package -DskipTests=true
                '''
            }
        }
        
        // stage('SonarQube analysis'){
        //     steps{
        //         withSonarQubeEnv('SonarQube-server'){
        //             sh 'mvn sonar:sonar'
        //         }       
        //     }
        // }

    }
}

 

  • SonarQube는 주석처리
  • agent any -> agent { label 'slave1' } 로 변경

그 후 Pipeline 저장 후 실행

 

 

 

 

정상적으로 빌드가 되었고 slave1의 디렉토리를 확인하면 다음과 같이 정상적으로 빌드가 된 것을 확인할 수 있다.

 

 

Slave2도 동일하게 동작할 것이다.

 


 

정리

이번 포스팅에서는 Master + Slaves를 구성하여 Jenkins의 Multi Nodes 환경을 구성했다.

 

이를 잘 사용하면 Master Node에서는 Github Webhook 같은데서 이벤트를 전달받고

관련 빌드 작업 및 배포 작업을 특정 Slave Node에 지정이 가능할 것이며,

Master Node에서는 Slack에 빌드 내용을 전달한다든지 목적에 따라 분할된 작업이 가능할 것 같다.

 

또한, Jenkins + Ansible환경을 구성했다면 Cron Job으로 기동되어 있는 서버의 리소스 상태를 확인하여

일정 상태 이상이면 Ansible를 이용해 새로운 서버를 기동시킬 수도 있을 것 같다.

 

저작자표시 비영리 변경금지 (새창열림)

'Infra > Jenkins' 카테고리의 다른 글

[Jenkins] Jenkins + SonarQube 사용  (0) 2024.08.01
[Jenkins] Jenkins의 여러 Pipeline 작업  (0) 2024.07.31
[Jenkins] Jenkins + Ansible 연동하기  (0) 2024.07.31
[Jenkins] Ansible Playbook 사용  (0) 2024.07.30
[Jenkins] Ansible 기본 명령어  (1) 2024.07.30
'Infra/Jenkins' 카테고리의 다른 글
  • [Jenkins] Jenkins + SonarQube 사용
  • [Jenkins] Jenkins의 여러 Pipeline 작업
  • [Jenkins] Jenkins + Ansible 연동하기
  • [Jenkins] Ansible Playbook 사용
진꿈청
진꿈청
기록하는 개발자가 되기를 희망하는 진꿈청입니다. 사소한 개발 일지도 기록하기 위해 노력하겠습니다
  • 진꿈청
    기록형 개발자 희망
    진꿈청
  • 전체
    오늘
    어제
    • 분류 전체보기 (380) N
      • 개발 기록 (140)
      • Language (12)
        • Java (4)
        • Python (0)
        • Kotlin (8)
      • Spring (52) N
        • JPA (9)
        • AOP (1)
        • Batch (2) N
        • Cloud (4)
        • WebSocket (11)
        • 유용한 정보 (9)
        • 동시성 & Lock (7)
        • Test (7)
      • DevOps (3)
        • AWS (3)
      • Docker (7)
      • Git (1)
      • PS (53)
        • 프로그래머스 (16)
        • 백준 (36)
        • goorm (1)
      • 프로젝트 (39)
        • 토이 프로젝트 (9)
        • FitTrip (16)
        • StudyWithMe (14)
      • Ceph (3)
      • CS (10)
        • Network (6)
        • OS (4)
      • Design Pattern (8)
      • Infra (40)
        • Jenkins (13)
        • DevOps (7)
        • Kubernetes (10)
        • NGINX (4)
        • Flyway (1)
        • Kafka (1)
      • DB (7)
        • Redis (5)
        • MongoDB (1)
        • PostgreSQL (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Jenkins
    김영한
    ApplicationEventPublisher
    Github Actions
    springboot
    spring rest docs
    websocket
    Redis
    flyway
    Spring cloud
    fittrip
    Spring
    Kubernetes
    ansible
    nginx
    @Transactional
    프로그래머스
    java
    k8s
    Spring Cloud Gateway
    백준
    kotlin
    Kafka
    Spring JPA
    JPA
    AWS EC2
    docker
    Design Pattern
    디자인 패턴
    openfeign
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
진꿈청
[Jenkins] Jenkins Multi nodes 구성 - Master + Slaves
상단으로

티스토리툴바