Injecting secrets in Jenkins multibranch pipeline - jenkins

I have local jenkins setup with admin access.
I have configured plugins as per this https://support.cloudbees.com/hc/en-us/articles/203802500-Injecting-Secrets-into-Jenkins-Build-Jobs.
Though, I am still unclear about how to inject secrets in Jenkins multibranch pipeline jobs. I could not see any configurations option to either set the environemntal variables as well. PS - I do not want to commit secrets in git ;)
Need to inject them as secrets from Jenkins.

I used credentials plugin to store credentials and credentials binding plugin to map them to environmental variables. Here is how I did it:
withCredentials([string(credentialsId: 'AZURE_SUBSCRIPTION_ID', variable: 'AZURE_SUBSCRIPTION_ID')]) {
}
withCredentials([string(credentialsId: 'AZURE_CLIENT_ID', variable: 'AZURE_CLIENT_ID')]) {
}
withCredentials([string(credentialsId: 'AZURE_TENANT_ID', variable: 'AZURE_TENANT_ID')]) {
}
withCredentials([string(credentialsId: 'AZURE_CLIENT_SECRET', variable: 'AZURE_CLIENT_SECRET')]) {
}

Related

How can i use Environment Injector Plugin with Jenkinsfile or Pipeline

I have Jenkins declarative file, and adding Jenkins plugin Environment Injector Plugin
I use Environment Injector Plugin to configure/inject environment variables, the problem is when i try to run printev to check available environment variable, nothing added to env variable
I use same plugin for Freestyle project and works fine. Can I use Environment Injector Plugin with pipeline or not possible at all?
I have try with echo $VAR_NAME and printev inside pipeline declaration and no luck
You don't have to rely on the environment inject plugin in a declarative Pipeline to set environment variables. You can use an environment block instead. Check here for details.
pipeline {
agent {
label '!windows'
}
environment {
DISABLE_AUTH = 'true'
DB_ENGINE = 'sqlite'
}
stages {
stage('Build') {
steps {
echo "Database engine is ${DB_ENGINE}"
echo "DISABLE_AUTH is ${DISABLE_AUTH}"
sh 'printenv'
}
}
}
}

Jenkins Share common environment variables in a groovy method

I am building a declarative JenkinsFile, I have some common variables that I want to be shared across some Jenkins projects and jobs.
So I created a jenkins shared library, but for some reason i can't get my Jenkins file to to read the common environment variables from common groovy.
pipeline {
environment {
commonEnv()
Email_Notification_Enabled="true"
Slack_Notification_Enabled="false"
}
}
and in my groovy i had:
def call() {
a = "abc"
b = "abc"
}
It throws error that commonEnv() is not allowed in environments.
What is the possible way to achieve such behaviour.
You could write a Groovy method that sets the common environment variables. Please refer this Stack Overflow question to know how to do this. Include that method in Jenkins pipeline shared library.
Now call this Groovy method in declarative pipeline of each of your jobs. Remember that in a declarative pipeline, you may use Groovy only inside the script step. So, your pipeline would look something like:
pipeline {
stages {
stage("First stage") {
steps {
script {
// call to Groovy method that sets environment variables
}
// other steps
}
}
// other stages
}
}
Hope, it helps.
Since you need to have environment variables that are shared across all Jenkins projects and jobs, you should set them up on Jenkins instance level rather than on a Jenkins project or job level.
So, instead of doing it in a Jenkinsfile (which will do it at Jenkins job level), I will do it in Manage Jenkins > Configure System > Global properties > Environment Variables:
The environment variables could then be read in the pipeline script from Jenkins Global Variable env:
echo "This is my Jenkins global environment variable ${env.MY_ENV_VAR_NAME}"

Jenkinsfile pipeline access to "Global Passwords"

How can I get access to passwords defined in Jenkins Global Configuration?
Passwords are not injected by default and I was trying code below and was able to access "Global properties" but not luck with passwords.
def envVars = Jenkins.instance.getGlobalNodeProperties()[0].getEnvVars()
println envVars['MY_VARIABLE']
Use the withCredentials step, which comes with the Credentials Binding Plugin.
Are you referring to Jenkins -> Manage Jenkins -> Global properties ?
If yes, below is how we retrieve them in our groovy script:
import jenkins.model.*
instance = Jenkins.getInstance()
globalNodeProperties = instance.getGlobalNodeProperties()
globalNodeProperties.each {
envVars = it.getEnvVars()
if (envVars.get('ARTIFACTORY_USR') != null) {
artifactory_usr = envVars.get('ARTIFACTORY_USR');
}
if (envVars.get('ARTIFACTORY_PSW') != null) {
artifactory_pwd = envVars.get('ARTIFACTORY_PSW');
}
}
ARTIFACTORY_USR and ARTIFACTORY_PSW are pre-defined global properties
In general, I create credentials in Jenkins -> credentials page to access the credential in the pipeline.
How to create Credentials in Jenkins
1. Open Credential page (Jenkins --> Credential)
2. Create a credential with Username and password and define a valid ID (For Example:myCredentialId)
How to access the credential using withCredentials in the pipeline
pipeline {
agent any
stages {
stage("Access the credentials") {
steps {
script {
withCredentials([[
$class:'UsernamePasswordMultiBinding',
credentialsId: 'myCredentialId',
usernameVariable:'username',
passwordVariable:'token'
]]) {
sh '''
curl -u ${username}:${token} -L <replace your git URL> -o master.txt
cat master.txt
'''
}
}
}
}
}
}
The inject global passwords option for non-pipeline jobs comes from the EnvInject plugin, which isn't fully supported for pipeline jobs:
https://plugins.jenkins.io/envinject/
Jenkins Pipeline compatibility
Even though it is possible to set up the EnvInject Job Property and build step in Pipeline, the plugin does not provide full compatibility with Jenkins Pipeline.
Supported use-cases:
Injection of EnvVars defined in the "Properties Content" field of the Job Property
These EnvVars are being injected to the script environment and will be inaccessible via the "env" Pipeline global variable
Please note there is also a known compatibility issue with Durable Task
Plugin 1.13
All other use-cases of the plugin may work incorrectly in Jenkins Pipeline. Please see JENKINS-42614 for more information about unsupported use-cases. There is no short-term plan to fix the compatibility issues though any pull requests to the plugin will be appreciated.
I had the same use case and ended up recreating the global password as a credential.

How do I invoke credentials stored in Jenkins to deploy to a custom Nexus from within a Jenkinsfile?

I have a custom Nexus for project related utility jars. I have a Jenkins to build these jars.
I want to use gradle in the project and a Jenkinsfile to define the pipeline. As the last stage, I want the build job to deploy the artifact to my Nexus.
Since I don't want the credentials for the Nexus in my source repository (and therefor neither in the gradle script nor in the Jenkinsfile), I set up a credentials entry in the Jenkins Credentials plugin, containing user and password for the Nexus.
How do I refer to these credentials from within the Jenkinsfile such that I can use them to deploy to the Nexus?
Currently, my deploy stage looks like this:
stage('Publish') {
sh "gradle upload"
}
Can I use gradle for this purpose at all? I know I can use it locally, but it would be ok for me to use a different command from within the Jenkinsfile.
In gradle, I use this to define the task:
def nexusUser = "$System.env.NEXUS_USER"
def nexusPass = "$System.env.NEXUS_PASS"
uploadArchives {
repositories {
mavenDeployer {
repository(url: "http://nexus.example.com/repository/maven-releases/") {
authentication(userName: nexusUser, password: nexusPass)
}
}
}
}
(I set the user and password as environment variables locally. That's not an option on the Jenkins, of course.)
You can set external variables in ~/.gradle/gradle.properties
nexusUser=superuser
nexusPass=superpassword
You can use withCredentials(){} step to inject environment variables which will be visible only inside {} block.

How to insert properties in Jenkinsfile in multibranch pipeline?

I configured jenkins multibranch pipeline on Jenkins version 2.60.2
I'm looking for a way to keep my passwords in jenkins multibranch pipline configuration, so Jenkinsfile could take them as parameters for execution of its stages. Is there a way to set these properties within the jenkins UI?
I found a similar question here, but I think there is a more preferred way.
Thanks
For using credentials in a Jenkins Pipeline, there are a couple plugins that I would consider essentially part of the Jenkins Core (even though they are plugins):
Credentials Plugin
Credentials Binding Plugin
These can combine to give you a way to administratively manage credentials as well as provide for ways to consume them inside of Jobs. There are additional plugins built on top of these providing credential type implementations. For example, the SSH Credentials Plugin allows you to store SSH credentials in Jenkins.
The Credentials Binding Plugin provides the withCredentials step. The documentation has some examples on how you could use it. Here is an example from the documentation:
node {
withCredentials(
[
usernameColonPassword(
credentialsId: 'mylogin',
variable: 'USERPASS'
)
]
) {
sh '''
set +x
curl -u $USERPASS https://private.server/ > output
'''
}
}

Resources