温馨提示×

Debian Jenkins怎样实现分布式构建

小樊
57
2026-01-03 13:05:04
栏目: 智能运维

在 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 代理节点(推荐)
    1. 在 Master:安装插件 SSH Slaves(若界面未出现 SSH 启动方式,多为插件未装)。
    2. Master 菜单:Manage Jenkins → Manage Nodes and Clouds → New Node,类型选 Permanent Agent,填写名称与描述。
    3. 节点配置要点:
      • Remote root directory:如 /var/jenkins_agent(需可写)。
      • Labels:如 linux jdk11 maven
      • Usage:按需选择“尽可能使用此节点”或“仅匹配标签的任务使用”。
      • Launch method:选 Launch agent via SSH,填写 HostCredentials(SSH 私钥或用户名/密码)、JavaPath(如 /usr/bin/java)。
    4. 保存后,Jenkins 会通过 SSH 在 Agent 上启动并维持连接。
  • 方式 B:JNLP 方式连接(适合受限网络或容器场景)
    1. Master 新建节点同上,记录页面提供的 JNLP 地址Secret
    2. 在 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”
    3. 如需开机自启,可将上述命令做成 systemd 服务或放入启动脚本。

三、Docker 快速搭建 Master + Agent

  • 使用官方镜像 jenkinsci/blueocean:lts,通过 Docker Compose 快速起一个可扩展的 Master:
    • docker-compose.yml
      version: '3'
      services:
        jenkins:
          image: jenkinsci/blueocean:lts
          ports:
            - "8080:8080"
            - "50000:50000"
          volumes:
            - jenkins_home:/var/jenkins_home
            - /var/run/docker.sock:/var/run/docker.sock
      volumes:
        jenkins_home:
      
    • 启动:docker-compose up -d
  • 添加更多 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 与代码目录的挂载与权限正确。

四、运行与调度任务

  • 标签匹配运行
    • Freestyle:在任务配置中勾选 Restrict where this project can be run,填写节点 Label(如 linux && jdk11)。
    • Pipeline:在 agent 指令中指定标签,如:
      pipeline {
        agent { label 'linux && jdk11' }
        stages {
          stage('Build') { steps { sh 'mvn clean package' } }
        }
      }
      
  • 并发与弹性
    • 在节点配置中调整 # 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。

0