【问题标题】:Jenkins + Build Flow, how to pass a variable from one job to anotherJenkins + Build Flow,如何将变量从一个工作传递到另一个工作
【发布时间】:2014-10-22 13:21:26
【问题描述】:

我有一个类似于documentation example 的构建流程场景:两个作业,一个接一个运行。

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

我的job1 是一个 shell 脚本,它从签出的 git 存储库构建一个包并打印出构建包的版本。

我需要从job1(解析输出??)中提取版本,并以某种方式将其作为job2 的参数提供。如何做到这一点?请注意,在运行job1之前我无法知道版本。

【问题讨论】:

    标签: linux jenkins jenkins-plugins


    【解决方案1】:

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

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

    MY_BUILD_VERSION=some_parsed_value
    

    在工作中设置环境变量后,在构建流程中 插件,您可以提取变量的值并在后续作业中使用它:

    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
    • 没关系,我想通了。我在做b = build('job-1') 并尝试build.environment.get()b.environment.get() 工作正常。谢谢!
    【解决方案2】:

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

    export appVersion="stringOfVersion-123"
    

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

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

    【讨论】:

    • 你有这个实际工作的例子吗?因为在我的测试中似乎没有;从一份工作到另一份工作,环境并没有得到保护。
    • 其实不是,我们只是偶尔使用Jenkins。但是,如果您将一些 Bash 脚本作为 build1 运行,那么您可以将变量导出为系统变量,并且在第二次构建中您可以使用此变量。或者您可以粘贴更多相关信息(来自 Jenkins 的屏幕截图、代码……)来提问吗?
    • 如果你使用grep,那么你会得到“version=1.3.4”(例如如果你使用export version="1.2.3"),但是当你在命令中使用$version时(用于打印使用@ 987654327@) 那么你只得到数字。试试$ 声明。
    • grep 的目的是在job2 的环境中显示“VERSION”的存在并证明它不存在。不幸的是,您所说的不起作用。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      对于遇到此问题的其他人,另一种解决方案是使用 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
      }
      

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

      【讨论】:

        猜你喜欢
        • 2015-11-29
        • 1970-01-01
        • 1970-01-01
        • 2023-02-01
        • 1970-01-01
        • 2018-06-27
        • 1970-01-01
        • 2023-01-11
        • 1970-01-01
        相关资源
        最近更新 更多