一些变量没有在单引号内的詹金斯管道中呈现

tha*_*guy 2 groovy jenkins jenkins-plugins jenkins-job-dsl

我在 jenkins 库中的案例 1 中使用下面的代码,它能够在 sh 块内渲染人工密码和用户名,但无法渲染变量 docker_repo ,如果我用案例 2 中的代码替换它,它工作正常,但它是一种不安全的做法,知道为什么会发生这种情况吗?以及如何克服它?

情况1

def dockerAuth(String creds = 'mysecret',String docker_repo = ARTF_URL) {
    withCredentials([usernamePassword(credentialsId: creds,
                     usernameVariable: 'ARTIFACTORY_USER',
                     passwordVariable: 'ARTIFACTORY_PASSWORD')]) {
        //opts = '-u $ARTIFACTORY_USER -p $ARTIFACTORY_PASSWORD'
        sh 'sudo docker login -u $ARTIFACTORY_USER -p $ARTIFACTORY_PASSWORD $docker_repo'


    }
}
Run Code Online (Sandbox Code Playgroud)

案例2

def dockerAuth(String creds = 'mysecret',String docker_repo = ARTF_URL) {
        withCredentials([usernamePassword(credentialsId: creds,
                         usernameVariable: 'ARTIFACTORY_USER',
                         passwordVariable: 'ARTIFACTORY_PASSWORD')]) {
            //opts = '-u $ARTIFACTORY_USER -p $ARTIFACTORY_PASSWORD'
            sh "sudo docker login -u ${ARTIFACTORY_USER} -p ${ARTIFACTORY_PASSWORD} ${docker_repo}"
    
    
        }
    }
Run Code Online (Sandbox Code Playgroud)

tha*_*guy 5

我使用下面的代码解决了这个问题,将 docker_repo 转换为环境变量,然后在单引号内使用。在 sh 中使用单引号的原因在此链接中https://docs.cloudbees.com/docs/admin-resources/latest/automating-with-jenkinsfile/string-interpolation

如果有人有更好的答案请留言

def dockerAuth(String creds = 'jenkins-artifactory',String docker_repo = "${ARTF_SECURE_DOCKER_URL}") {
    withCredentials([usernamePassword(credentialsId: creds,
                     usernameVariable: 'ARTIFACTORY_USER',
                     passwordVariable: 'ARTIFACTORY_PASSWORD')]) {
        withEnv(["repo=${docker_repo}"]) {
        sh 'sudo docker login -u $ARTIFACTORY_USER -p $ARTIFACTORY_PASSWORD $repo'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)