将作业(由管道触发)的参数/结果返回到同一管道

时间:2016-09-16 20:26:05

标签: jenkins jenkins-pipeline

Jenkins管道:我有一个管道p1,可以触发作业j1,然后是作业j2。我想要一些由j1设置并传递到管道j2中的p1的参数。如何使用Jenkins管道插件实现此功能?提前致谢

7 个答案:

答案 0 :(得分:14)

可以使用" env"来完成。如果您设法j1将其信息添加到构建env中。

如果j1是管道,您可以env.MYKEY=MYVALUE。 对于自由式作业,它应该使用EnvInject plugin(没有尝试)。 在p1中,如果您没有构建结果,那么您将获得包含该信息的地图。

所以,如果你在p1中做了某些事情:

// somewhere in your pipeline, i.e. p1:
def j1BuildResult = build job: 'J1'
def j1EnvVariables = j1BuildResult.getBuildVariables();

然后j1EnvVariables将是一个包含您在j1中设置的变量的地图。

PS:如何将该信息传递给参数p2,例如涵盖here

答案 1 :(得分:8)

我有类似的问题。我必须通过让作业J1,J2创建属性文件然后使用"复制工件"来获取这些文件。在主要管道P1。然后将属性转换为Java属性(可能需要在Jenkins中进行一些脚本批准)。如果Jenkins Pipeline可以直接在代码中返回参数,那将是很好的(可能还有这样做,但我不知道)。从构建步骤返回的是RunWrapper,它似乎没有办法返回我可以看到的自定义结果(除非我们使用了一些现有属性,如构建描述)。

所以我有这样的事情:

// Pipeline code in P1

// Build J1 and get result. 
def j1BuildResult = build job: 'J1', parameters: [string(name: 'J1_PROP', value: 'FOO')], propagate: true, wait: true

// Get results of J1
step([$class              : 'CopyArtifact', filter: 'j1-result.properties',
      fingerprintArtifacts: true,
      flatten             : true,
      projectName         : 'J1',
      selector            : [$class     : 'SpecificBuildSelector', buildNumber: buildResult.getNumber().toString()]])

// Load J1 properties (you may need to turn off sandbox or approve this in Jenkins)
Properties j1Props = new Properties()
j1Props.load(new StringReader(readFile('j1-result.properties')))

// Build J2
def j2BuildResult = build job: 'J2', parameters: [string(name: 'J2_PROP', value: j1Props.someProperty)], propagate: true, wait: true

// Get results of J2
step([$class              : 'CopyArtifact', filter: 'j2-result.properties',
      fingerprintArtifacts: true,
      flatten             : true,
      projectName         : 'J2',
      selector            : [$class     : 'SpecificBuildSelector', buildNumber: buildResult.getNumber().toString()]])

// Load J2 properties (you may need to turn off sandbox or approve this in Jenkins)
Properties j2Props = new Properties()
j1Props.load(new StringReader(readFile('j2-result.properties')))

答案 2 :(得分:3)

您可以使用

获取构建参数和环境变量
def buildProperties = runWrapper.rawBuild.getEnvironment()

这是一张时髦的地图。可以使用

接收目标参数
String someProperty = buildProperties.someProperty

限制:需要在“进程内脚本批准”中允许method hudson.model.Run getEnvironment并在node闭包内调用此代码(因为rawBuild)。

我也尝试了runWrapper.rawBuild.getAction(ParametersAction.class),但需要很多导入Jenkinsfile。

注意:runWrapper.getBuildVariables()不会为我返回任何内容。

答案 3 :(得分:0)

我的第一个答案并不完全是对您问题的答案,但是我正在尝试做类似的事情,但是我所需要的只是对一个问题的“是/否”答案。

第二个答案可能会对您或其他人有所帮助...

第一个答案:运行一个子作业,其中“失败”代表“否”答案,而“成功”代表“是”答案。

只要确保在作业运行中设置“ propagate:false”即可。这是剪切粘贴:

            def getos = build job: 'internal_is_host_running_linux',
                parameters: [[$class: 'StringParameterValue',
                  name:'HOST',value: HOST]],propagate: false,wait:true
            def linuxTest = getos.getResult()
            if (linuxTest != "SUCCESS") {
                     // NOT success, meaning NOT booted Linux

我敢肯定有100种更好的方法可以做到这一点,但这是可行的。

第二个可行的答案是获取子作业的控制台输出并在其中搜索所需的数据。

这是从子作业中获取控制台输出的方法,至少这对我有用:

            def job = build job: 'internal_run_remote_command',
               wait: true, propagate: false,
               parameters: [[$class: 'StringParameterValue',
                      name: 'HOST', value: HOST],
                 [$class: 'StringParameterValue',
                      name: 'stageos', value: stageos]]
            // put the standard output from the subjob into our output:
            def checklog2 = job.rawBuild.log
            // obviously, if you don't want the output in your console, do not println
            println checklog2

很明显,除了'println checklog2'之外,您还可以搜索所需的东西。这是留给读者的练习;-)

(再次,可能有100种更好的方法可以做到这一点,但这对我有用)

我的环境:仅使用管道。主控主机必须正在运行管道脚本,但是偶尔需要在另一台主机上运行某些内容,但仍要保留在主控主机上,因此到目前为止,子作业似乎是我的最佳选择。

答案 4 :(得分:0)

您可以通过以下方式获取构建管道的结果

def myjob=build job: 'testy', propagate: true, wait: true, parameters: [string(name: 'ENV', value: 'jamshaid'), string(name: 'Repo', value: 'khalid')]
echo "${myjob.getResult()}"

答案 5 :(得分:0)

这可以帮助:

https://javadoc.jenkins.io/plugin/workflow-support/org/jenkinsci/plugins/workflow/support/steps/build/RunWrapper.html

从文档中:

getBuildVariables

public Map<String,String> getBuildVariables()

引发AbortException

获取在构建中定义的环境变量。这不报告参数化的构建的构建参数,仅报告构建环境。如果子作业是管道作业(WorkflowRun),则将捕获并报告脚本执行过程中设置的所有变量。 抛出: AbortException

答案 6 :(得分:0)

在主管道中唯一对我有用(我将触发多个构建并获取它们的变量以从主管道触发其他测试作业)是使用管道的后期步骤,如下所示:

子作业结束(在阶段部分之后):

 post 
 {
    success 
    {
        script 
        {
            env.BUILD_VARIABLE = "FOO"
        }
    } 
 }

在我使用的父作业中:

script 
{ 
    buildResults = build job : "Build_Pipeline", 
                   parameters : [
                        string( name: "BUILD_BRANCH", value: "master" )
                   ], 
                   wait: true

    // Print the env variable set in the child job
    println(buildResults.getBuildVariables()["BUILD_VARIABLE "])
}