首页 > 解决方案 > 从 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 脚本中,但我不能因为它用双引号失败。

标签: groovyjenkins-pipelinejenkins-groovy

解决方案


您必须小心区分变量范围:

  • 脚本中设置的环境变量
  • 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. ${env.envContent}${env.BRANCH_NAME}处理已经预先设置的环境变量,就好像它们是“局部范围”变量一样
  3. \${envContent}并且\${BRANCH_NAME}是实际的环境变量。反斜杠转义美元符号,并且 shell 脚本将包含 shell 变量占位符${envContent}${BRANCH_NAME}并将在 shell 脚本运行时替换。

运行上述脚本将显示以下输出: 詹金斯构建输出


推荐阅读