前言:是用jenkins最好多使用jenkins-agent的方式来编译或者构建镜像,可以减轻jenkins主节点的压力。另外还可以利用jenkins-agent的网络,减少了主节点配置多个环境变量的问题。Jenkins采用分布式架构,分为server节点和agent节点。server节点也是可以运行构建任务的,但我们一般使其主要来做任务的调度。(毕竟server节点挂了就都…)agent节点专门用于任务的执行。随着现在容器的盛行,我们可以将server节点和agent节点在容器或者基于Kubernetes中部署。关于agent节点借助容器可以实现动态的资源分配等等好处。agent节点可以分为静态节点和动态节点。静态节点是固定的一台vm虚机或者容器。动态节点是随着任务的构建来自动创建agent节点。
1.1 Java Web方式 Launch agent by connecting it to the master
使用Java Web Start。在这种情况下,必须在Agent机器上打开JNLP文件,这将建立到Jenkins服务器的TCP连接。这意味着不需要Jenkins服务器访问Agent;而是Agent能够链接到Jenkins Server即可。
如果通过“配置全局安全配置”页面启用了安全性,则可以自定义Jenkins服务器监听的Agent连接的端口。也就是相当于Agent节点会开启一个随机的端口与Server中配置的端口连接。所以一般申请网络权限我们需要开放Jenkins服务器的监听端口给Agent连接。
默认情况下,Agent将启动GUI,但是也可以在没有GUI的情况下运行代理,例如作为Windows服务。在Linux中我们一般会使用nohup等方式保证进程在后台运行。
首先,我们在Jenkins Server页面>节点管理菜单中添加一个Jenkins Agent。在DevOps流水线实践教程中,我们在添加Agent节点的时候选择的是java web start方式启动的agent与Jenkins Server的连接。现在很多同学反馈找不到此选项了,开始我以为是汉化问题。后来发现新版本中修改了名称为Launch agent by connecting it to the master。如果你遇到了此类问题,可以选择Launch agent by connecting it to the master选项
用法这里需要勾选,绑定到这个agent的job才运行,不然会干扰其他正常项目的发版 填写节点名称,IP地址等信息,添加的时候要注意的就是这些,远程目录就好有个固定的目录
我们在一台Linux服务器中,下载agent.jar和启动连接。
curl -sO https://jenkins.example.com/jnlpJars/agent.jar
java -jar agent.jar -url https://jenkins.example.com/ -secret 5ef9a45fe36f0fc1d9ac7abf425488655dd21726ca7532f9ffc8da74 -name "eks-node" -workDir "/data/jenkins_agent/"
链接成功的日志:
INFO: Agent discovery successful
Agent address: 10.6.3.4
Agent port: 30217
Identity: 31:83:ed:be:9b:66:75:c5:d7:e3:03:de:52:35:b8:db
Jun 05, 2024 9:58:11 AM hudson.remoting.Launcher$CuiListener status
INFO: Handshaking
Jun 05, 2024 9:58:11 AM hudson.remoting.Launcher$CuiListener status
INFO: Connecting to 10.6.3.4:30217
Jun 05, 2024 9:58:11 AM hudson.remoting.Launcher$CuiListener status
INFO: Server reports protocol JNLP4-connect-proxy not supported, skipping
Jun 05, 2024 9:58:11 AM hudson.remoting.Launcher$CuiListener status
INFO: Trying protocol: JNLP4-connect
Jun 05, 2024 9:58:11 AM org.jenkinsci.remoting.protocol.impl.BIONetworkLayer$Reader run
INFO: Waiting for ProtocolStack to start.
Jun 05, 2024 9:58:11 AM hudson.remoting.Launcher$CuiListener status
INFO: Remote identity confirmed: 31:83:ed:be:9b:66:75:c5:d7:e3:03:de:52:35:b8:db
Jun 05, 2024 9:58:11 AM hudson.remoting.Launcher$CuiListener status
INFO: Connected
最好可以使用supervisor进行管理,机器因为一些原因重启了还是可以自动拉起来,直接添加命令有时候会出现问题,可以写一个脚本,把jenkis_agent的启动命令放进去,然后supvisor的配置文件再去调用他,也是可以的。 参考配置如下:
[program:jenkins_agent] ;程序名称,终端控制时需要的标识
command=bash jenkins_agent_start.sh ; 运行程序的命令
directory= /root/ ; 命令执行的目录
autorestart=true ; 程序意外退出是否自动重启
stderr_logfile=/var/log/jenkins_agent.err.log ; 错误日志文件
stdout_logfile=/var/log/jenkins_agent.out.log ; 输出日志文件
environment=ASPNETCORE_ENVIRONMENT=Production ; 进程环境变量
user=root ; 进程执行的用户身份
stopsignal=INT
碰到的生产问题
我的Jenkins是用K8S部署的,我已经通过域名映射访问到我的Jenkins了,但是50000的agent端口我映射到K8S的service上了,却不能跟Jenkins一起进行绑定。这样在我需要绑定外部jenkins-agent节点的时候就会遇到麻烦。
解决方法:
通过 -tunnel 参数可以自定义我们jenkins-agent服务端口的位置:
如下面所示:
java -jar agent.jar -url https://jenkins.example.com/ -secret 5ef9a45fe36f0fc1d9ac7abf425488655dd21726ca7532f9ffc8da -name "eks-node" -workDir "/data/jenkins_agent/" -tunnel 10.6.3.4:30217
评论区