在 Debian 上,Jenkins 通过主节点 Master 调度、代理节点 Agent 执行的方式实现分布式构建。核心思路是:在 Master 上添加多个 Agent,给每个 Agent 打上标签(如操作系统、工具链),在任务或 Pipeline 中按标签选择运行节点,从而把构建负载分摊到多台机器上。
一、架构与准备
- 组件与概念
- Master:负责调度、UI、权限与插件管理,不建议在 Master 上直接执行重构建。
- Agent:实际执行构建的节点,需安装 Java 与所需工具链(如 JDK、Git、Maven、Docker)。
- Label:节点的标签,用于按环境/工具链匹配任务(如 linux、jdk11、docker)。
- Executor:节点上的并发执行线程,数量决定该节点可并行执行的任务数。
- 环境与前置
- 所有节点安装 Java 11/17(Debian 推荐 OpenJDK 11 或更高版本)。
- 建议 Master 与 Agent 之间网络互通,开放 TCP 8080(Jenkins Web)与 TCP 50000(Agent 通信,JNLP/SSH 方式均依赖)。
- 推荐为 Agent 创建专用系统用户(如 jenkins),并设置工作目录权限。
二、两种常见部署方式
- 方式 A:SSH 直连添加 Linux 代理节点(推荐)
- 在 Master:安装插件 SSH Slaves(若界面未出现 SSH 启动方式,多为插件未装)。
- Master 菜单:Manage Jenkins → Manage Nodes and Clouds → New Node,类型选 Permanent Agent,填写名称与描述。
- 节点配置要点:
- Remote root directory:如 /var/jenkins_agent(需可写)。
- Labels:如 linux jdk11 maven。
- Usage:按需选择“尽可能使用此节点”或“仅匹配标签的任务使用”。
- Launch method:选 Launch agent via SSH,填写 Host、Credentials(SSH 私钥或用户名/密码)、JavaPath(如 /usr/bin/java)。
- 保存后,Jenkins 会通过 SSH 在 Agent 上启动并维持连接。
- 方式 B:JNLP 方式连接(适合受限网络或容器场景)
- Master 新建节点同上,记录页面提供的 JNLP 地址与 Secret。
- 在 Agent 下载 agent.jar(如 http://master:8080/jenkins/jnlpJars/agent.jar),执行:
- java -jar agent.jar -jnlpUrl http://master:8080/jenkins/computer/agent-name/slave-agent.jnlp -secret -workDir “/var/jenkins_agent”
- 如需开机自启,可将上述命令做成 systemd 服务或放入启动脚本。
三、Docker 快速搭建 Master + Agent
- 使用官方镜像 jenkinsci/blueocean:lts,通过 Docker Compose 快速起一个可扩展的 Master:
- 添加更多 Agent 容器(示例,按需运行多个):
- docker run -d --name agent1
-e JENKINS_URL=http://<master_ip>:8080
-v /var/jenkins_agent1:/var/jenkins_home
jenkinsci/blueocean:lts
java -jar /usr/share/jenkins/agent.jar -jnlpUrl http://<master_ip>:8080/computer/agent1/slave-agent.jnlp -secret -workDir “/var/jenkins_agent1”
- 说明:容器方式便于横向扩展,但需确保容器与宿主机之间对 /var/run/docker.sock 与代码目录的挂载与权限正确。
四、运行与调度任务
- 标签匹配运行
- 并发与弹性
- 在节点配置中调整 # of executors,提升单节点并发;通过增加带不同标签的 Agent 实现横向扩展。
- 节点 可用性策略建议:常在线(Keep online as much as possible),或按需上线(Take online when in demand)。
- 工具链差异化
- 在节点配置 Tool Locations 指定 JDK、Maven、Docker 等路径,使同一 Job 在不同平台复用配置。
五、常见问题与排查
- 连接失败
- SSH 方式:检查 SSH 连通性、凭据、远程目录权限 与 Java 路径。
- JNLP 方式:确认 Master URL 可达、Secret 正确、Agent 能访问 8080/50000,必要时查看 agent 日志。
- 权限与目录
- 确保 远程工作目录存在且 jenkins 用户可写;容器方式注意 挂载卷权限 与 用户命名空间。
- 构建未落到期望节点
- 检查 Label 拼写、任务 Restrict/agent label 配置,以及节点 Usage 策略。
- Master 负载过高
- 避免在 Master 上跑构建,增加 Agent 并合理设置 Executors 与 标签,将重任务调度到专用 Agent。