Jenkins + Build Flow,如何将变量从一个任务传递到另一个任务?

5

我有一个类似于文档示例的构建流程场景:两个工作,一个在另一个之后运行。

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

我的job1是一个shell脚本,它从已检出的git存储库构建一个包,并打印出构建包的版本。我需要从job1中提取版本(解析输出??),并将其作为参数传递给job2。如何实现这一点?请注意,运行job1之前我无法知道版本。
4个回答

9
在shell脚本构建步骤中仅使用export的问题在于,当shell脚本退出时,导出的变量会消失,它们不会向上传播到作业。
使用EnvInject插件在构建中创建环境变量。如果您在构建过程中编写了一个属性文件,EnvInject可以读取该文件并将其注入为构建步骤的变量。属性文件具有简单的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 )

这对你有效吗?我正在创建一个名为vars.txt的属性文件(包含MY_BUILD_VERSION=something),并将“注入变量”作为job1的下一构建步骤之一。但是由于某种原因,在触发job1后,版本在buildflow中变为null(使用您的示例作为代码)。 - Unknown
没事了,我解决了。我之前写的是 b = build('job-1') 然后尝试使用 build.environment.get();实际上应该使用 b.environment.get() 才能正常工作。谢谢! - Unknown

0

对于其他遇到此问题的人,另一个解决方案是使用Scriptler脚本,您可以传入.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
}

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


0

当你运行job1时,将版本名称作为系统属性导出。

export appVersion="stringOfVersion-123"

那就取决于你是否知道版本号的长度(数字或其他字符的数量)。如果你知道,你可以在第二个构建中从末尾解析变量作为新变量并使用它。

如何解析字符串,你可以在这个带有很好例子的问题中找到。


你有这个实际运作的例子吗?因为在我的测试中,它似乎并没有工作;环境不能从一个任务保留到另一个任务。 - Unknown
事实上,我们只是偶尔使用Jenkins。但如果您运行某些Bash脚本作为build1,则可以将变量导出为系统变量,并在第二个构建中使用此变量。或者,您可以将更多信息(来自Jenkins的屏幕截图、代码等)粘贴到问题中吗? - zorbon.cz
如果您使用grep,则会得到“version=1.3.4”(例如,如果您执行export version="1.2.3"),但是当您在命令中使用$version(用于打印请使用echo $version)时,您只会得到数字。尝试使用$语句。 - zorbon.cz
grep 的目的是显示 job2 环境中 "VERSION" 的存在并证明它不存在。不幸的是,你所说的并没有起作用。 - Unknown

0
如果job2总是需要从job1获取一些信息,您可以使用不带参数的方法。job1可以发布带有版本的构件,而job2将使用该构件(例如使用Copy Artifact Plugin)。采用这种方法,job2也可以作为独立的作业执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接