使用 Agent
Jenkins 架构专为分布式构建环境而设计。它允许我们为每个构建项目使用不同的环境,平衡并行运行作业的多个代理之间的工作负载。
Jenkins 控制器是 Jenkins 安装中的原始节点。 Jenkins 控制器管理 Jenkins 代理并协调它们的工作,包括在代理和监控代理上调度作业。代理可以使用本地或云计算机连接到 Jenkins 控制器。
Agent 需要安装 Java 和到 Jenkins 控制器的网络连接。
使用 Docker 配置 Agent
Jenkins Agent 可以在物理机、虚拟机、Kubernetes 集群和 Docker 镜像中启动。本节使用 SSH 将 Docker agent 连接到 Jenkins。
环境要求
- 安装 Java
- 安装 Jenkins
- 安装 Docker
- SSH 秘钥对
生成 SSH 秘钥对
在终端中运行以下命令,生成 jenkins_agent_key 秘钥对
1
ssh-keygen -f ~/.ssh/jenkins_agent_key
创建 Jenkins SSH 凭证
登录 Jenkins 主控节点,点击
系统管理
–>Manage Credentials
;
从全局选项中选择下拉选项添加凭据
根据以下内容填写凭证添加页面表格
- 类型: 选择
SSH Username with private key
; - 范围: 选择 全局;
- 描述: jenkins 的 ssh 秘钥
- 用户名: jenkins
- 私钥: 直接选择 Enter 并按 Add 按钮从 ~/.ssh/jenkins_agent_key 插入您的私钥
- 密码:填写用于生成 SSH 密钥对的密码,然后按 OK
- 类型: 选择
创建 Docker agent
在这里,我们将使用 docker-ssh-agent 镜像来创建代理容器。
运行以下命令来启动你的第一个代理
1
2
3
4
5docker run -d \
--name=agent1 \
-p 2222:22 \
-e "JENKINS_AGENT_SSH_PUBKEY=[your-public-key]" \
jenkins/ssh-agent:alpine注意:请记住将标签 [your-public-key] 替换为您自己的 SSH 公钥。在这个例子中你的公钥是: cat ~/.ssh/jenkins_agent_key.pub
1
2
3
4
5docker run -d \
--name=agent1 \
-p 2222:22 \
-e "JENKINS_AGENT_SSH_PUBKEY=ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJFbOMWBuuv7JcNTGHLyzNk57x21djRB/RoA/zQbll5xtc1vk/HUfPMbcYikANR3Rr2fvwfQXVmiX8hA9RVLYyPb5O53kIfrS/z2wvGTiDUfdhjxgA0MuGgpFlRyxDqc37Wb3ktdXYBqvaNJJcaACQTVBPwVGeEuOFtWW71wetiJ2uqaAats8XhcJLNfwjxspsXX17w+6pw0OHtl+6KDe4IwaURwKaxi9i72ZeHLuqCtz9eo4WC6RqQdO+3lu3KPkH2L+YOX6yjzsCamNxK/jjuVjcWvWRjnVHmbjvNw160YV9dnNfckXa2wpAhrda9/6HuDyOsEsYHsM03YAbLzuZ root@test-apps" \
jenkins/ssh-agent:alpine现在运行以下命令更新容器环境
1
2
3
4VARS1="HOME=|USER=|MAIL=|LC_ALL=|LS_COLORS=|LANG="
VARS2="HOSTNAME=|PWD=|TERM=|SHLVL=|LANGUAGE=|_="
VARS="${VARS1}|${VARS2}"
docker exec agent1 sh -c "env | egrep -v '^(${VARS})' >> /etc/environment"注意:第 2 步是必需的,因为映像被配置为拒绝对环境变量的更改。当问题 #33 修复后,我们可以忽略这一步。
现在容器 agent1 已经运行,如下:
1
2
3# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10926231cd80 jenkins/ssh-agent:alpine "setup-sshd" 2 minutes ago Up 2 minutes 0.0.0.0:2222->22/tcp agent1
在 Jenkins 上设置 agent1
点击
系统管理
–>节点管理
–>新建节点
;输入节点名称,选择固定节点,点击确定;
按照以下提示输入正确的内容:
- 名字: docker-agent
- 描述: 使用 Docker 运行的 Jenkins Agent
- 远程工作目录: /home/jenkins
- 标签: agent1,docker
- 用法: 只允许运行绑定到这台机器的 Job
- 启动方式: Launch agents by SSH
- 主机: 运行 agent 的宿主机IP地址
- Credentials(凭据): 选择前面创建的凭据
- Host Key Verification Strategy(秘钥验证策略): Manually trusted key verification
- 点击高级按钮,输入 端口以及 Java 路径(端口为映射的 2222,Java 路径为 )
- 可用性: 尽量保持代理在线
点击保存,然后再节点列表中可以看到新建的节点状态,如下
点击节点名称,进入节点状态页面,点击左边
日志
选项,查看节点运行日志,出现Agent successfully connected and online
则证明节点连接成功并且在线.
创建一个 job 使用 agent1 执行
- 登录 Jenkins,点击 新建任务,输入任务名称,选择创建一个自由风格的软件项目
- 在 General 页面勾选
限制项目的运行节点
,然后输入标签 agent1,docker
- 在构建触发器页面,选择
构建
–>执行 shell
- 在执行 shell 步骤的命令字段中添加命令:
echo $NODE_NAME
和名称;运行此作业时,将在日志中打印代理的名称;
- 点击保存按钮,然后点击立即构建;
- 在控台太输出中可以看到如下输出