【问题标题】:Jenkins Pipeline: exporting and reading environment variable inside bash scriptJenkins Pipeline:在 bash 脚本中导出和读取环境变量
【发布时间】:2018-02-07 21:36:53
【问题描述】:

我有一个构建管道,它需要从一些 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:groovy.lang.Binding

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

echo \$ENV_VAR

像这样

echo '$ENV_VAR'

两者都没有按预期工作。我认为这是我在字符串块(sh """ ... """)语法中的问题,并且还告诉 Jenkins 不要尝试从 envs 集合中获取 ENV_VAR 的值。

无论如何,我在谷歌搜索这个问题的解决方案时运气不佳,因为 Jenkins 的管道有自己的环境变量概念,似乎与 bash 环境变量是分开的。

看起来我只能在 environment 块内设置 Jenkinsfile 环境变量,这没有帮助,因为我已经在 sh 块内。

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

【问题讨论】:

    标签: jenkins groovy jenkins-pipeline


    【解决方案1】:

    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

    【讨论】:

    • 嗨,这是很好的信息,但我有一个案例,我需要文字 $ 并且我还需要插值,所以我陷入了引用的噩梦。你有机会提供帮助吗? serverfault.com/questions/948364/…
    猜你喜欢
    • 2019-10-22
    • 2017-07-26
    • 2017-02-03
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    相关资源
    最近更新 更多