Jenkins 使用 Swarm 添加 Agent

前言

最近又搭了个 Jenkins 用来自动构建,出于安全考虑等原因,我决定把构建工作分配到其他节点上运行。

我使用通常的方法添加节点时,我发现一些地方不尽人意:我的 Jenkins 是可以公网访问的,配置的 Jenkins URL 也是公网地址,而我的构建节点和 Jenkins 管理节点可以直接内网访问。这种情况下使用通常方法配置的 Agent 仍然会走公网访问 Jenkins,不论是网络质量还是安全性都不如内网。

于是我找到了 Swarm 插件。

为什么要用 Swarm

Swarm 插件能让节点加入附近的 Jenkins 控制器,从而形成一个临时集群。该插件通过启动和关闭新代理 (Agent),使扩展 Jenkins 集群变得更容易,让团队成员能够为构建农场贡献计算资源,或附加 Jenkins 控制器无法启动连接的代理。

通俗来说,我们无需在 Jenkins 上手动配置每个节点,Swarm 可以动态增删节点,配置灵活。

使用方法

创建专用用户

创建一个 Swarm 专用用户 (例如 swarm-agents),用于动态创建节点

我使用的是基于角色的授权策略,所以需要新建角色。如果你使用的是其他授权策略,可参考官方文档

创建一个 Swarm 角色,并为这个角色授予必要权限

  • Overall/Read
  • Agent/Configure
  • Agent/Connect
  • Agent/Create

2023-10-12T09:24:54.webp

为刚才创建的用户分配这个角色

2023-10-12T09:26:01.webp

登录账号并添加新Token

配置节点

下载 Agent 客户端

${JENKINS_URL}/swarm/swarm-client.jar

创建配置文件

swarm-config.yml

# Jenkins 地址 (必须)
url: http://192.168.20.101:8080/
# 节点名称
# name: agent-name-0
# 注释
# description: Configured from yml
# 目录
fsroot: D:\jenkins-agent
# 并发构建数
executors: 1
# 标签
labels:
  - windows
  - msvc
  - jdk
  - jdk17
  - rust
  - nodejs
  - nodejs18
# 是否使用 WebSocket 连接 (默认 false)
webSocket: true
# 环境变量
# environmentVariables:
#   ENV_1: 1234
#   ENV_2: swarm-client
# 用户名
username: swarm-agents
# 存储密码或Token的文件名
passwordFile: swarm-pwd.txt

再创建一个名为 swarm-pwd.txt 的文件,将API Token保存在其中。

除了 Jenkins 地址和身份验证信息,其他的都是可选项。

启动节点

java -jar swarm-client.jar -config swarm-config.yml

配置为系统服务 (适用于 systemd)

/etc/systemd/system/jenkins-agent.service

[Unit]
Description = jenkins-agent
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
ExecStart = /usr/bin/java -jar swarm-client.jar -config swarm-config.yml
WorkingDirectory=/home/jenkins-agent

[Install]
WantedBy = multi-user.target

本文链接:

https://blog.nkxingxh.top/archives/300/
1 + 2 =
快来做第一个评论的人吧~