jenkins - 多个 Jenkinsfiles,一个代理标签
问题描述
我有一个项目,它有多个构建管道,以允许针对它进行不同类型的构建(不,我没有能力从中构建一个;这超出了我的控制范围)。
这些管道中的每一个都由项目 repo 中的 Jenkinsfile 表示,并且每个管道都必须使用相同的构建代理标签(它们也需要共享其他配置,但当前的问题是构建代理标签)。我正在尝试将标签放入项目存储库中的某种配置文件中,以便所有 Jenkinsfiles 都可以读取它。
我希望这很简单,因为在您已经签出源副本以读取 Jenkinsfile 之前,您不需要此配置数据。据我所知,这是不可能的。
在我看来,在项目完成其 SCM 步骤之前,Jenkinsfile 无法从 SCM 读取文件。但是,为时已晚:agent{label} 的参数在任何阶段运行之前被读取。
这是一个最小的情况:
final def config
pipeline {
agent none
stages {
stage('Configure') {
agent {
label 'master'
}
steps {
checkout scm // we don't need all the submodules here
echo "Reading configuration JSON"
script { config = readJSON file: 'buildjobs/buildjob-config.json' }
echo "Read configuration JSON"
}
}
stage('Build and Deploy') {
agent {
label config.agent_label
}
steps {
echo 'Got into Stage 2'
}
}
}
}
当我运行它时,我得到:
java.lang.NullPointerException: Cannot get property 'agent_label' on null object
我没有从“配置”阶段得到任何回声。
如果我将“构建和部署”阶段的标签更改为“主”,构建成功并打印出所有三个回显语句。
在需要设置代理标签之前,有什么方法可以从 Git 工作区读取文件?
解决方案
请参阅https://stackoverflow.com/a/52807254/7983309。我认为您遇到了这个问题。label 无法将 config.agent_label 解析为其更新后的值。第一行中设置的任何内容都将发送到您的第二阶段。
编辑1:
env.agentName = ''
pipeline {
agent none
stages {
stage('Configure') {
agent {
label 'master'
}
steps {
script {
env.agentName = 'slave'
echo env.agentName
}
}
}
stage('Finish') {
steps {
node (agentName as String) { println env.agentName }
script {
echo agentName
}
}
}
}
}
推荐阅读
- node.js - 无法连接到远程数据库
- sql - 在 Postgres 的多个插入事务中引用插入的 ID
- sql - 有没有更有效的方法来做到这一点?(从 SQL 创建 XML 文件)
- javascript - 如何单击文本本身将文本更改为输入字段
- android - 我的 HTML 网站无法在移动设备中滚动
- python - 列表中的类对象都具有相同的最后添加值
- c# - 无法从 System.Collections.Generic.List 转换
到 System.Collections.Generic.List - markdown - 如何使用 flexmark-java 渲染多行表?
- php - 如何在新窗口中打开链接
- server - 是否可以使用客户端-服务器-架构和微服务架构?