从 Jenkins 管道将文件上传到 Nexus 无效
Uploading a file into Nexus from Jenkins pipeline is not working
这不起作用:
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 脚本 运行 时间。
运行 上述脚本将显示以下输出:
这不起作用:
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 脚本 运行 时间。
运行 上述脚本将显示以下输出: