我有一个项目,该项目具有多个构建管道以允许针对它进行不同类型的构建(不,我无法从中构建一个构建;这是我无法控制的。)
这些管道中的每个管道都由项目存储库中的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
在“配置”阶段没有收到任何回声。
如果我将“ Build and Deploy”阶段的标签更改为“ master”,则构建成功并打印出所有三个echo语句。
在需要设置代理标签之前,有什么方法可以从Git工作区读取文件吗?
答案 0 :(得分:0)
请参阅https://stackoverflow.com/a/52807254/7983309。我认为您遇到了这个问题。 label无法将config.agent_label解析为其更新值。第一行中设置的任何内容都将发送到第二阶段。
EDIT1:
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
}
}
}
}
}
来源-In a declarative jenkins pipeline - can I set the agent label dynamically?