Get multiple secrets from one Credential Store in Jenkins - jenkins

For my pipeline, I want to keep the subscription ID, tenant ID, client ID, and password all out of source control, and keep all of those in a single credential store in Jenkins. It seems that there is not a $class that matches this for withCredentials, but I just want to use credentials() in the environment anyways. Am I mistaken that the credentials('file') method reads as a single value, or is there a way to format that file such that Jenkins will parse it and make each secret available?
//Jenkinsfile (Declarative Pipeline)
pipeline {
agent { label 'AZcli' }
environment {
SECRETS_FILE = credentials('AZJenkinsSecretsFile')
}
Then what?
Let's say this is the AZJenkinsSecretsFile.txt that I've uploaded.
subscription=xxxx-xxx-xx-xx-x
tenant=xxx-xxx-xxx-xx
client=xxx-xxxx-xxx
password=password

When you create a Secretfile you will be given a Path to a temporary file with the secret content. Secret files are intended to be passed as a whole file. For example, you can have your kubeconfigs file as a Secretfile and then pass it directly to kubectl like kubectl --kubeconfig $SECRET_CONFIG.
If you want to export each line in the secret file as a variable, it's doable. But when you start using them in your shell steps their values will be exposed in the logs. In order to use them, you can use something like below.
sh """
source $SECRETS_FILE
echo "\$subscription"
echo "\$tenant"
"""

Related

Jenkins: How to access a secret file?

I'm trying to get my head around Jenkins, I've uploaded a secret file to credentials and made it global but I can't seem to use it in my stage.
I'm trying to just echo out the file for now
steps { echo("My File: ${credentials('local_instance')}") }
but in the log I don't see the contents of the file just My File: #credentials(<anonymous>=local_instance). I need to be able to get the contents of the file and write it to a file named local.env, or as I uploaded it with local.env can I just pull the file and have it stored in my root?
The proper way to get access to credentials in Jenkins is withCredentials step.
withCredentials([file(credentialsId: 'youCredId', variable: 'secretFile')]) {
// do something with the file, for instance
sh 'cat $secretFile'
}
Where youCredId your file credential ID in Jenkins.
More information is here: https://www.jenkins.io/doc/pipeline/steps/credentials-binding/
There is another approach. In environment section of your declarative pipeline, you can assign an env variable with a credential value.
environment {
SECRET_FILE = credentials('youCredId')
}
But the first approach is more preferable because it allows you to reduce the scope of secret variable.
More information is here: https://www.jenkins.io/doc/book/pipeline/jenkinsfile/#handling-credentials

How to inject dynamic secret parameters from Jenkins job execute shell script

I am working on jenkins, which has dropdownlist/select list load with set MQ broker details. Each broker have different passwords stored in AWS secrets manger. I have written shell script to fetch password AWS secrets manager, i can able to get the password in execute shell build step.
I tried using mask passwords plugin-> mask passwords and regex, i am using same variable(BR_PASSWORD) defined in mask password option, even in shell script also.
What i provided default value with variables defined in global or password parameter , for default value.
All these options masking defined in default password in console output. But values which are coming trough shell script dynamically is not masking in console out put.
please add an example of your code.
And use groove string 'command ' for mask passwords
sh '$password'

Export variable containing secret text from Jenkins pipeline

I am trying to pass to a shell step on my Jenkins job a variable defined like (script step):
env.PGPASSWORD = credentials('test')
When I try too access (sh''' step) to that variable(PGPASSWORD) making the exportto let my postgres grab the secret text:
export "${PGPASSWORD}"
It seems like that command from above is not grabbing the secret contained on the Jenkins credentials.
If I try to echo the PGPASSWORD variable it outputs:
#credentials(<anonymous>=test)

How to work with configuration information in Jenkins instead of hard-coding in Jenkinsfile?

if(env.BRANCH_NAME =~ /PR-\d+-head/ && env.CHANGE_TARGET == 'QA_branch' )){
sh """
sfdx force:source:deploy --url https://abc.salesforce.com
"""
}else if(env.BRANCH_NAME =~ /PR-\d+-head/ && env.CHANGE_TARGET == 'UAT_branch' )){
sh """
sfdx force:source:deploy --url https://def.salesforce.com
"""
}
I have Jenkinsfile similar to this. These urls keep changing and I have to update Jenkinsfile every time new url is generated by salesforce.
Is there a way to store this kind of information in Jenkins and read from Jenkins? Like we do for storing credentials.
I can store these urls in Jenkins as credentials and get those values in Jenkinsfile but not sure if that is a good approach as these are not credentials.
I am looking for a way to avoid updating Jenkinsfile every time environment related information changes and move it to Jenkins or somewhere.
You could store these URLs as global properties and access them in your jenkinsfile as described here.
Another approach (more complicated) is to stored a file in a source control, and let Jenkins download the file, read the data within the file and read the URL's.
Good things about this approach:
Your config code is versioned
Your config code resides outside jenkins, so it is easy to backup
You can config files on different branches, so you use what you need
The only drawback is that you need more coding to implement this solution.

Using parameterized credentials in Jenkins

Say I've got dev, qa, and stable server environments for some web app, with corresponding git branches. Each environment should be continuously integrated. Each of these environments has a separate username/password pair used to publish the app. I would like to make a Jenkins multiconfiguration (matrix) job to publish to all of these environments. The publishing almost certainly must be done with a shell script.
My failed attempt consisted of using the Jenkins Credentials and Credentials Binding plugins. Credentials Binding provides a way to inject credentials as environment variables using a parameter. However, setting this parameter dynamically (i.e., something like if ENV == dev: CREDS = CREDS_dev) doesn't appear to be possible. Build scripts happen afterwards, and even using the Environment Script plugin doesn't work.
Is there any way for this to happen?
Had similar situation and used groovy script with parameterized build (https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin). In my case I had a choice parameter defined as "DEPLOY" and had different values, like "Test", "Release", then in the following groovy script (Evaluated Groovy script):
if ("Test".equals(DEPLOY)) {def map = [DEPLOY_URL: "http://someurl", DEPLOY_STORAGE: "testaccount"]; return map }
You should be able to specify your credentials in here or copy env variables. After that you can access these variables in windows batch command using:
echo %DEPLOY_URL%
echo %DEPLOY_STORAGE%
I also had another choice parameter defined "Deploy.Branch", with values of "dev" and "master". And used it as a parameter to Branches to Build, the value was set to (if you want to dynamically specify branch based on parameters):
*/${Deploy.Branch}
Hope this helps.
Here's what I ended up doing. It's kind of a workaround for what I would argue is a flawed design or missing use case in Jenkins.
Redid my creds so they have standard IDs (this is in the Advanced part and you can't set it after creation)
Matrix job runs a trivial script to figure out what env maps to what creds ID, then triggers...
The main job that does the deployment

Resources