Jenkins - 分布式构建
Jenkins - 分布式构建 (Agent)
Section titled “Jenkins - 分布式构建 (Agent)”在 Jenkins 控制器 (旧称 Master) 上运行所有构建很快就会成为瓶颈,特别是有大量作业或资源密集型任务时。Jenkins 支持分布式构建,允许你将构建执行分载到多个 ‘agent’ 机器 (旧称 Slave) 上。
为何使用 Agent?
Section titled “为何使用 Agent?”- 可伸缩性: 处理比单个控制器管理更多的并发构建。
- 性能: 将构建负载分布到多台机器上。
- 专用环境: 使用具有特定操作系统、工具 (例如用于 iOS 构建的 macOS,用于 .NET 构建的 Windows) 或特定作业所需硬件的 Agent。
- 隔离性: 防止构建相互干扰或影响控制器的稳定性。
- 安全性: 在受限环境或网络中运行构建。
Agent 架构
Section titled “Agent 架构”Agent 是一个独立的机器 (物理机、虚拟机或容器),运行一个 Agent 程序 (agent.jar)。它连接回 Jenkins 控制器,由控制器编排构建执行。控制器和 Agent 之间建立通信通道 (通常是 TCP/IP) 以交换命令和构建日志。
设置永久 Agent
Section titled “设置永久 Agent”这些步骤描述了如何设置一个传统的、长期运行的 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 将在“节点”列表中显示为在线。
在 Pipeline 中使用 Agent
Section titled “在 Pipeline 中使用 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 (云、Docker、Kubernetes)
Section titled “动态 Agent (云、Docker、Kubernetes)”不同于永久 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 取决于你的工作负载模式、基础设施和环境一致性需求。