Jenkins Agents 랩

발행: (2026년 2월 7일 오전 08:15 GMT+9)
11 분 소요
원문: Dev.to

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)

  1. Jenkins 열기: http://localhost:9090
  2. Jenkins 관리 → 노드 및 클라우드 → 새 노드
  3. 이름: mac-agent
  4. 유형: Permanent Agent → Create

Step 3 – 노드 구성 (UI)

FieldValue
실행기 수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 Cloudsmac-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 — 에이전트가 오프라인이면 어떻게 될까?

목표
작업이 왜 멈추는지 이해합니다.

단계

  1. 에이전트 프로세스를 중지합니다(Ctrl+C를 터미널에서 입력).
  2. 작업에서 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-agentExecutor 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 학습
  • 데모
  • 소규모 팀
  • 순차 파이프라인

현재 여기 있습니다

더 많은 에이전트를 반드시 추가해야 할 때

  1. 병렬 파이프라인

    • 여러 개발자가 코드를 푸시
    • CI 작업이 쌓임
  2. 다양한 도구

    • Docker용 에이전트 하나
    • Terraform용 에이전트 하나
    • 보안 스캔용 에이전트 하나
  3. 다양한 OS

    • Linux 에이전트
    • Windows 에이전트
    • macOS 에이전트
  4. 보안 격리

    • 프로덕션‑배포 에이전트 ≠ 빌드 에이전트

실제 DevOps 설정 (일반적인 경우)

에이전트 유형목적
Linux Docker agentCI 빌드
Terraform agent인프라
Security agent스캔
Kubernetes agents확장 CI
Mac agentiOS / 로컬 데모

Interview‑ready conclusion (memorize)

“학습을 위해 하나의 에이전트로 시작하지만, 실제 DevOps에서는 병렬 빌드, 격리, 보안 및 다양한 환경을 처리하기 위해 종종 ephemeral agents를 사용하여 여러 에이전트를 활용합니다.”

Back to Blog

관련 글

더 보기 »

시계열 예측: 전통적 방법과 ML 접근법

시계열 예측: 전통적 접근법과 ML 접근법을 활용한 신뢰할 수 있는 예측 시스템 구축 상상해 보세요: 블랙 프라이데이 기간에 귀하의 e‑commerce 플랫폼이 갑자기 다운되는 상황을.