groovy - 从 Jenkins 管道将文件上传到 Nexus 不起作用
问题描述
这不起作用:
withCredentials([usernamePassword(credentialsId: 'xxxxxxxxxxx', passwordVariable: 'ABCD', usernameVariable: 'XYZ')]) {
dir("build") {
sh "curl -u $XYZ:$ABCD --upload-file xyz.tar.gz https://mnpqr/repository/abc/$BRANCH_DIR/xyz.tar.gz"
}
}
错误:
/var/lib/jenkins/workspace/xyz/build@tmp/durable-71c2368a/script.sh: line 1: VG7cJ: No such file or directory
但这有效:
withCredentials([usernamePassword(credentialsId: 'xxxxxxxxxxx', passwordVariable: 'ABCD', usernameVariable: 'XYZ')]) {
dir("build") {
sh 'curl -u $XYZ:$ABCD --upload-file xyz.tar.gz https://mnpqr/repository/abc/$BRANCH_DIR/xyz.tar.gz'
}
}
我想将更多数据插入到 sh 脚本中,但我不能因为它用双引号失败。
解决方案
您必须小心区分变量范围:
- 脚本中设置的环境变量
- Jenkins 进程设置的环境变量
- 局部变量在分叉的 shell 进程中不可用
在双引号字符串中替换它们时,它们都必须以不同的方式处理:
node {
stage('My stage') {
// local variable scope
varContent = "Variable content"
// environment variable set up in script
env.envContent = "Environment content"
// environment variable available in shell script
withEnv(["BRANCH_NAME=myBranch"]) {
sh("echo ${varContent} XX ${env.envContent} XX \${envContent} XX \${BRANCH_NAME} XX ${env.BRANCH_NAME}")
}
}
}
在示例中,您会看到所有三种类型。让我们仔细看看shell命令:
sh("echo ${varContent} XX ${env.envContent} XX \${envContent} XX \${BRANCH_NAME} XX ${env.BRANCH_NAME}")
${varContent}
是本地脚本范围内的变量,在将字符串写入临时 shell 脚本之前将其替换${env.envContent}
并${env.BRANCH_NAME}
处理已经预先设置的环境变量,就好像它们是“局部范围”变量一样\${envContent}
并且\${BRANCH_NAME}
是实际的环境变量。反斜杠转义美元符号,并且 shell 脚本将包含 shell 变量占位符${envContent}
,${BRANCH_NAME}
并将在 shell 脚本运行时替换。
推荐阅读
- java - 如何使用 onCreate 外部的 onBackPressed 停止 onCreate 内部的处理程序?
- javascript - 如何向 taginput 元素添加验证?
- google-apps-script - Google 电子表格自定义脚本参考
- cplex - 指导我写一个容量约束
- laravel - 使用 webpack 时不显示 Datatables.net Excel 导出按钮
- three.js - 为什么我将 equirectangular map 拆分为立方体 map 后仍然存在奇点?
- ajax - 我可以将一个集合(数据结构)从 AJAX 传递给 Servlet 吗?
- security - 在tomcat下发布的J2ee应用修改为HTTPS协议后仍然可以被burpsuite拦截
- python - 在 Pandas 中有效地从 n 个可能性中选择 r 个结果
- laravel - 如何修复 laravel 视图中未定义的偏移量?