我有一个构建管道,需要从一些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
的值
看起来我只能在environment
块中设置一个Jenkinsfile环境变量,这没有用,因为我已经在sh
块内了。
简单来说,有没有办法在sh
块中设置和访问环境变量的值?
答案 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