【问题标题】:passing env. variables to downstream job after job failed传递环境。作业失败后下游作业的变量
【发布时间】:2019-09-13 08:44:13
【问题描述】:

我有一个 jenkins 上游作业,失败时会触发下游作业,但我需要传递相同的环境。下游作业中上游作业的变量。

我正在使用 powershell 来设置环境。 $env:tag=$(git describe) 之类的变量,即生成我的 git 标签。我怎样才能发送这个环境。下游作业中的变量,而不使用下游作业中的 git url。

只有在上游作业失败时才会触发下游作业。

我通过存储环境使用了触发参数化构建插件。 txt 文件 (echo "$env:tag=$(git describe)" > env.txt) 中的变量,但这也不起作用。

我尝试了一些其他插件,但没有任何效果。

用例:JobA 想要传递它的环境。将 powershell ($ENV:tag) 中的变量设置为 JobB。因此,在 JobA 的配置中,预定义的参数文本字段用于解析名称,但不能按预期工作。而是传递整个字符串“$ENV:tag”而不是“env-value”。这是我的配置方式:

– 工作A--------

预定义参数:gittag=$ENV:tag =>将参数传递给JobB

– JobB--------

echo gittag =>输出:echo $ENV:tag => $ENV:tag

【问题讨论】:

    标签: jenkins environment-variables


    【解决方案1】:

    您可以使用参数化触发器插件。 以下是更多详细信息的链接:https://wiki.jenkins.io/display/JENKINS/Parameterized+Trigger+Plugin

    【讨论】:

    • 已经尝试过这个插件,正如我在问题中提到的,但它不起作用。我想使用环境。我的 jenkins powershell 在下游作业中描述的变量。
    • 您还需要在下游作业中创建一个同名的变量。
    • 已在答案中附上截图。
    • 我已经尝试过了,它适用于 KEY=VALUE 对,但我想使用 env。我在下游工作中的上游工作中使用的变量,我无法做到这一点。
    【解决方案2】:

    这似乎是带有此插件的known issue。

    如果下游作业仅在上游作业失败时触发,则不要将下游作业设为参数化作业。相反,将上游作业所需的变量写入下游作业工作区中的属性文件。

    echo Var1=value>../Downstream_Job_Folder/downstream.properties
    echo Var2=value>>../Downstream_Job_Folder/downstream.properties
    

    在下游作业中,使用EnvInject Plugin 作为您的第一个构建步骤,或编写脚本以从文件中读取变量。

    【讨论】:

    • 我可以通过按照您的说明运行上游作业来在下游作业中创建 env.properties,但由于某种原因它没有读取 env。变量。我在 Windows 批处理命令中尝试了“echo %var%”,在 powershell 中尝试了“echo $env:var”,但没有输出。 OUTPUT [EnvInject] - 加载节点环境变量。 [EnvInject] - 从构建步骤注入环境变量。 [EnvInject] - 将属性文件路径“env.properties”作为环境变量注入 [EnvInject] - 变量注入成功。 workspace\rollback>echo ECHO 开启。
    • 我确定您这样做了,但只是为了验证,当您在编辑器中打开 env.properties 文件时,您会看到预期的 var 及其值(var_name=var 值)。在下游作业中,作业日志指出成功注入的变量,但在您的下一个构建步骤中,变量的回显给您一个空值,而不是传递下来的值。对吗?
    • 是的,你是对的,但为什么它不采用变量?
    • 我不知道。它适用于我的 Jenkins 实例。我遇到的唯一问题是,如果我试图让读入的值就好像它是一个 var 一样。示例:我没有传递 Var_1=%var_value%(读取实际值),而是传递 Var_1=$Another_Var。在这种情况下, $ 在导入时会被转义,并在其他步骤中被读取为文字字符。希望我能提供更多帮助。
    【解决方案3】:

    通过环境。 JENKINS 从上游到下游工作的变量

    。将上游作业所需的变量写入属性(在我们的情况下 env.properties 文件)文件在下游作业的工作区中。

    echo Var1=value>../Downstream_Job_Folder/downstream.properties
    echo Var2=value>>../Downstream_Job_Folder/downstream.properties
    
    ---------- IN MY CASE -------------
    $PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
    $commit_id=$(git rev-parse --short HEAD)
    $tag=$(git describe)
    echo var1=$commit_id > "C:\Program Files 
                            (x86)\Jenkins\workspace\powershell_2\env.properties"
    echo var2=$tag >> "C:\Program Files 
                       (x86)\Jenkins\workspace\powershell_2\env.properties" 
    echo $commit_id
    echo $tag       # TO CROSS-CHECK
    

    。在下游作业中,使用 EnvInject 插件作为您的第一个构建步骤,并且

    - give Properties File Path - env.properties
    

    。然后选择第二个构建步骤为 windows powershell ,为 windows powershell 选择 读取 env.properties 文件,使用以下命令

    - $AppProps = convertfrom-stringdata (get-content env.properties -raw)
    
      $AppProps.'var1'   # will print the var1 value
    
      $AppProps.'var2'   # will print the var2 value
    
      $env:commit_id=$AppProps.'var1'
    
      $env:tag=$AppProps.'var2'
    
      echo git:$env:tag      
      echo git:$env:commit_id   # this will print the desired output 
    

    ---------在linux的情况下--------

    。在上游工作

    - echo "name=@@" > /home/jenkins/jenkins/workspace/sh_tst_2/env.properties
    - echo "age=22"  >> /home/jenkins/jenkins/workspace/sh_tst_2/env.properties
    

    。在下游作业中,使用 EnvInject 插件作为您的第一个构建步骤,并且

    - give Properties File Path - env.properties
    

    。然后选择第二个构建步骤为LINUX SHELL

    • 回声 $name
    • echo $age # 将提供环境的输出。上游工作的 VAR

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 2021-01-21
      • 2011-12-28
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多