Jenkins
이번 포스팅에서는 Jenkins Multi nodes 구성에 관하여 알아볼 것이다.
흔히, Master + Slaves 구성으로 부르게 되는 내용이다.
Jenkins Slave
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 기본 명령어 (0) | 2024.07.30 |