Skip to content

Jenkins - 分布式构建

在 Jenkins 控制器 (旧称 Master) 上运行所有构建很快就会成为瓶颈,特别是有大量作业或资源密集型任务时。Jenkins 支持分布式构建,允许你将构建执行分载到多个 ‘agent’ 机器 (旧称 Slave) 上。

  • 可伸缩性: 处理比单个控制器管理更多的并发构建。
  • 性能: 将构建负载分布到多台机器上。
  • 专用环境: 使用具有特定操作系统、工具 (例如用于 iOS 构建的 macOS,用于 .NET 构建的 Windows) 或特定作业所需硬件的 Agent。
  • 隔离性: 防止构建相互干扰或影响控制器的稳定性。
  • 安全性: 在受限环境或网络中运行构建。

Agent 是一个独立的机器 (物理机、虚拟机或容器),运行一个 Agent 程序 (agent.jar)。它连接回 Jenkins 控制器,由控制器编排构建执行。控制器和 Agent 之间建立通信通道 (通常是 TCP/IP) 以交换命令和构建日志。

这些步骤描述了如何设置一个传统的、长期运行的 Agent 机器。

步骤 1: 前往 管理 Jenkins → 节点 (Nodes)。

步骤 2: 点击“新建节点” (或在新版本中点击“新建 Agent”)。

步骤 3: 输入“Agent 名称” (例如 linux-build-agent)。选择“永久 Agent”。点击“创建”。

步骤 4: 配置 Agent 详情:

  • 描述: 可选描述。
  • 执行器数量: 此 Agent 可以运行多少个并发构建 (例如,基于 CPU 核数)。
  • 远程根目录: Agent 机器上 Jenkins 存储工作空间和文件的目录 (例如 /var/jenkins_agent 或 C:\JenkinsAgent)。确保运行 Agent 进程的用户在此目录有权限。
  • 标签: 对指定作业至关重要。分配一个或多个标签 (用空格分隔,例如 linux docker java11)。作业可以请求具有特定标签的 Agent。
  • 使用方式: “尽可能使用此节点”(默认) 或“仅构建与此节点标签表达式匹配的作业”。
  • 启动方式: 控制器如何连接并启动 Agent 进程。常用方法:
    • 通过 SSH 启动 Agent: (推荐用于 Linux/macOS) 需要 Agent 上有 SSH 服务器以及存储在 Jenkins 凭据中的 SSH 凭据 (用户名/密码或私钥)。Jenkins 通过 SSH 连接并启动 Agent。
    • 通过在控制器上执行命令启动 Agent: 你提供一个在控制器上运行的脚本来启动 Agent (较少使用)。
    • 通过连接到控制器启动 Agent: (旧称 JNLP/Java Web Start) Agent 向 控制器发起连接。需要控制器上开启端口 50000 (或配置的 Agent 端口)。由于安全性和设置复杂性,现在较少推荐。
    • 通过 Windows 服务启动 Agent: 在 Windows 上安装并作为服务管理 Agent。
  • 可用性: 尽可能保持 Agent 在线、安排可用时间等。

步骤 5: 配置其他选项,例如节点属性 (Node Properties) (此 Agent 特定的环境变量)。

步骤 6: 点击“保存”。

步骤 7: 遵循特定的说明,根据你选择的启动方式 (例如,为 SSH 初始连接或 JNLP 启动在 Agent 上运行命令)。

正确配置并启动后,该 Agent 将在“节点”列表中显示为在线。

在 Jenkins Pipeline (Jenkinsfile) 中,你可以使用 agent 指令指定构建或阶段应在哪个(些) Agent 上运行:

pipeline {
// Run the entire pipeline on any available agent with the 'linux' label
agent { label 'linux' }
stages {
stage('Build') {
steps {
sh './build.sh'
}
}
stage('Test on Windows') {
// Run this specific stage on a Windows agent
agent { label 'windows' }
steps {
bat 'mvn test'
}
}
}
}

不同于永久 Agent,Jenkins 可以根据需要动态配置 Agent,通常使用云服务提供商插件 (AWS EC2, Azure VM Agents, Google Cloud) 或容器技术:

  • Docker Agent: 直接在 Pipeline 中使用 Docker 镜像定义 Agent。Jenkins 可以在容器内部运行构建,确保环境干净、可重现。需要 Docker Pipeline 插件。
  • Kubernetes Agent: 使用 Kubernetes 插件为每个构建动态启动 Kubernetes 集群中的 Agent Pod。高度可伸缩且高效。

Pipeline 中的 Docker Agent 示例:

pipeline {
agent {
docker {
image 'maven:3.8.5-openjdk-11'
args '-v $HOME/.m2:/root/.m2' // 挂载 Maven 缓存
}
}
stages {
stage('Build') {
steps {
sh 'mvn clean package'
}
}
}
}

分布式构建是有效扩展 Jenkins 的基础。选择永久 Agent 还是动态 Agent 取决于你的工作负载模式、基础设施和环境一致性需求。