Jenkins Slave节点管理指南
目录
一、Slave节点添加方法
1.1 添加前的准备工作
1.1.1 Master节点配置
确保Master节点已启用JNLP Agent端口:
Manage Jenkins → Configure Global Security → Agents
- 设置 Agent Port 为 50000(或固定端口)
- 选择 "Random" 或指定端口范围
1.1.2 Slave节点环境准备
Windows Slave节点准备:
powershell
# 1. 创建Jenkins用户
New-LocalUser -Name "jenkins" -Password (ConvertTo-SecureString "YourPassword" -AsPlainText -Force) -Description "Jenkins Agent User"
# 2. 添加到管理员组(如需要)
Add-LocalGroupMember -Group "Administrators" -Member "jenkins"
# 3. 创建工作目录
New-Item -Path "C:\JenkinsAgent" -ItemType Directory -Force
# 4. 安装Java JDK(新版的jenkins推荐JDK17)
# 下载地址:https://www.oracle.com/java/technologies/downloads/
# 5. 设置JAVA_HOME环境变量
[Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Program Files\Java\jdk17", "Machine")
Linux Slave节点准备:
bash
# 1. 创建Jenkins用户
sudo useradd -m -s /bin/bash jenkins
# 2. 创建工作目录
sudo mkdir -p /home/jenkins/agent
sudo chown -R jenkins:jenkins /home/jenkins/agent
# 3. 安装Java
# CentOS/RHEL
sudo yum install -y java-17-openjdk java-17-openjdk-devel
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y openjdk-17-jdk
# 4. 验证Java安装
java -version
1.2 方法一:通过Web界面添加静态Agent
1.2.1 创建新节点
- 登录Jenkins Master Web界面
- 进入 Manage Jenkins → Manage Nodes
- 点击左侧菜单 "New Node"
- 输入节点名称(如
windows-build-01) - 选择 "Permanent Agent" → 点击 OK
1.2.2 节点配置参数说明
| 配置项 | 说明 | 推荐值 |
|---|---|---|
| Name | 节点唯一标识名称 | windows-build-01 |
| Description | 节点描述信息 | Windows构建节点01 |
| Number of executors | 并发构建数 | CPU核心数的50%-75% |
| Remote root directory | Agent工作目录 | C:\JenkinsAgent |
| Labels | 节点标签(逗号分隔) | windows,build,java,maven |
| Usage | 节点使用策略 | Use this node as much as possible |
| Launch method | Agent启动方式 | Launch agent via JNLP |
1.2.3 节点配置示例(Windows Slave)
Name: windows-build-01
Description: Windows构建节点01
Number of executors: 4
Remote root directory: C:\JenkinsAgent
Labels: windows build java maven
Usage: Use this node as much as possible
Launch method: Launch agent via execution of command on the Master
1.2.4 启动Agent连接
方式A:JNLP方式(从节点机器启动)
- 在Master上查看节点的secret:
- 进入节点配置页面

- 进入节点配置页面
- 点击新增node按钮,进入node配置页面

- 保存之后,进入节点的详情页面,根据agent.jar的下载链接下载jar包,然后复制启动命令到slave节点服务器上去执行就添加成功了。

-
在Slave节点上下载agent.jar:
注意jenkins master服务器上配置的jenkins URL,这里配置的URL需要slave节点可以访问到的,不要像图中那样配置一个localhost,slave节点服务器是访问不到的。

http://your-jenkins-master:8080/jnlpJars/agent.jar -
在Slave节点上启动Agent:
powershell# 命令格式 java -jar agent.jar -url http://master:8080 -secret <SECRET> -name "windows-build-01" # 示例 java -jar agent.jar -url http://jenkins-master:8080 -secret abc123def456 -name "windows-build-01"
方式B:直接启动(Master上执行)
- 在节点配置中选择 "Launch agent by connecting it to the master"
- 在Master上执行生成的反连命令
1.2.5 配置为Windows服务(持久化运行)
-
下载 winsw 到
C:\JenkinsAgent\ -
创建配置文件
jenkins-agent.xml:
xml
<service>
<id>jenkins-agent</id>
<name>Jenkins Agent</name>
<description>Jenkins Build Agent</description>
<executable>java</executable>
<arguments>-jar "C:\JenkinsAgent\agent.jar" -url http://jenkins-master:8080 -secret xxxxx -name "windows-build-01"</arguments>
<logmode>rotate</logmode>
<onfailure action="restart"/>
</service>
- 安装并启动服务:
powershell
cd C:\JenkinsAgent
.\jenkins-agent.exe install
Start-Service jenkins-agent
1.3 方法二:通过命令行添加Agent
1.3.1 下载agent.jar
bash
# 在Master上下载
curl -o agent.jar http://your-jenkins-master:8080/jnlpJars/agent.jar
1.3.2 启动Agent
bash
# Linux/Mac
java -jar agent.jar -url http://master:8080 -secret <SECRET> -name "linux-build-01"
# Windows
java -jar agent.jar -url http://master:8080 -secret <SECRET> -name "windows-build-01"
1.4 方法三:通过脚本批量添加节点
1.4.1 使用Jenkins CLI
bash
# 下载jenkins-cli.jar
curl -o jenkins-cli.jar http://your-jenkins-master:8080/jnlpJars/jenkins-cli.jar
# 创建节点(需要认证)
java -jar jenkins-cli.jar -s http://master:8080 -auth user:token create-node windows-build-01 --type hudson.slaves.DumbSlave
1.4.2 通过REST API添加节点
bash
# 创建节点配置JSON
cat > node-config.json << 'EOF'
{
"name": "windows-build-02",
"nodeDescription": "Windows构建节点02",
"numExecutors": 4,
"remoteFS": "C:\\JenkinsAgent",
"labelString": "windows build java",
"mode": "NORMAL",
"type": "hudson.slaves.DumbSlave",
"launcher": {
"stapler-class": "hudson.slaves.JNLPLauncher"
},
"retentionStrategy": {
"stapler-class": "hudson.slaves.RetentionStrategy$Always"
}
}
EOF
# 调用API创建节点
curl -X POST "http://master:8080/computer/createItem" \
-u user:api-token \
--data-binary @node-config.json \
-H "Content-Type: application/json"
二、Job均匀分布策略
2.1 Jenkins负载分配原理
Jenkins使用以下策略选择执行节点:
┌─────────────────────────────────────────────────────────┐
│ Jenkins Master │
│ │
│ Job请求 ──→ 节点选择流程: │
│ 1. 匹配Label表达式 │
│ 2. 过滤不可用节点 │
│ 3. 选择标签匹配且空闲executors最多的节点 │
│ 4. 如果都忙,进入等待队列 │
└─────────────────────────────────────────────────────────┘
2.2 标签分发策略(核心策略)
2.2.1 标签设计原则
| 标签类型 | 示例 | 说明 |
|---|---|---|
| 操作系统 | windows, linux, mac | 区分操作系统 |
| 语言环境 | java, python, go, nodejs | 区分语言栈 |
| 工具链 | maven, gradle, npm, docker | 区分构建工具 |
| 用途 | build, test, deploy | 区分执行目的 |
| 资源等级 | high-memory, gpu | 特殊资源需求 |
2.2.2 标签配置示例
Windows构建节点集群(3个相同节点):
| 节点名称 | 标签 | Executors |
|---|---|---|
| windows-build-01 | windows,build,java,maven |
4 |
| windows-build-02 | windows,build,java,maven |
4 |
| windows-build-03 | windows,build,java,maven |
4 |
关键配置点:
- 3个节点设置完全相同的标签组合
- Jenkins会自动在这3个节点间负载均衡
- 总共12个并发构建槽位
2.3 节点Usage策略
| Usage模式 | 说明 | 适用场景 |
|---|---|---|
| Use this node as much as possible | 尽可能使用该节点 | 专用构建节点 |
| Only build jobs with label expressions matching this node | 只执行标签匹配的作业 | 特殊环境节点 |
配置位置: 节点配置页面 → Usage
2.4 Job配置中的节点选择
2.4.1 Freestyle项目配置
-
勾选 "Restrict where this project can be run"
-
在Label Expression中输入标签表达式:
单标签 - 自动选择匹配节点
build
多标签AND逻辑 - 同时满足所有条件
windows && java && maven
多标签OR逻辑 - 满足任一条件
windows || linux
排除标签 - 不能使用该标签的节点
!gpu
2.4.2 Pipeline项目配置
方式1:简单标签指定
groovy
pipeline {
agent { label 'build' }
stages {
stage('Build') {
steps {
echo 'Building...'
}
}
}
}
方式2:复杂标签表达式
groovy
pipeline {
agent { label 'windows && java && !high-memory' }
stages {
stage('Build') {
steps {
bat 'mvn clean package'
}
}
}
}
方式3:动态选择节点
groovy
pipeline {
agent none // 不指定固定节点
stages {
stage('Select Node') {
steps {
script {
def nodes = jenkins.model.Jenkins.instance.nodes.findAll {
it.labelString.contains('build')
}
def targetNode = nodes.find { it.numExecutors > it.busyExecutors }
echo "Selected: ${targetNode.name}"
}
}
}
}
}
2.5 并行构建分发
2.5.1 多节点并行执行
groovy
pipeline {
agent none
stages {
stage('Parallel Build') {
parallel {
stage('Windows Build') {
agent { label 'windows && build' }
steps {
bat 'build.bat'
}
}
stage('Linux Build') {
agent { label 'linux && build' }
steps {
sh './build.sh'
}
}
}
}
}
}
2.5.2 多节点矩阵构建
groovy
def platforms = ['windows', 'linux']
def buildTypes = ['debug', 'release']
pipeline {
agent none
stages {
stage('Matrix Build') {
steps {
script {
def matrix = []
platforms.each { platform ->
buildTypes.each { buildType ->
matrix << [
platform: platform,
buildType: buildType
]
}
}
def branches = [:]
matrix.each { params ->
def currentParams = params
branches["${currentParams.platform}-${currentParams.buildType}"] = {
node("${currentParams.platform} && build") {
stage("Build ${currentParams.platform}-${currentParams.buildType}") {
echo "Building ${currentParams.platform} ${currentParams.buildType}"
}
}
}
}
parallel branches
}
}
}
}
}
2.6 高级负载均衡配置
2.6.1 节点监控与自动下线
配置节点监控:
Manage Jenkins → Manage Nodes → Configure Nodes
→ 点击节点 → 勾选 "Launch agent via web socket"
→ 配置监控选项
2.6.2 节点 Provisioning Strategy
安装 NodeLabel Parameter 插件后支持:
groovy
parameters {
choice(name: 'TARGET_NODE', choices: ['any', 'windows-build-01', 'windows-build-02'], description: '选择执行节点')
}
pipeline {
agent { label params.TARGET_NODE == 'any' ? 'build' : params.TARGET_NODE }
stages {
stage('Build') {
steps {
echo "Building on ${env.NODE_NAME}"
}
}
}
}
2.6.3 条件节点选择
groovy
pipeline {
agent any
stages {
stage('Build') {
steps {
script {
def nodeName = env.JOB_NAME.contains('windows') ? 'windows-build' : 'linux-build'
echo "Selecting node based on job: ${nodeName}"
}
}
}
}
}
三、配置示例
3.1 场景:3个相同Windows构建节点
3.1.1 节点配置
节点1:windows-build-01
Name: windows-build-01
Description: Windows构建节点01
Number of executors: 4
Remote root directory: C:\JenkinsAgent
Labels: windows build java maven
Usage: Use this node as much as possible
Launch method: Launch agent via JNLP
节点2:windows-build-02
Name: windows-build-02
Description: Windows构建节点02
Number of executors: 4
Remote root directory: C:\JenkinsAgent
Labels: windows build java maven
Usage: Use this node as much as possible
Launch method: Launch agent via JNLP
节点3:windows-build-03
Name: windows-build-03
Description: Windows构建节点03
Number of executors: 4
Remote root directory: C:\JenkinsAgent
Labels: windows build java maven
Usage: Use this node as much as possible
Launch method: Launch agent via JNLP
3.1.2 Job配置(Jenkinsfile)
groovy
// Jenkinsfile - Windows Java构建流水线
pipeline {
agent { label 'windows && build && java' }
options {
timestamps()
timeout(time: 2, unit: 'HOURS')
buildDiscarder(logRotator(numToKeepStr: '10'))
}
environment {
MAVEN_OPTS = '-Xmx2048m -Xms1024m'
JAVA_HOME = 'C:\\Program Files\\Java\\jdk1.8.0_311'
}
stages {
stage('Checkout') {
steps {
git branch: 'main',
credentialsId: 'git-credentials',
url: 'https://github.com/your-org/your-project.git'
}
}
stage('Build') {
steps {
bat 'mvn clean compile'
}
}
stage('Unit Tests') {
steps {
bat 'mvn test'
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
stage('Package') {
steps {
bat 'mvn package -DskipTests'
}
post {
always {
archiveArtifacts artifacts: 'target/*.jar', fingerprint: true
}
}
}
}
post {
success {
emailext subject: '构建成功: ${env.JOB_NAME} #${env.BUILD_NUMBER}',
body: '构建已完成,请查看结果:${env.BUILD_URL}',
to: 'team@example.com'
}
failure {
emailext subject: '构建失败: ${env.JOB_NAME} #${env.BUILD_NUMBER}',
body: '构建失败了,请检查:${env.BUILD_URL}',
to: 'team@example.com'
}
}
}
3.1.3 负载分布效果
Job执行时,Jenkins自动分配:
Job1 ──→ windows-build-01 (executors: 0/4)
Job2 ──→ windows-build-02 (executors: 0/4)
Job3 ──→ windows-build-03 (executors: 0/4)
Job4 ──→ windows-build-01 (executors: 1/4)
Job5 ──→ windows-build-02 (executors: 1/4)
...
当某个节点繁忙时,自动分配到其他空闲节点
3.2 场景:异构环境节点集群
3.2.1 节点配置
| 节点名称 | 标签 | Executors | 说明 |
|---|---|---|---|
| windows-build-01 | windows,build,java,maven |
4 | Windows Java构建 |
| windows-build-02 | windows,build,dotnet |
2 | Windows .NET构建 |
| linux-build-01 | linux,build,java,maven |
4 | Linux Java构建 |
| linux-build-02 | linux,build,go |
2 | Linux Go构建 |
| test-agent-01 | linux,test,performance |
2 | 性能测试 |
3.2.2 Job配置示例
Java构建Job:
groovy
pipeline {
agent { label 'java && build' } // windows-build-01 或 linux-build-01
stages {
stage('Build') {
steps {
sh 'mvn clean package'
}
}
}
}
Go构建Job:
groovy
pipeline {
agent { label 'go && build' } // linux-build-02
stages {
stage('Build') {
steps {
sh 'go build -o app'
}
}
}
}
四、最佳实践
4.1 节点命名规范
遵循格式:{环境类型}-{角色}-{编号}
示例:
- windows-build-01, windows-build-02, windows-build-03
- linux-build-01, linux-build-02
- linux-test-01
- mac-build-01
4.2 标签命名规范
推荐分层标签:
OS层:windows, linux, mac
角色层:build, test, deploy
语言层:java, python, go, nodejs
工具层:maven, gradle, npm, docker
特殊层:gpu, high-memory
组合示例:
- windows-build-java
- linux-build-go
- linux-test-performance
4.3 Executor数量配置
计算公式:Executor数 = CPU核心数 × CPU利用率目标
推荐配置:
- CPU密集型任务:核心数 × 0.5
- IO密集型任务:核心数 × 1.5 ~ 2.0
- 混合型任务:核心数 × 0.75
示例(8核机器):
- 构建任务(CPU密集):4 executors
- 测试任务(IO密集):8-12 executors
4.4 高可用配置建议
1. 节点冗余:
- 每个角色至少2个节点
- 避免单点故障
2. 标签分组:
- 同类型节点设置相同标签
- 便于Job灵活选择
3. 资源预留:
- Master节点预留1-2个executors
- 用于特殊任务和系统管理
4. 监控告警:
- 配置节点离线告警
- 监控executors使用率
4.5 安全配置
1. 节点通信:
- 生产环境启用JNLP over HTTPS
- 配置Agent认证secret
2. 权限控制:
- 使用Role-based Authorization Strategy
- 限制节点配置权限
3. 凭据管理:
- 节点连接凭据使用Credential Plugin
- 定期轮换secret
4.6 日常维护
1. 定期任务:
- 清理旧构建工作空间
- 清理临时文件和缓存
- 更新节点工具和插件
2. 监控检查:
- 检查节点在线状态
- 监控CPU/内存使用率
- 检查磁盘空间
3. 日志管理:
- 配置日志轮转
- 定期归档旧日志
附录:常用命令
A.1 节点管理CLI命令
bash
# 查看节点列表
java -jar jenkins-cli.jar -s http://master:8080 list-nodes
# 删除节点
java -jar jenkins-cli.jar -s http://master:8080 delete-node <node-name>
# 启用节点
java -jar jenkins-cli.jar -s http://master:8080 enable-node <node-name>
# 禁用节点
java -jar jenkins-cli.jar -s http://master:8080 disable-node <node-name>
A.2 Agent连接故障排查
常见问题:
1. 连接超时
- 检查防火墙配置
- 验证端口50000是否开放
2. Secret无效
- 重新获取节点secret
- 检查secret是否过期
3. Java版本不兼容
- 确保Java版本 >= JDK 8,新版的jenkins建议使用jdk17
- 避免使用过新的JDK版本
4. 磁盘空间不足
- 检查工作目录空间
- 清理旧构建文件