多个Jenkinsfiles,一个Agent标签

时间:2018-10-15 18:16:45

标签: jenkins jenkins-pipeline

我有一个项目,该项目具有多个构建管道以允许针对它进行不同类型的构建(不,我无法从中构建一个构建;这是我无法控制的。)

这些管道中的每个管道都由项目存储库中的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工作区读取文件吗?

1 个答案:

答案 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?