jenkins的slave节点管理

Jenkins Slave节点管理指南

目录

  1. Slave节点添加方法
  2. Job均匀分布策略
  3. 配置示例
  4. 最佳实践

一、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 创建新节点
  1. 登录Jenkins Master Web界面
  2. 进入 Manage JenkinsManage Nodes
  3. 点击左侧菜单 "New Node"
  4. 输入节点名称(如 windows-build-01
  5. 选择 "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方式(从节点机器启动)

  1. 在Master上查看节点的secret:
    • 进入节点配置页面
  • 点击新增node按钮,进入node配置页面
  • 保存之后,进入节点的详情页面,根据agent.jar的下载链接下载jar包,然后复制启动命令到slave节点服务器上去执行就添加成功了。
  1. 在Slave节点上下载agent.jar:

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

    复制代码
    http://your-jenkins-master:8080/jnlpJars/agent.jar
  2. 在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上执行)

  1. 在节点配置中选择 "Launch agent by connecting it to the master"
  2. 在Master上执行生成的反连命令
1.2.5 配置为Windows服务(持久化运行)
  1. 下载 winswC:\JenkinsAgent\

  2. 创建配置文件 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>
  1. 安装并启动服务:
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项目配置
  1. 勾选 "Restrict where this project can be run"

  2. 在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. 磁盘空间不足
   - 检查工作目录空间
   - 清理旧构建文件
相关推荐
易知微EasyV数据可视化2 小时前
数字孪生+AI:青岛大学附属医院-立体监管院区运行,智能调度防范风险隐患
运维·人工智能·经验分享·数字孪生·空间智能
小码吃趴菜2 小时前
服务器预约系统linux小项目-第九节课
linux·运维·服务器
AI-小柒2 小时前
大模型API中转推荐:Dataeyes API 600+模型统一网关与负载均衡部署,claude编程、香蕉生图、视频大模型聚合平台
大数据·运维·开发语言·人工智能·算法·机器学习·负载均衡
lulu12165440782 小时前
大模型API中转平台weelinking技术深度解析:架构、性能与部署实践
运维·人工智能·架构·ai编程
Shepherdppz2 小时前
【避坑指南】超级笔记 Supernote 私有云部署完整指南:从零到一在群晖Synology NAS上搭建私人同步服务器
运维·服务器·笔记
智能运维指南2 小时前
嘉为蓝鲸 DevOps 平台与 AI 技术结合:推动数字化转型的行业标杆
运维·人工智能·devops
mingjie12122 小时前
mac virtualbox虚拟机 ubuntu-server openclaw 访问配置
linux·运维·ubuntu·openclaw
藤谷性能2 小时前
Ubuntu 22.04:在双硬盘电脑上安装Ubuntu 22.04单系统
linux·运维·ubuntu
我科绝伦(Huanhuan Zhou)2 小时前
分享一个自己写的智能巡检系统
运维·人工智能·自动化