jenkins - Jenkins 在 sh 中使用脚本变量
问题描述
我正在尝试在script
Jenkins 文件的部分中声明一个名为 output 的变量,并尝试像这样使用它
stages {
stage('Deploy') {
steps {
script {
output = 'output.log'
sh 'cd invoker && mvn clean install && mvn exec:java -Dexec.mainClass="com.company.Deployer" -Dexec.args="qal ${GIT_COMMIT_HASH}" > ../${output}'
echo readFile(output)
}
}
}
}
但我收到此错误:script.sh: cannot create ../: Is a directory
. 这意味着变量没有被填充。我都尝试了 ${output}
,$output
但得到了同样的错误。
我究竟做错了什么?
解决方案
在 groovy 中,单引号 ( ''
) 字符串不支持字符串插值,只有双引号 ( ""
) 字符串 (GStrings) 支持它,因此您的参数不会被评估。
要解决此问题,只需在您的sh
步骤中使用双引号:
sh "cd invoker && mvn clean install && mvn exec:java -Dexec.mainClass=\"com.company.Deployer\" -Dexec.args=\"qal ${GIT_COMMIT_HASH}\" > ../${output}"
另一种选择是使用声明性管道环境指令,它是声明性管道语法的一部分,它设置将作为环境变量加载到 shell 执行环境的参数(除了默认参数)。因此,您可以在块中定义参数environment
,然后在脚本中使用环境变量的 shell 语法:$PARAM
.
就像是:
pipeline {
agent any
environment {
OUTPUT_FILE= 'output.log'
}
stages {
stage('Use Global Parameter') {
steps {
sh 'cd invoker && mvn clean install && mvn exec:java -Dexec.mainClass="com.company.Deployer" -Dexec.args="qal $GIT_COMMIT_HASH" > ../$OUTPUT_FILE'
echo readFile(output)
}
}
}
}
推荐阅读
- linux - 如何编辑 /etc/profile?
- sql - 如何正确使用 where order by have order by
- r - 在布尔向量中找到*第一个*最长的 TRUE 序列
- web-services - 创建 Web 服务客户端存根时 Netbeans 中的 WS 导入问题
- javascript - Jquery UI resizable - 调整特定宽度
- angular - 选择以选择布尔变量的值
- json - 使用 jq 删除另一个项目后显示项目的原始列表
- vue.js - Vuetify 应用栏溢出隐藏不起作用
- python - Python关于在pandas中使用正则表达式进行整数搜索
- c++ - DT_TEXTREL 是什么意思,如何解决?