我有一个类似于documentation example的构建流程场景:两个作业,一个在另一个作业之后。
b = build("job1")
build("job2", param1: b.????)
我的job1
是一个shell脚本,它从已检出的git repositoy构建一个包,并打印出构建包的版本。
我需要从job1
中提取版本(解析输出??)并使其以某种方式作为job2
的参数提供。怎么能实现这一目标?请注意,在运行job1
之前我无法知道该版本。
答案 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
}
这会将任何句号转换为下划线,并将所有字母大写。使用脚本程序脚本可确保您拥有一个独立于您正在使用的“插件汤”的方法。