【问题标题】:Passing data between build steps in Jenkins在 Jenkins 的构建步骤之间传递数据
【发布时间】:2019-06-06 23:18:13
【问题描述】:

我想做一些类似的事情:

这太简单了,只是演示了我想做的事情。基本上,我希望能够在多个构建步骤之间的单个作业范围内存储和访问变量。此外,我可以通过将数据存储到文件中并稍后读取它来解决问题,但我想要一些更简单且不那么“hacky”的东西

构建步骤 #1 - 执行 shell

$START=timestamp

构建步骤 #2 - 运行另一个作业

构建步骤 #3 - 执行 Shell

$END=timestamp
TIME_LAPSED=$END-$START
(post lapsed time somewhere)

【问题讨论】:

    标签: bash jenkins continuous-integration


    【解决方案1】:

    shell 之间还剩下一件事:工作区。
    简单而愚蠢的解决方案:使用文件!

    巨大的额外优势:当您将工作拆分为多个工作并使用 Clone Workspace 插件时,它会起作用

    构建步骤 #1 - 执行 shell

    START=timestamp
    ...
    echo $START > env_start.txt
    

    ...

    构建步骤 #3 - 执行 Shell

    START=`cat env_start.txt`
    END=timestamp
    TIME_LAPSED=$END-$START
    

    【讨论】:

    • 如果您在条件中使用 env 变量,即检查是否已定义或为空,您可能需要使用 echo 选项 -n 来防止文件被空行填充:echo -n $START > env_start.txt then在第 3 步中if [ -s env_start.txt ]; then echo "Unset" ; fi
    【解决方案2】:

    如果您使用声明性管道语法在environment 部分定义变量并使用script 步骤设置其值可能会很有用。

    我正在使用声明性管道做类似的事情,它适用于传递变量(在一个阶段内和阶段之间):

    pipeline {
            agent any
            environment {
                variable = ''
            }
            stages {
                stage('Some stage') { 
                    steps {
                        script {
                            if (some condition){
                                variable = 'some value'
                            } else { variable = 'else value' }
                        }                
                        sh '${somepath}/bin/script ' + 
                            "-parameter=${variable}"
                        }
                    }
                }
                stage('Dummy print') {
                    steps {
                        sh "echo ${variable}"
                    }
                }
    [...]
    

    【讨论】:

    • 您也可以在阶段步骤中使用 env.myvar=„new-value“ 设置或更新环境变量
    • 这仅适用于字符串。当然,您几乎可以将任何内容表示为字符串,但这并不方便。
    【解决方案3】:

    我们广泛使用注入环境变量插件,效果很好。 解决办法是:

    1. 设置变量 myenv=value1
    2. 打印到工作区中的文件:echo "myenv=$myenv" > tmp.myenv
    3. 每次更改后注入:使用 envinject 从文件 tmp.myenv 读取环境 -> myenv 现在称为作业环境的一部分。

    【讨论】:

    • 工作就像一个魅力。谢谢!
    【解决方案4】:

    @Gurubaran 的解决方案对我有用,你需要在 jenkins 中安装“Environment Injector”插件,然后

    第一步: 使用 shell/powershell/windows 批处理/等。创建生成一个属性(键=值)文件。例如:文件路径是 $WORKSPACE/env.properties。

    第二步: 添加“注入环境变量”组件并将“属性文件路径”设置为 $WORKSPACE/env.properties

    第二步之后: 您可以在以下步骤中使用这些环境变量。

    例子:

    【讨论】:

      【解决方案5】:

      没有:

      • 参数化构建的字符串参数
      • 预构建将环境变量注入构建过程
      • 构建步骤注入环境变量

      有效(从 v1.656 开始)。当然,您可以读取它们中的每一个,但是分配给它们的新值在后续构建步骤中不可用。

      因此,JediMasterCoder 的回答和通过像 Destroyica 这样的文件进行处理是迄今为止唯一的选择。

      【讨论】:

        【解决方案6】:

        使用 Jenkins 变量的一种方法是在构建步骤中使用 jenkins-cli.jar,这需要一些工作,但这会在参数列表中添加 FOO=1,因为它在构建步骤中运行,它知道要设置哪个构建的参数。

        java -jar ${JENKINS_HOME}/war/WEB-INF/jenkins-cli.jar -s ${JENKINS_URL} set-build-parameter FOO 1
        

        【讨论】:

        • 不错的解决方案!如果用户具有 overall-readjob-readrun-update 权限,它就可以工作。
        • set-build-parameter 不再起作用...看起来已弃用
        【解决方案7】:

        Jenkins 允许您将环境变量注入构建过程。也许您所要做的就是将开始时间和结束时间作为环境变量注入,并在您的构建步骤中访问它们。

        【讨论】:

        • 这是否让我能够在众多构建步骤中进行注入?即我可以在数据可用时动态设置这些。请记住,我仅以开始/停止时间为例。除了这些,我还有很多想做的事情。
        • @jcol :我不认为在“构建环境”阶段设置环境变量后可以注入它们。但是当数据可用时,您将能够操纵它们。
        • 这是内置功能吗?还是需要插件?编辑:需要这个插件:wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin
        • 我也有同样的想法——甚至更多,我试过了。它不起作用。见my answer
        • 2021 年 4 月 - plugins.jenkins.io/envinject - 此插件的当前版本包含一个漏洞:EnvInject 1.90 及更早版本存储的敏感构建变量的暴露
        【解决方案8】:

        除了@Gurubaran 的建议(如果没有其他选择,我会这样做),我只是选择将构建步骤合并到一个步骤中,这将大大简化这一需求。
        您需要注意错误处理逻辑和退出条件,但您的环境将是可靠的!

        我希望这会有所帮助。

        【讨论】:

        • 呃,这并不能解决我的问题。我的 shell 构建步骤之间有外部工作。在上面给出的示例中,我想计算构建不同点的动态因素。拥有大量工作让我可以独立运行各个步骤,并出于不同的原因对它们进行单独的版本控制。
        猜你喜欢
        • 2011-08-26
        • 1970-01-01
        • 1970-01-01
        • 2014-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-11
        • 1970-01-01
        相关资源
        最近更新 更多