如何动态的创建Jenkins的Agent节点?需求是想要实现弹性构建,当Jenkins作业启动时按需创建一个构建节点来执行作业。于是研究了下Jenkins的API,分享一下。(点击下面视频可以简单预览效果)
待解决问题:以下的代码可以在Pipeline或者ScriptConsole中运行,但是如果Pipeline中存在构建Stage会和agent语句冲突,造成序列化问题。建议在ScriptConsole中运行。
本次实践未使用Jenkins的Kubernetes插件, 而是通过Groovy代码来原生实践一番。调试起来也不是很顺利,不过最后算是实现了。
导包
代码语言:javascript复制import hudson.model.Node.Mode
import hudson.slaves.*
import jenkins.model.Jenkins
添加节点
代码语言:javascript复制String agentName = "zeyang"
String executorNum = "1"
String agentLabel = "JenkinsPod"
agent_node = new DumbSlave(agentName, "Jenkins pod", "/opt/jenkins", executorNum,
Mode.EXCLUSIVE,
agentLabel,
new JNLPLauncher(),
RetentionStrategy.INSTANCE)
Jenkins.instance.addNode(agent_node)
- agentName: 节点名称
- executorNum: 执行器数量(注意是字符串类型)
- agentLabel: 节点的标签
- description: 描述信息
- JNLPLauncher(): JNLP类型
- Mode.EXCLUSIVE: 仅允许调度允许作业
- RetentionStrategy.INSTANCE:可用状态总是在线
获取节点信息
通过jnlp节点会有些信息需要获取,这些信息也可以通过编写脚本拿到,就不用再进入页面中获取了。
代码语言:javascript复制node = Jenkins.instance.getNode(agentName)
computer = node.computer
jenkinsUrl = Jenkins.instance.rootUrl.trim().replaceAll('/$', '')
return """{
"jenkinsUrl" : "${jenkinsUrl}",
"jenkinsHome": "${node.remoteFS.trim()}",
"computerUrl": "${computer.url.trim().replaceAll('/$', '') as String}",
"computerSecret": "${computer.jnlpMac.trim()}"
}"""
以上代码通过agentName
来获取节点的配置信息并生成一个JSON字符串便于后续处理。
ok,到此为止已经实现了弹性构建的第一步了, 后面可以根据获取到的agent信息,替换pod模板,然后在K8s集群中创建。