Home > Enterprise >  Dynamic variable in Jenkins pipeline with configFileProvider
Dynamic variable in Jenkins pipeline with configFileProvider

Time:01-13

I am trying to replace the the DB cred based on the env name in Jenkins, but I am unable to achieve the same.

I have a JSON Config Files like this named 'JsonConfig'

{
  "production": {
    "DB_USERNAME": "userABC"
  },
  "development": {
    "DB_USERNAME": "userXYZ"
  }
}

and this what I have in Jenkinsfile

def getEnvName() {
    if ("master".equals(env.BRANCH_NAME)) {
        return "production";
    }
    return env.BRANCH_NAME;
}

def config;

node(){
    configFileProvider([configFile(fileId: 'secret-credentials', targetLocation: 'JsonConfig')]) {
        config = readJSON file: 'JsonConfig'
    }
}

pipeline {
    agent any

    stages {
        stage("Setup") {

            when {
                beforeAgent true
                anyOf { branch 'master', branch 'development' }
            }

            steps {
                sh """
                sed -i 's#__DB_USERNAME__#config.${getEnvName()}.DB_USERNAME#' ./secret-data.yml
                cat ./secret-data.yml
                """

                //Alternative 
                sh "sed -i 's#__DB_USERNAME__#${config.getEnvName().DB_USERNAME}#' ./secret-data.yml"
            }
        }
    }
}

If I statically pass the var name like this, then it is working fine.

sh "sed -i 's#__DB_USERNAME__#${config.production.DB_USERNAME}#' ./k8s/secret-data.yml"

I want to make "production" dynamic so that it reads the value which is returned from getEnvName() method.

CodePudding user response:

The problematic line is

sh """
    sed -i 's#__DB_USERNAME__#config.${getEnvName()}.DB_USERNAME#' ./secret-data.yml
"""

This will evaluate as the shell command

sed -i 's#__DB_USERNAME__#config.production.DB_USERNAME#' ./secret-data.yml

But you want to be evaluated to

sed -i 's#__DB_USERNAME__#userABC#' ./secret-data.yml

Since the config is a Groovy object representing the parsed JSON file we can access its properties dynamically using the subscript operator ([]):

sh """
    sed -i 's#__DB_USERNAME__#${config[getEnvName()].DB_USERNAME}#' ./secret-data.yml
"""
  • Related