从 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}")
  1. ${varContent} 是来自本地脚本范围的变量,它被替换 字符串被写入临时 shell 脚本
  2. 之前
  3. ${env.envContent}${env.BRANCH_NAME} 处理已经预先设置的环境变量,就好像它们是“本地范围”变量一样
  4. ${envContent}${BRANCH_NAME} 是实际的环境变量。反斜杠转义美元符号,shell 脚本将包含 shell 变量占位符 ${envContent}${BRANCH_NAME},它们将在 shell 脚本 运行 时间。

运行 上述脚本将显示以下输出: