我有一个声明性的Jenkins管道,如下所示:创建一个AMI。在第二阶段,我将配置实例,然后最终创建AMI并终止实例。为此,我需要在第一阶段中创建的EC2实例的instance-id。

我能想到的最明显的方法是将值写入脚本中代理的文件中吗?第一阶段,然后在第二阶段阅读它,但这似乎不是一个很好的解决方案。

评论

由于我们使用脚本化而非声明性管道,因此并不是一个完整的答案,但是写入文件正是我最终在脚本中所做的。
这个问题已经在这里被回答stackoverflow.com/questions/47155326/…

@RamKamath该问题的答案有些不同。我正在尝试从python脚本获取输出并将其传递到阶段。虽然我认为答案的一部分是创建一个全局环境变量,然后在第一阶段进行设置,然后在第二阶段进行读取,但是它并没有提供一种优雅的方法来在阶段级别从python脚本传递。

#1 楼

对于声明性管道:

这个问题已经在StackOverflow上得到了高度评​​价:生成您需要的值):

pipeline {
  agent { label 'docker' }
  stages {
    stage('one') {
      steps {
        sh 'echo hotness > myfile.txt'
        script {
          // trim removes leading and trailing whitespace from the string
          myVar = readFile('myfile.txt').trim()
        }
        echo "${myVar}" // prints 'hotness'
      }
    }
    stage('two') {
      steps {
        echo "${myVar}" // prints 'hotness'
      }
    }
    // this stage is skipped due to the when expression, so nothing is printed
    stage('three') {
      when {
        expression { myVar != 'hotness' }
      }
      steps {
        echo "three: ${myVar}"
      }
    }
  }
}



第二种解决方案是直接或通过writeFile从脚本中写出输出,然后再读回在readFile中。但是,这带来了一个重要的警告,即读取和写入都必须在同一节点上进行,因此您不能使用它在节点之间发送数据。使用archiveArtifact并使用copyArtifact检索它们(然后使用readFile读取文件)。最后,对于StackOverflow上一个几乎相同的问题,有一些答案可以提供替代解决方案。 br />
但是,如果可以的话,我建议改用脚本化管道,这样可以提供更简单的解决方案:
有关ServerFault上的脚本化管道的问题。)


注释中似乎已经提出了一些解决方案,但是您担心它们不够优雅。我不太确定您要寻找哪种优雅,因为我想不出任何方法来简化Jenkins-Pipeline-land的这些答案。