Jenkins + Build Flow,如何将变量从一个作业传递到另一个作业

时间:2014-10-22 13:21:27

标签: linux jenkins jenkins-plugins

我有一个类似于documentation example的构建流程场景:两个作业,一个在另一个作业之后。

b = build("job1")
build("job2", param1: b.????)

我的job1是一个shell脚本,它从已检出的git repositoy构建一个包,并打印出构建包的版本。

我需要从job1中提取版本(解析输出??)并使其以某种方式作为job2的参数提供。怎么能实现这一目标?请注意,在运行job1之前我无法知道该版本。

4 个答案:

答案 0 :(得分:9)

在shell脚本构建步骤中简单地使用export的问题是,当shell脚本退出时,导出的变量会消失,它们不会传播到作业。

使用EnvInject plugin在构建中创建环境变量。如果你 写出属性文件作为构建的一部分,EnvInject可以读取文件和inject variables as a build step。属性文件具有简单的KEY=VALUE格式:

MY_BUILD_VERSION=some_parsed_value

在作业中设置环境变量后,在Build Flow中 插件,您可以提取变量的值并在后续作业中使用它:

def version = build.environment.get( "MY_BUILD_VERSION" )
out.println String.format("Parameters: version: %s", version)
build( "My Second Build", MY_BUILD_VERSION: version )

答案 1 :(得分:0)

当您运行job1导出名称为系统属性的版本时。

export appVersion="stringOfVersion-123"

然后它取决于您是否知道版本的长度(数字或其他字符的数量)。如果您知道它,您可以将第二个构建中的变量解析为新变量并使用它。

您可以在this question with nice examples中找到解析字符串。

答案 2 :(得分:0)

如果job2总是应该从job1获取一些信息,你可以使用没有参数的方法。 job1可以使用版本发布工件,job2将使用该工件(例如,使用Copy Artifact Plugin)。通过这种方法,job2也可以作为独立的工作执行。

答案 3 :(得分:0)

对于其他任何人来说,另一个解决方案是使用脚本编写器脚本,在其中传入.properties文件路径,脚本将属性添加到作业变量列表中:

Properties properties = new Properties()

FilePath workspace = build.getWorkspace()
FilePath sourceFile = workspace.child(path)

properties.load(sourceFile.read())

properties.each { key, value ->
  key = key.replace(".", "_").toUpperCase()
  Job.setVariable(build, key, value)

  println "Created Variable: " + key + "=" + value
}

这会将任何句号转换为下划线,并将所有字母大写。使用脚本程序脚本可确保您拥有一个独立于您正在使用的“插件汤”的方法。