Jenkins Agents 랩
Source: Dev.to
번역을 진행하려면 번역하고자 하는 본문 텍스트를 제공해 주세요. 코드 블록, URL 및 마크다운 형식은 그대로 유지하면서 내용만 한국어로 번역해 드리겠습니다.
0) “create” vs “enable” 의미
Create agent – Jenkins UI에서 노드(이름, 라벨, 워크스페이스)를 정의합니다.
Enable agent – 에이전트 프로세스를 시작하여 연결되고 Online 상태가 되게 합니다.
A) Mac에서 로컬 에이전트 만들기 (컨트롤러는 로컬호스트)
Step 1 – 에이전트 작업공간 폴더 만들기 (터미널)
mkdir -p ~/jenkins-agent
Step 2 – Jenkins에서 노드 만들기 (UI)
- Jenkins 열기:
http://localhost:9090 - Jenkins 관리 → 노드 및 클라우드 → 새 노드
- 이름:
mac-agent - 유형: Permanent Agent → Create
Step 3 – 노드 구성 (UI)
| Field | Value |
|---|---|
| 실행기 수 | 1 |
| 원격 루트 디렉터리 | /Users/aisalkyn/jenkins-agent |
| 라벨 | mac local |
| 사용법 | 가능한 한 많이 이 노드를 사용 |
| 시작 방법 | ✅ 컨트롤러에 연결하여 에이전트 시작 |
| 가용성 | 가능한 한 이 에이전트를 온라인 상태로 유지 |
클릭 Save.
Source:
B) 에이전트 활성화 (온라인 상태로 전환) – 권장 방법 (WebSocket)
Step 4 – agent.jar 다운로드 (터미널)
cd ~/jenkins-agent
curl -o agent.jar http://localhost:9090/jnlpJars/agent.jar
Step 5 – 에이전트 시작 (터미널)
에이전트를 실행합니다 (이 터미널을 열어 둔 상태로 유지):
java -jar agent.jar \
-url http://localhost:9090 \
-secret \
-name mac-agent \
-webSocket \
-workDir "/Users/aisalkyn/jenkins-agent"
시크릿을 얻는 위치: Nodes → mac-agent → Jenkins가 정확한 명령과 시크릿을 표시합니다.
Step 6 – 온라인 상태 확인 (UI)
Manage Jenkins → Nodes and Clouds – mac-agent = 초록색 / Online 으로 표시되어야 합니다.
C) 에이전트에서 작업 실행 (증명)
Step 7 – 라벨 mac을 사용한 파이프라인
pipeline {
agent { label 'mac' }
stages {
stage('Proof') {
steps {
sh 'hostname'
sh 'whoami'
sh 'pwd'
}
}
}
}
Expected: 워크스페이스 경로에 포함됨
/Users/aisalkyn/jenkins-agent/workspace/...
D) 일반적인 문제 (빠른 해결책)
에이전트가 오프라인 상태 유지
원인: 노드는 생성되었지만 에이전트 프로세스가 시작되지 않았습니다.
해결: Step 5의 WebSocket 명령을 실행하십시오.
“Invalid or corrupt jarfile agent.jar”
원인: agent.jar가 터널/리다이렉트를 통해 다운로드되었습니다.
해결: 직접 다시 다운로드하십시오:
curl -o agent.jar http://localhost:9090/jnlpJars/agent.jar
Jenkins가 시작되지 않음 (Java 버전)
Jenkins는 Java 17/21을 지원합니다. Jenkins를 Java 21로 명시적으로 시작하십시오:
/opt/homebrew/opt/openjdk@21/bin/java -jar /opt/homebrew/opt/jenkins-lts/libexec/jenkins.war \
--httpPort=9090 --httpListenAddress=127.0.0.1
파이프라인이 “Still waiting to schedule task” 상태에서 멈춤
원인: 라벨 불일치 또는 에이전트 오프라인.
해결: 노드에 mac 라벨이 지정되어 있고 에이전트가 온라인인지 확인하십시오.
E) 인터뷰에서 말할 내용 (1문장)
“저는 Nodes 아래에 에이전트를 생성하고 labels를 할당한 뒤 WebSocket을 사용해 연결합니다. 이렇게 하면 인바운드 TCP 포트를 열지 않고도 워커에서 빌드가 실행됩니다.”
Source: …
LAB: Jenkins 에이전트 — 스케줄링, 라벨, 병렬 처리 및 확장
이 실습은 **이미 만든 에이전트(mac-agent)**를 사용하며 다음을 배웁니다:
- Jenkins가 작업을 어떻게 스케줄링하는지
- 에이전트가 왜 중요한지
- 에이전트가 더 필요할 때는 언제인지
LAB 1 — 빌드가 에이전트에서 실행되는지 확인 (베이스라인)
목표
작업이 컨트롤러가 아니라 mac-agent에서 실행되는지 확인합니다.
Jenkinsfile (Job 1)
pipeline {
agent { label 'mac' }
stages {
stage('Where am I running?') {
steps {
sh 'echo "Node name: $NODE_NAME"'
sh 'hostname'
sh 'whoami'
sh 'pwd'
}
}
}
}
예상 결과
NODE_NAME = mac-agent- 워크스페이스 경로:
/Users/aisalkyn/jenkins-agent/workspace/...
DevOps 교훈: 에이전트 라벨은 코드가 실행되는 위치를 결정합니다.
LAB 2 — 에이전트가 오프라인이면 어떻게 될까?
목표
작업이 왜 멈추는지 이해합니다.
단계
- 에이전트 프로세스를 중지합니다(
Ctrl+C를 터미널에서 입력). - 작업에서 Build Now를 클릭합니다.
결과
작업이 Build Queue에 남아 다음과 같은 메시지가 표시됩니다:
Still waiting to schedule task
mac-agent is offline
DevOps 교훈: Jenkins는 에이전트를 자동으로 시작하지 않으며, 작업을 실행하려면 에이전트가 살아 있어야 합니다.
LAB 3 — 컨트롤러 vs 에이전트 (안티패턴 데모)
목표
컨트롤러에서 실행하는 것이 왜 나쁜 습관인지 보여줍니다.
Jenkinsfile (Job 2)
pipeline {
agent any
stages {
stage('Controller test') {
steps {
sh 'echo "Running on $NODE_NAME"'
}
}
}
}
결과
Built‑In Node(컨트롤러)에서 실행됩니다.
학생에게 설명: 컨트롤러는 다음 작업을 하면 안 됩니다:
- Docker 이미지 빌드
- Terraform 실행
- 무거운 테스트 수행
DevOps 규칙: agent any는 프로덕션 환경에서 위험합니다.
LAB 4 — 라벨이 스케줄링을 제어한다 (중요)
목표
라벨이 에이전트를 어떻게 선택하는지 보여줍니다.
단계
Jenkinsfile의 라벨을 존재하지 않는 것으로 바꿉니다:
agent { label 'linux' }
결과
- 일치하는 에이전트가 없어 작업이 큐에 머무릅니다.
해결 방법
유효한 라벨로 되돌립니다:
agent { label 'mac' }
LAB 5 — 단일 에이전트에서 병렬 빌드
목표
Executor 제한을 보여줍니다.
Jenkinsfile (Job 3)
pipeline {
agent { label 'mac' }
stages {
stage('Parallel test') {
parallel {
stage('Task A') {
steps {
sh 'sleep 20'
}
}
stage('Task B') {
steps {
sh 'sleep 20'
}
}
}
}
}
}
결과
- 하나의 스테이지만 실행됩니다.
- 다른 스테이지는 대기합니다.
이유: mac-agent는 Executor 1개만 가지고 있기 때문입니다.
LAB 6 — Executor 수 늘리기 vs 에이전트 추가하기
옵션 A — Executor 늘리기
mac-agent 설정에서 Executors: 2 로 변경합니다.
작업을 다시 실행 → 두 스테이지가 병렬로 실행됩니다.
옵션 B — 에이전트 추가하기
mac-agent-2를 만들고 Executor 1개를 할당합니다.
DevOps 규칙
| 방법 | 사용 시점 |
|---|---|
| Executor 증가 | 가벼운 워크로드 |
| 에이전트 추가 | 무겁고 격리된 워크로드 |
LAB 7 — 실제 DevOps 워크로드 시뮬레이션
Jenkinsfile
pipeline {
agent { label 'mac' }
stages {
stage('Build') {
steps {
sh 'echo "Building..."'
sh 'sleep 10'
}
}
stage('Test') {
steps {
sh 'echo "Testing..."'
sh 'sleep 10'
}
}
stage('Package') {
steps {
sh 'echo "Packaging..."'
sh 'sleep 10'
}
}
}
}
설명
실제 CI에서는:
- build → test → scan → package 순서로 진행됩니다.
- 모든 단계는 에이전트에서 실행되며, 컨트롤러에서는 실행되지 않습니다.
더 많은 에이전트가 필요하신가요?
짧은 답변
- 현재: 아니오
- 실제 DevOps에서는: 예
하나의 에이전트만으로 충분할 때
- Jenkins 학습
- 데모
- 소규모 팀
- 순차 파이프라인
현재 여기 있습니다 ✅
더 많은 에이전트를 반드시 추가해야 할 때
-
병렬 파이프라인
- 여러 개발자가 코드를 푸시
- CI 작업이 쌓임
-
다양한 도구
- Docker용 에이전트 하나
- Terraform용 에이전트 하나
- 보안 스캔용 에이전트 하나
-
다양한 OS
- Linux 에이전트
- Windows 에이전트
- macOS 에이전트
-
보안 격리
- 프로덕션‑배포 에이전트 ≠ 빌드 에이전트
실제 DevOps 설정 (일반적인 경우)
| 에이전트 유형 | 목적 |
|---|---|
| Linux Docker agent | CI 빌드 |
| Terraform agent | 인프라 |
| Security agent | 스캔 |
| Kubernetes agents | 확장 CI |
| Mac agent | iOS / 로컬 데모 |
Interview‑ready conclusion (memorize)
“학습을 위해 하나의 에이전트로 시작하지만, 실제 DevOps에서는 병렬 빌드, 격리, 보안 및 다양한 환경을 처리하기 위해 종종 ephemeral agents를 사용하여 여러 에이전트를 활용합니다.”