将生成的值传递给下游作业

时间:2018-08-13 13:04:32

标签: powershell jenkins jenkins-pipeline

我正在努力寻找一种基于管道运行期间生成的值为下游自由式项目填充参数的方法。

一个简化的示例可能最能说明问题:

//other stuff...
stage('Environment Creation') {

  steps {
    dir(path: "${MY_DIR}") { 
       powershell '''
          $generatedProps = New-Instance @instancePropsSplat

          $generatedProps | Export-Clixml -Depth 99 -Path .\\props.xml

       '''
       stash includes: 'props.xml', name: 'props'
    }
  }
}
//...later
stage('Cleanup') {
   unstash props
   // either pass props.xml 
   build job: 'EnvironmentCleanup', wait: false, parameters: [file: ???]
   // or i could read the xml and then pass as a string
   powershell '''
      $props = Import-Clixml -Path props.xml
      # how to get this out of this powershell script???
   '''
}

我会在一个阶段中创建一些资源,然后在下一个阶段中,我想使用这些资源作为参数来开始一项工作。我可以根据需要修改下游作业,但我一直在努力寻找方法。

我尝试过的事情:

  • 文件参数(只是隐藏和传递)

潜在路径:

  • EnvInject:使用起来可能并不安全,并且显然不适用于管道吗?
  • 定义一个here之类的“全局”变量,但我不确定powershell如何改变这种情况

那么,实现此目标的最佳方法是什么?我有一个在管道的一个阶段中生成的值,然后需要将该值(或包含该值的文件)作为参数传递给下游作业。

1 个答案:

答案 0 :(得分:0)

所以这是我发现对我有用的方法。

在取决于上一阶段创建的文件的阶段,我将执行以下操作:

stage ("Environment Cleanup') {
  unstash props
  archiveArtifacts "props.xml"

  build job: 'EnvironmentCleanup', parameters: [string(name: "PROJECT", value: "${JOB_NAME}")], wait: false
}

然后在我的依赖作业(自由式)中,我从触发的版本中复制“ props.xml”文件,并使用传入的作业名称作为参数,然后执行我的powershell将xml反序列化为一个对象,然后阅读我需要的属性。

我缺少的最后一个也是最令人困惑的部分是在options中,这是我需要向下游作业授予复制权限的触发管道项目:

options {
  copyArtifactPermission('EnvironmentCleanup') // or just '*' if you want
}

现在,它就像一个咒语一样工作,我将能够在遵循相同工作流程的所有管道中使用它。