Jenkins Agents 实验
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)
- 打开 Jenkins:
http://localhost:9090 - Manage Jenkins → Nodes and Clouds → New Node
- Name:
mac-agent - 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 — 当代理离线会怎样?
目标
了解作业卡住的 原因。
步骤
- 停止代理进程(在终端中
Ctrl+C)。 - 在作业上点击 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
- 演示
- 小团队
- 串行流水线
您现在正处于此处 ✅
当您必须添加更多代理时
-
并行流水线
- 多个开发者提交代码
- CI 任务堆积
-
不同的工具
- 一个用于 Docker 的代理
- 一个用于 Terraform 的代理
- 一个用于安全扫描的代理
-
不同的操作系统
- Linux 代理
- Windows 代理
- macOS 代理
-
安全隔离
- 生产部署代理 ≠ 构建代理
实际 DevOps 设置(典型)
| 代理类型 | 用途 |
|---|---|
| Linux Docker 代理 | CI 构建 |
| Terraform 代理 | 基础设施 |
| Security 代理 | 扫描 |
| Kubernetes 代理 | 可扩展 CI |
| Mac 代理 | iOS / 本地演示 |
面试准备结论(记住)
“我从一个代理开始学习,但在真实的 DevOps 中,我们使用多个,通常是 临时代理 来处理并行构建、隔离、安全性以及不同的环境。”