Jenkins Pipeline:在bash脚本中导出和读取环境变量

Mus*_*ice 7 groovy jenkins jenkins-pipeline

我有一个构建管道,需要从一些bash脚本中提取一个值,并在其他地方使用该值.我试图将我的bash脚本的结果存储在这样的环境变量中:

#!/usr/bin/env groovy

pipeline {
    agent none

    stages {
        stage('Break Jenkins') {
            agent any
            steps {    
                sh """
                  ENV_VAR=\$(awk -F'-' '{print \$2 }' <<< \$(ls installer-*-ia32-win.zip))
                  echo $ENV_VAR
                """
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当解释器遇到这echo $ENV_VAR条线时,Jenkins抛出一个异常:

groovy.lang.MissingPropertyException:没有这样的属性:ENV_VAR for class:groovy.lang.Binding

我试图ENV_VAR通过转义美元符号前缀来告诉Jenkins解释器不是Jenkinsfile环境变量,如下所示:

echo \$ENV_VAR
Run Code Online (Sandbox Code Playgroud)

并且喜欢这个

echo '$ENV_VAR'
Run Code Online (Sandbox Code Playgroud)

都没有按预期工作.我认为这是一个问题,我在一个字符串块(sh """ ... """)的语法内,并告诉詹金斯不要试图ENV_VARenvs集合中获取值.

无论如何,我没有太多的运气谷歌搜索解决这个问题,因为詹金斯的管道有自己的环境变量的概念,似乎是与bash环境变量分开.

看起来我只能在一个environment块中设置一个Jenkinsfile环境变量,这没有用,因为我已经在一个sh块里面了.

简而言之,有没有办法在块中设置和访问环境变量的值sh

Szy*_*iak 7

sh命令中使用的双引号会在您的情况下产生问题 - GString尝试解释$ENV_VAR但在当前范围中没有定义此类变量.这个问题的简单解决方案 - 改为使用单引号.

另外值得#!/bin/bash在脚本的开头添加- 否则你可能会面临失败的构建,如下所示:

script.sh: line 3: syntax error: unexpected redirection
Run Code Online (Sandbox Code Playgroud)

您可以在下面找到在我的Jenkins沙箱中运行良好的修改后的管道脚本:

#!/usr/bin/env groovy

pipeline {
    agent none

    stages {
        stage('Break Jenkins') {
            agent any
            steps {    
                sh '''#!/bin/bash
                  ENV_VAR=$(awk -F'-' '{print $2 }' <<< $(ls *))
                  echo $ENV_VAR
                '''
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,在我的情况下,我已经简化ls$(ls *)因为没有与您的示例中的表达式匹配的文件.希望能帮助到你.

顺便说一句,如果你希望你的bash脚本返回你想在管道中使用的东西,你必须以sh下列方式执行:

sh(script: "your script", returnStdout: true)
Run Code Online (Sandbox Code Playgroud)

参考:https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-shell-script