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. 磁盘空间不足
   - 检查工作目录空间
   - 清理旧构建文件
相关推荐
乘云数字DATABUFF4 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--6 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森6 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜6 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB7 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode9 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220709 天前
如何搭建本地yum源(上)
运维
大树8812 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠12 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质12 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务