【问题标题】:How to make a Java console output a environment variable in Jenkins?如何让 Java 控制台在 Jenkins 中输出环境变量?
【发布时间】:2016-07-06 11:35:10
【问题描述】:

我是 Jenkins 的新手,尽管我发现了一些类似的问题,但似乎没有一个解决方案能以我需要的方式为我工作。对某些人来说,这可能看起来像是一个基本问题,但对我来说,这是一个我正在努力解决的大问题。

基本上,我构建了一个执行 Java Selenium 代码的项目,该代码在 Jenkins 的控制台输出中显示会话 ID,这就是我需要添加到环境变量中以在完成此项目后触发的项目中使用的内容。

我尝试了一些 Groovy 脚本,但我认为我不太了解如何使用它,所以无论我得到什么,都不是我希望得到的。

有没有人做过类似的事情来提供一些关于如何实现这一目标的提示?

非常感谢

【问题讨论】:

  • 会话 ID 的打印是否在您的控制之下,还是您必须为它跟踪控制台输出?
  • 您能否更改 selenium 代码以将您需要的值写入属性文件?或者写一个脚本来解析构建日志并为你提取它?
  • @I-LOVE-2-REVIVE 您的第一句话正是我在评论第一部分时所想的。关于你的第二句话,有一个插件可以做到这一点。
  • @I-LOVE-2-REVIVE 不幸的是我提到的插件没有做它应该做的事情(见my answer)。因此,您的 parse script 建议似乎是第二种情况 atm 的唯一解决方案。

标签: jenkins output environment-variables


【解决方案1】:

根据打印是否在您的控制之下,有两种选择(理论上,其中一种不起作用,请参见下面的 2.)。

  1. 打印由您控制:

    • 将会话 ID 写入属性文件,例如from-build-log.properties:

      sessionId=...
      
    • 添加构建后操作Trigger parameterized build on other projects

      这个插件触发其他项目的构建,参数是预定义的,或者由完成的构建提供。

      每个参数都将传递给目标项目,即使目标没有参数化,或者没有定义该名称的属性。

      • 添加参数属性文件中的参数
        • 使用文件中的属性from-build-log.properties
  2. 打印在您的控制之下:

    • 添加构建后操作Post build task → :

      此功能允许您关联 shell 或批处理脚本,这些脚本根据构建日志输出在 Hudson 上执行某些任务。如果日志文本与构建日志文件中的某处匹配,则脚本将执行。 [...]

      允许使用 Java 正则表达式,并且可以将组用作脚本参数。如果文本是“Last Build : #(\d+)”并且脚本是“script.sh”,那么如果日志中包含一行“Last Build : #4”,则会调用脚本“script.sh 4” .

      • 任务脚本 → :

        [...] 引用 %1, .. %n 是允许的,将被正则表达式匹配的组替换。 %0 是整场比赛。


      不幸的是,这不起作用,因为自 2013 年以来存在一个已知问题:[JENKINS-17268] Post build task plugin: Passing arguments does not work as documented

      • 构建执行 Windows 批处理命令命令

        @echo( & echo   CMD: sessionId=123456789
        
      • 构建后任务任务

        • 日志文本sessionId=(\d+)
        • 脚本

          @echo( & echo   sessionId='%1'(!) of '%0'
          

      控制台输出:

      ...
      [Freestyle-project] $ cmd /c call C:\Windows\TEMP\hudson4684581005071706054.bat
      
        CMD: sessionId=123456789
      
      C:\Program Files (x86)\Jenkins\workspace\Freestyle-project>exit 0 
      Performing Post build task...
      Match found for :sessionId=(\d+) : True
      Logical operation result is TRUE
      Running script  : @echo( & echo   sessionId='%1'(!) of '%0'
      
      [Freestyle-project] $ cmd /c call C:\Windows\TEMP\hudson1525182929053902824.bat
      
        sessionId=''(!) of 'C:\Windows\TEMP\hudson1525182929053902824.bat'
      
      C:\Program Files (x86)\Jenkins\workspace\Freestyle-project>exit 0 
      POST BUILD TASK : SUCCESS
      END OF POST BUILD TASK : 0
      Finished: SUCCESS
      

      %0 不是“整个匹配”,而是脚本的名称,与 Windows 命令行一样。 %1 为空。


      解决方法是:

    • 添加构建步骤执行shell命令

      sed -En 's/.*(sessionId=[0-9]+)/\1/p' \
        ../../jobs/${JOB_NAME}/builds/${BUILD_NUMBER}/log > from-build-log.properties
      
    • 添加构建后操作触发其他项目的参数化构建

      • 添加参数属性文件中的参数
        • 使用文件中的属性from-build-log.properties

【讨论】:

    猜你喜欢
    • 2019-09-10
    • 2017-03-06
    • 2023-02-04
    • 2015-10-31
    • 2013-02-28
    • 1970-01-01
    • 2023-04-02
    • 2014-07-26
    • 2018-11-24
    相关资源
    最近更新 更多