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_VAR
从envs
集合中获取值.
无论如何,我没有太多的运气谷歌搜索解决这个问题,因为詹金斯的管道有自己的环境变量的概念,似乎是与bash环境变量分开.
看起来我只能在一个environment
块中设置一个Jenkinsfile环境变量,这没有用,因为我已经在一个sh
块里面了.
简而言之,有没有办法在块中设置和访问环境变量的值sh
?
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
归档时间: |
|
查看次数: |
7954 次 |
最近记录: |