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

时间:2018-02-07 21:36:53

标签: jenkins groovy 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
                """
            }
        }
    }
}

当解释器点击echo $ENV_VAR行时,Jenkins会抛出异常:

  

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

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

echo \$ENV_VAR

并且喜欢这个

echo '$ENV_VAR'

既不能按预期工作。我认为这是一个问题,我在一个字符串块(sh """ ... """)语法中,并告诉Jenkins不要试图从ENV_VAR集合中获取envs的值

无论如何,由于Jenkins的管道有自己的环境变量概念,似乎与bash环境变量是分开的,所以我没有太多运气直接搜索到这个问题的解决方案。

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

简单来说,有没有办法在sh块中设置和访问环境变量的值?

1 个答案:

答案 0 :(得分:6)

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

同样值得在脚本开头添加#!/bin/bash - 否则您可能会面临构建失败的错误,如:

script.sh: line 3: syntax error: unexpected redirection

下面你可以找到在我的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
                '''
            }
        }
    }
}

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

顺便说一下,如果您希望自己的bash脚本返回要在管道中使用的内容,则必须按以下方式执行sh

sh(script: "your script", returnStdout: true)

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