Some Variables not getting rendered in jenkins pipeline inside single quotes

Viewed 1403

I am using below code in CASE 1 in my jenkins library , it is able to render the artifactory password and username inside the sh block but not able to render the variable docker_repo , if I replace it with code in CASE 2 it works fine but it is an unsafe practice , Any idea why it is happening ? and how to overcome it ?

CASE 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'


    }
}

CASE 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}"
    
    
        }
    }
3 Answers

I solved it using below code , converted docker_repo into a env variable and then used inside single quotes. Reason for using single quotes in sh is in this link https://docs.cloudbees.com/docs/admin-resources/latest/automating-with-jenkinsfile/string-interpolation

If anyone has a better answer please post

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'
        }
    }
}

You need "CASE 3", where you use double quotes (as case 2) but escape the dollar on environment variables, but leave it for templating groovy variables

    sh "sudo docker login -u \${ARTIFACTORY_USER} -p \${ARTIFACTORY_PASSWORD} ${docker_repo}"

Also you can try this

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}"
    }
}

Related