DevOps/Jenkins

[Jenkins] JNLP 분산 빌드 환경 구축 방법

cob 2024. 8. 20. 14:52
Jenkins에서 분산 빌드 환경을 구성하지 않으면 순차적으로 빌드하게 되지만, 분산 빌드 환경을 구성하게 되면 동시에 처리하므로 빌드 속도가 빨라진다. 또한, 빌드 작업을 여러 서버에 분산시켜 Jenkins 마스터 서버의 부하가 줄고, 시스템 리소스를 효율적으로 사용하게 된다.   

 

 

 

1. 분산 빌드 구성 환경 종류

1-1. Launch agent by connecting it to the controller - JNLP (Java Network Launch Protocol)

에이전트(슬레이브)가 JNLP를 통해 마스터에 스스로 연결되는 방식이다.

특징:

  • 에이전트가 JNLP 파일을 통해 Jenkins 마스터에 직접 연결
  • Java 필요
  • 에이전트는 HTTP/HTTPS를 통해 JNLP 파일 다운로드 하고, Jenkins 마스터의 주소와 포트 정보를 받아오는 데 사용된다.
  • 에이전트와 Jenkins 마스터 간의 실제 데이터 전송 (빌드 작업, 로그 등)은 TCP 통신 사용

장점

  • 방화벽 : JNLP는 에이전트가 마스터에 직접 연결하도록 하므로, NAT(Network Address Translation) 및 방화벽 환경에서 유용할 수 있습니다.
  • Java 기반: Java 기반의 연결이므로, 다양한 플랫폼에서 호환됩니다.
  • 쉽게 설정 가능: Jenkins UI에서 JNLP 파일을 다운로드하고 실행하기만 하면 간단히 설정할 수 있습니다.

단점:

  • Java 필요: 에이전트에서 Java Runtime Environment (JRE)가 필요하며, Java가 설치되지 않은 시스템에서는 사용할 수 없습니다.
  • 보안 문제: JNLP는 주로 HTTP/HTTPS를 사용하므로, 적절한 보안 조치가 필요합니다. 예를 들어, HTTPS를 사용하지 않으면 중간자 공격(Man-in-the-Middle Attack)에 노출될 수 있습니다.
  • 성능 문제: Java 기반의 실행이 성능에 영향을 미칠 수 있으며, JNLP 연결이 불안정할 수 있습니다.

 

 

1-2. Launch agent via execution of command on the controller - 원격 제어

Jenkins 마스터에서 직접 명령어를 실행하여 에이전트를 시작하는 방식이다.

특징:

  • Jenkins 마스터에서 원격 에이전트를 실행하기 위한 명령어를 전달
  • SSH나 다른 원격 명령어 실행 방법을 사용하여 에이전트를 실행

장점:

  • 유연성: 다양한 명령어 실행 방법을 사용할 수 있으며, 운영 체제에 종속되지 않는다.
  • 제어: 마스터에서 원격으로 명령어를 실행하므로, 복잡한 환경에서도 에이전트를 제어할 수 있다.

단점:

  • 복잡성: 명령어와 설정이 복잡할 수 있으며, 에이전트가 올바르게 실행되도록 보장하는 것이 어려울 수 있다.
  • 보안: 명령어 실행 방법에 따라 보안 문제가 발생할 수 있고, 적절한 인증 및 권한 관리가 필요합니다.

 

 

1-3. Launch agents via SSH - SSH 접속

Jenkins 마스터가 SSH를 통해 원격 에이전트 노드에 직접 접속하여, 에이전트를 시작하고, 관리하는 방식이다.

특징:

  • Jenkins 마스터가 SSH를 통해 원격 에이전트 노드에 접속하여 에이전트를 실행
  • SSH를 사용하여 에이전트를 제어하고 관리

장점:

  • 보안성: SSH는 강력한 보안과 암호화를 제공하며, 원격 시스템에 안전하게 접속할 수 있다.
  • 표준화된 방식: SSH는 널리 사용되는 표준 프로토콜로, 대부분의 시스템에서 지원한다.
  • 편리한 관리: SSH를 통해 에이전트를 쉽게 관리할 수 있다.

단점:

  • SSH 키 관리: SSH 키나 비밀번호 관리가 필요하며, 이를 설정하는 데 추가적인 노력이 필요할 수 있다.
  • 포트 개방: SSH 포트(기본적으로 22번 포트)를 방화벽에서 열어야 하며, 이를 적절히 관리해야 한다.
  • 플랫폼 종속성: SSH는 주로 Unix/Linux 시스템에서 많이 사용되며, Windows 시스템에서는 추가 설정이 필요할 수 있다.

 

 

2. Jenkins Master TCP  포트 설정

에이전트(슬레이브)와 데이터를 주고 받을 수있는 포트를 설정한다. Jenkins 마스터 서버에 해당 포트로 방화벽이 열려있어야 한다. 

TCP 포트 설정

  • 변경되지 않게 고정 Fixed로 설정

 

 

3. 에이전트(Slave) 추가 방법

 

3-1. [Dashboard] > [Jenkins 관리] > [Nodes] 클릭

Nodes 클릭
Node 추가

 

 

 

3-2. Node 생성

Node 이름 설정

  • Permanent Agent : 영구적으로 사용

 

 

 

3-3. Node 설정

JNLP 분산 방법을 사용하기 위해 Launch method 옵션을 [Launch agent by connecting it to the controller]로 선택한다.

Node 설정
Node 옵션

  • Name (필수): Node의 이름
  • Description (옵션) : Node 설명
  • Number of executors (필수) : Node의 동시 실행 개수
  • Remote root directory (필수) : Node의 기본 홈 디렉토리
  • Labels (옵션) : Node에 라벨 태그를 붙여 Pipeline 호출 시 해당 라벨로 호출 가능하다.
  • Usage (필수) : Node 사용 설정
    Use this node as much as possible :  가능한 모든 작업을 수행하도록 지정(노드를 명시하지 않거나 Pipeline에서 agent any 사용 시 해당 노드 사용)
    - Only build jobs with label expressions matching this node : 라벨이 지정되어 노드와 일치하는 경우에만 실행
  • Launch method (필수) : Jenkins 마스터와 분산 실행 방법 [1. 분산 빌드 구성 환경 종류] 참고
  • Disable WorkDir (옵션) : Node의 원격 작업 디렉터리 비활성화, 비활성화하게 되면  캐시, 로그 및 기타 메타데이터를 저장하지 않는다.
  • Custom WorkDir path (옵션) : 원격 작업 디렉토리 경로, 입력하지 않으면 Remote Root directory 경로로 지정된다. 
  • Internal data directory (필수) : 원격 작업 디렉터리 이름
  • Fail if workspace is missing (옵션) : 워크스페이스 디렉터리가 없으면 빌드 실패, Jenkins는 작업을 실행하기 전에 자동으로 워크스페이스 디렉토리를 생성하지만, 이 옵션이 선택 되면 워크스페이스 디렉토리가 미리 존재하는지 확인하고, 존재하지 않으면 빌드를 실패로 처리한다. 워크스페이스가 이미 존재해야 하는 환경 설정을 반영한다.
  • Use WebSocket (옵션) : JNLP는 데이터 통신은 TCP로 하게 되는데 해당 옵션을 설정하면 Websocket으로 설정된다.
  • Tunnel connection through (고급 / 옵션) : 보안상 직접 접속이 안될 경우 터널링을 통해 우회 접속
  • Availability (필수) : Node 제어 설정
    - Keep this agent online as much as possible : Node를 항상 온라인 상태로 유지하며, Jenkins 마스터와 연결이 끊어지게 되면 자동으로 다시 연결을 시도한다.(D)
    - Bring this agent online according to a schedule : Node는 설정된 스케줄에 따라 자동으로 에이전트가 활성화되고 비활성화된다.

    - Bring this agent online when in demand, and take offline when idle : Node는 작업 요청이 있을 때 자동으로 온라인 상태로 전환됩니다. 작업이 없을 때는 자동으로 오프라인 상태로 전환된다.
  • Disable deferred wipeout on this node (옵션) : 노드의 워크스페이스를 삭제할 때 일시적으로 지연시킬 수 있는 기능을 비활성화
  • Environment variables (옵션) : 해당 노드에서 실행되는 모든 빌드 작업에 대해 특정 환경 변수를 설정. 환경 변수는 빌드 스크립트나 작업에서 사용할 수 있다.
  • Tool Locations (옵션) : 노드에서 사용 가능한 도구의 경로를 설정할 수 있다. 예를 들어, Maven, JDK, Gradle과 같은 도구의 설치 경로를 직접 지정한다.

 

 

 

 

 

 

4. 에이전트(슬레이브) 연결

4-1.  에이전트 확인

추가된 에이전트를 클릭한다.

추가된 Node

 

 

4-2.  에이전트 연결 커맨드

 에이전트 서버 환경에 맞게 Unix, Window  커맨드를 해당 서버에 차례대로 입력한다.

Agent 연결

 

 

[에이전트 서버에 커맨드 입력]

agent파일 다운
에이전트 연결

 

 

4-3. 에이전트 연결 완료

연결이 완료되면 x표시가 없어진다.

 

 

 

 

 

 


5. 에이전트(슬레이브) 빌드 방법

5-1. 파이프라인 라벨 지정

pipeline {
    agent {
        label 'POC_Agent'  // 해당 라벨을 설정한 에이전트에서 빌드 실행
    }
    ...
}

 

5-2. 파이프라인 이름 지정

node('POC_Agent') {	// 해당 이름을 가진 에이전트에서 빌드 실행
    stage('Build') {
        ...
    }
}

 

 

5-3. 라벨과 이름 빌드 실행 차이

  • 노드 이름은 Jenkins에서 고유하게 식별되는 노드의 이름이다. 이 이름을 사용하여 특정 노드에서 작업을 실행할 수 있고, 각 노드는 고유한 이름을 가진다.
  • 라벨여러 노드에 적용될 수 있는 태그로, 여러 노드에 동일한 라벨을 부여할 수 있다. 라벨을 사용하면 해당 라벨이 붙은 노드 중에서 작업을 실행하게 된다.

 

반응형