使用 Jenkins 构建代理

Jenkins 架构面向分布式构建,可为不同项目使用不同环境,并让多个代理并行运行作业,平衡负载。

控制器是 Jenkins 安装中的原始节点,负责管理代理、编排工作、调度与监控作业。代理可以运行在本地或云计算机,通过网络连接控制器,并需要安装 Java。

三分钟简介视频:什么是 Jenkins Agent。

代理概念

代理提供 executor,按控制器请求执行工作,包括 Pipeline 步骤、自由风格作业等。

通常用标签描述代理能力。例如 Arm64 机器可标记 aarch64,让作业只在该架构上运行;安装了代码签名应用的代理可标记 code-signing,供需要签名的作业使用。

代理既可允许运行任意作业,也可限制只执行明确分配给它的作业。

executor 数量

数量决定代理能并发执行多少任务。控制器建议设为 0,避免资源竞争,执行工作交给代理节点。

这样控制器专注管理构建和协调代理,提高稳定性与性能。具有特定能力的代理可配置多个 executor,以高效处理并发构建。

标签

标签按操作系统、硬件能力等条件为节点分组,帮助将作业分配到指定代理。例如:

linux, windows, docker, high-memory

标签在代理配置中设置。

使用方式

  • “Use this node as much as possible”:尽可能把作业分配给该节点。
  • “Only build jobs with label expressions matching this node”:只执行标签表达式匹配的作业。

使用 Docker 配置代理

代理可运行于物理机、虚拟机、Kubernetes 或 Docker。本节通过 SSH 将 Docker 代理连接到 Jenkins。

环境

需要一台安装了 Java、Jenkins、Docker,并准备好 SSH 密钥对的机器。安装帮助见 Jenkins 安装文档。

生成 SSH 密钥对

在可访问的机器运行 ssh-keygen。可以是控制器机器、容器宿主机、现有代理机器,或开发机。

Windows 可使用 Windows OpenSSH、Git for Windows 自带版本或 Cygwin;Linux、macOS、BSD 等可使用系统提供的 OpenSSH。之后需要把密钥内容复制到控制器和代理,因此先确保能复制文件内容。

终端执行 ssh-keygen -f ~/.ssh/jenkins_agent_key,输入口令,可以为空。输出应类似:

ubuntu@desktop:~$ ssh-keygen -f ~/.ssh/jenkins_agent_key
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ubuntu/.ssh/jenkins_agent_key
Your public key has been saved in /home/ubuntu/.ssh/jenkins_agent_key.pub
The key fingerprint is:
SHA256:XqxxjqsLlvDD0ZHm9Y2iR7zC6IbsUlMEHo3ffy8TzGs
The key's randomart image is:
+---[RSA 3072]----+
|  o+             |
| ...o  .         |
|  .o .+ .        |
|    o+.+ o o     |
|  ... o.So* .    |
|  o+ = +.X=      |
| o oO + *..+     |
|. oo.o o .E .    |
| o... oo.. o     |
+----[SHA256]-----+

创建 Jenkins SSH 凭据

  1. 从仪表盘进入 Manage Jenkins。
  2. 在 Security 下选择 Credentials。
Credentials option from Manage Jenkins page.
  1. 在 Stores scoped to Jenkins 的 global 项选择 Add Credentials。
Add credentials option.
  1. 按实际情况填写:Kind 为 SSH username with private key;ID 为 jenkins;Description 为 The Jenkins SSH key;Username 为 jenkins。
  2. Private Key 选择 Enter directly,再点击 Add,填入私钥文件 ~/.ssh/jenkins_agent_key 的内容。
  3. Passphrase 输入生成密钥时使用的口令;未设口令则留空。
  4. 点击 Create。
Credential configuration form filled in.

创建 Docker 代理

Linux

使用 docker-ssh-agent 镜像启动第一个代理:

docker run -d --rm --name=agent1 -p 22:22 \
-e "JENKINS_AGENT_SSH_PUBKEY=<your_public_key>" \
jenkins/ssh-agent:alpine-jdk21

将 <your_public_key> 替换为自己的公钥。可在生成密钥的机器运行 cat ~/.ssh/jenkins_agent_key.pub 获取。不要给值加方括号,必须包含 .pub 文件完整内容,包括 ssh-XXXX 前缀。

原文示例公钥:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAQQCo9+BpMRYQ/dL3DS2CyJxRF+j6ctbT3/Qp84+KeFhnii7NT7fELilKUSnxS30WAvQCCo2yU1orfgqr41mM70MB

如果主机已有 SSH 服务占用 22 端口,例如你正通过 SSH 登录该机,请使用其他映射端口,如 -p 4444:22。

现在 agent1 容器已经启动,可用 docker ps 查看。

Windows

同样使用 docker-ssh-agent 镜像:

docker run -d --rm --name=agent1 --network jenkins -p 22:22 `
  -e "JENKINS_AGENT_SSH_PUBKEY=<your_public_key>" `
  jenkins/ssh-agent:jdk21

替换自己的公钥,可通过 Get-Content $Env:USERPROFILE\.ssh\jenkins_agent_key.pub 查看。

使用 docker ps 确认容器。还可运行 docker container inspect agent1 | Select-String -Pattern '"IPAddress": "\d+\.\d+\.\d+\.\d+"',查看 Jenkins 中应填写的 Host。

在 Jenkins 配置 agent1

  1. 进入 Manage Jenkins。
  2. 选择 Nodes。
Manage node menu.
  1. 点击 New Node,输入节点名称,选择 Permanent Agent,再点击 Create。
  2. 填写 Remote root directory、Labels、Usage、Launch method、Host、Credentials 和 Host Key verification Strategy。
Node configuration page filled in.
  1. 保存后,agent1 已注册,但暂时离线。点击节点查看状态。

状态页应显示 This node is being launched。否则点击 Relaunch agent,等待几秒。然后查看 Log,底部应出现 Agent successfully connected and online。

如果控制器无法通过 SSH 启动代理,请核对代理端口。在 Advanced 中把正确端口填入 Port。

将第一个作业分配给 agent1

  1. 仪表盘选择 New Item。
  2. 输入名称,例如 First job on agent1。
  3. 选择 Freestyle project,点击 OK。
  4. 勾选 Restrict where this project can be run。
  5. 在 Label Expression 填写 agent1,注意不要在标签前后加入空格。
Label expression field with agent1 value.
  1. 从 Build Steps 选择 Execute shell。
  2. Command 填入 echo $NODE_NAME,运行时会在日志显示代理名称。
Entering the command for the build step.
  1. 保存,再点击 Build Now。
  2. 等待几秒,打开 Console Output,应得到类似输出:
Console output of a successful build.

重启代理

重启 Jenkins 代理视频介绍了多种重启方法。


原文:Using Jenkins agents。作者/维护方:Jenkins 文档维护者。本文为中文翻译,代码及命令保留原文。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容