Jenkins Agents 实验

发布: (2026年2月7日 GMT+8 07:15)
8 分钟阅读
原文: Dev.to

Sure! I see the source link, but I don’t have the article’s content to translate. Could you please paste the text you’d like me to translate into Simplified Chinese? Once you provide it, I’ll keep the source link unchanged and translate the rest while preserving all formatting.

0) “创建” 与 “启用” 的含义

创建代理 – 在 Jenkins UI 中定义一个节点(名称、标签、工作区)。

启用代理 – 启动代理进程,使其连接并变为 在线

A) 在你的 Mac 上创建本地代理(控制器在本地主机)

第一步 – 创建代理工作区文件夹(终端)

mkdir -p ~/jenkins-agent

第二步 – 在 Jenkins 中创建节点(UI)

  1. 打开 Jenkins: http://localhost:9090
  2. Manage Jenkins → Nodes and Clouds → New Node
  3. Name: mac-agent
  4. Type: Permanent Agent → Create

第三步 – 配置节点(UI)

字段
执行器数量1
远程根目录/Users/aisalkyn/jenkins-agent
标签mac local
使用方式尽可能多地使用此节点
启动方式通过连接到控制器来启动代理
可用性尽可能保持此代理在线

点击 保存

B) 启用(上线)代理 – 推荐方法(WebSocket)

第 4 步 – 下载 agent.jar(终端)

cd ~/jenkins-agent
curl -o agent.jar http://localhost:9090/jnlpJars/agent.jar

第 5 步 – 启动代理(终端)

运行代理(保持此终端打开):

java -jar agent.jar \
  -url http://localhost:9090 \
  -secret  \
  -name mac-agent \
  -webSocket \
  -workDir "/Users/aisalkyn/jenkins-agent"

获取 secret 的位置: Nodes → mac-agent → Jenkins 会显示确切的命令和 secret。

第 6 步 – 确认已上线(UI)

Manage Jenkins → Nodes and Clouds – 你应该看到 mac-agent = 绿色 / 在线

C) 在代理上运行作业(证明)

第 7 步 – 使用标签 mac 的流水线

pipeline {
  agent { label 'mac' }

  stages {
    stage('Proof') {
      steps {
        sh 'hostname'
        sh 'whoami'
        sh 'pwd'
      }
    }
  }
}

预期: 工作区路径包含

/Users/aisalkyn/jenkins-agent/workspace/...

D) 常见问题(快速修复)

代理保持离线

原因: 节点已创建,但代理进程未启动。
解决方案: 运行 步骤 5 中的 WebSocket 命令。

“Invalid or corrupt jarfile agent.jar”

原因: agent.jar 是通过隧道/重定向下载的。
解决方案: 直接重新下载:

curl -o agent.jar http://localhost:9090/jnlpJars/agent.jar

Jenkins 无法启动(Java 版本)

Jenkins 支持 Java 17/21。请显式使用 Java 21 启动 Jenkins:

/opt/homebrew/opt/openjdk@21/bin/java -jar /opt/homebrew/opt/jenkins-lts/libexec/jenkins.war \
  --httpPort=9090 --httpListenAddress=127.0.0.1

流水线卡住 “Still waiting to schedule task”

原因: 标签不匹配或代理离线。
解决方案: 确保节点带有标签 mac,且代理处于在线状态。

“我在 Nodes 下创建代理,分配 labels,并使用 WebSocket 进行连接,从而在不打开入站 TCP 端口的情况下让构建在工作节点上运行。”

实验:Jenkins 代理 — 调度、标签、并行性与扩展

本实验 使用您已经创建的代理 (mac-agent),并教授:

  • Jenkins 如何调度工作
  • 代理为何重要
  • 何时需要更多代理

实验 1 — 证明构建在代理上运行(基线)

目标
验证作业 不在控制器上运行,而是在 mac-agent 上运行。

Jenkinsfile(作业 1)

pipeline {
  agent { label 'mac' }

  stages {
    stage('Where am I running?') {
      steps {
        sh 'echo "Node name: $NODE_NAME"'
        sh 'hostname'
        sh 'whoami'
        sh 'pwd'
      }
    }
  }
}

预期结果

  • NODE_NAME = mac-agent
  • 工作区路径:
/Users/aisalkyn/jenkins-agent/workspace/...

DevOps 要点: 标签决定代码 在哪里 运行。

实验 2 — 当代理离线会怎样?

目标
了解作业卡住的 原因

步骤

  1. 停止代理进程(在终端中 Ctrl+C)。
  2. 在作业上点击 Build Now

结果
作业停留在 Build Queue,显示信息:

Still waiting to schedule task
mac-agent is offline

DevOps 要点: Jenkins 不会 自动启动代理;代理必须处于运行状态,作业才能执行。

实验 3 — 控制器 vs 代理(反模式演示)

目标
展示在控制器上运行为何是坏习惯。

Jenkinsfile(作业 2)

pipeline {
  agent any

  stages {
    stage('Controller test') {
      steps {
        sh 'echo "Running on $NODE_NAME"'
      }
    }
  }
}

结果
Built‑In Node(即控制器)上运行。

向学生解释: 控制器不应:

  • 构建 Docker 镜像
  • 运行 Terraform
  • 执行大量测试

DevOps 规则: 在生产环境中使用 agent any 是危险的。

实验 4 — 标签控制调度(重要)

目标
展示标签如何挑选代理。

步骤
将 Jenkinsfile 中的标签改为一个 不存在 的标签:

agent { label 'linux' }

结果

  • 作业卡在队列中(没有匹配的代理)。

修复

恢复为有效标签:

agent { label 'mac' }

实验 5 — 单代理的并行构建

目标
展示执行器的限制。

Jenkinsfile(作业 3)

pipeline {
  agent { label 'mac' }

  stages {
    stage('Parallel test') {
      parallel {
        stage('Task A') {
          steps {
            sh 'sleep 20'
          }
        }
        stage('Task B') {
          steps {
            sh 'sleep 20'
          }
        }
      }
    }
  }
}

结果

  • 一个阶段先运行。
  • 另一个阶段等待。

原因? mac-agent 只有 1 个执行器

实验 6 — 增加执行器 vs 添加代理

方案 A — 增加执行器

mac‑agent 配置中将 Executors 设置为 2
重新运行作业 → 两个阶段并行执行。

方案 B — 添加另一个代理

创建 mac-agent-2,并设置 1 个执行器

DevOps 规则

方法适用场景
增加执行器轻量工作负载
增加代理重量或需要隔离的工作负载

实验 7 — 模拟真实的 DevOps 工作负载

Jenkinsfile

pipeline {
  agent { label 'mac' }

  stages {
    stage('Build') {
      steps {
        sh 'echo "Building..."'
        sh 'sleep 10'
      }
    }

    stage('Test') {
      steps {
        sh 'echo "Testing..."'
        sh 'sleep 10'
      }
    }

    stage('Package') {
      steps {
        sh 'echo "Packaging..."'
        sh 'sleep 10'
      }
    }
  }
}

解释

在真实的 CI 场景中:

  • 构建 → 测试 → 扫描 → 打包
  • 所有步骤均由 代理 执行,而不是控制器。

您需要更多代理吗?

简短回答

  • 目前:否
  • 在真实的 DevOps 环境中:是

当单个代理足够时

  • 学习 Jenkins
  • 演示
  • 小团队
  • 串行流水线

您现在正处于此处

当您必须添加更多代理时

  1. 并行流水线

    • 多个开发者提交代码
    • CI 任务堆积
  2. 不同的工具

    • 一个用于 Docker 的代理
    • 一个用于 Terraform 的代理
    • 一个用于安全扫描的代理
  3. 不同的操作系统

    • Linux 代理
    • Windows 代理
    • macOS 代理
  4. 安全隔离

    • 生产部署代理 ≠ 构建代理

实际 DevOps 设置(典型)

代理类型用途
Linux Docker 代理CI 构建
Terraform 代理基础设施
Security 代理扫描
Kubernetes 代理可扩展 CI
Mac 代理iOS / 本地演示

面试准备结论(记住)

“我从一个代理开始学习,但在真实的 DevOps 中,我们使用多个,通常是 临时代理 来处理并行构建、隔离、安全性以及不同的环境。”

Back to Blog

相关文章

阅读更多 »

量子安全计算的不安全性

量子隐私:为何某些量子技巧无法保护秘密安全 人们曾希望量子技术能够阻止陌生人窃取秘密,就像智能卡……