Jenkinsfile pipeline access to "Global Passwords" - jenkins

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.

Related

How to set sonar url commonly for all the multibranch pipeline jobs(created via bitbucket organization job) commonly?

I am using organization "Organizational Folder" in jenkins and able to create multibranch pipeline jobs for all my repos available in my organization folder in bitbucket.
Each of the repos contains Jenkinsfile because of which the job gets created. Now I am stuck at a point, I want to publish sonar report of all the repos but it is trying to publish at sonar default url. One solution I am aware of is to provide sonar url and login credentials in each of the Jenkinsfile. But I don't want to do that as I will have to make changes in more than 50 repos.
I am using shared instance of Jenkins, thus, does not have admin access to configure settings.xml for maven.
Is there any way by which I can pass sonar url and credentials to all the multibranch pipeline jobs via configuration in "Organizational Folder" or at the folder level where I have admin access
You can define sonarQube server in environment section of jenkinsfile and also create token on sonarQube and add it in credentials of jenkins and use it like this
environment {
SONAR_URL = "https://YOUR_SONARQUBE_URL"
SONAR_TOKEN = credentials('ID_OF_YOUR_CREDENTIALS')
}
stage("Run SonarQube Analysis") {
steps {
script {
sh 'mvn clean package sonar:sonar -Dsonar.host.url=$SONAR_URL -Dsonar.login=$SONAR_TOKEN -Dsonar.profile="Sonar way"'
}
}
}

How to retrieve Jenkins environment from Groovy script?

I am setting a Jenkins. I am programming with my pipeline using Global Pipeline Libraries to be able to increase reusability. Scripts are object oriented and in Groovy. Information about the concept can be found there
I don't manage to retrieve the Jenkins specific environment using my library script. I would like for instance to access:
Build_ID
Build_Number
JOB_Name
Workspace_path
I tryied to use env.WORKSPACE but it is returning a NULL. I manage to retrieve it directly in the pipeline but this is not my goal.
I am using Jenkins 2.303.1.
Depending on how you write your scripts, you might need to inject the Jenkins environment. For example, if you go for a more object oriented way
// vars/whatever.groovy
import ...
#Field
def myTool = new MyTool(this)
// src/.../MyTool.groovy
import ...
class MyTool {
private final jenkins
MyTool(steps) {
this.jenkins = jenkins
}
def echoBuildNumber() {
this.jenkins.echo(this.jenkins.env.BUILD_NUMBER)
}
}
// Jenkinsfile
#Library(...)
node {
echo env.BUILD_NUMBER // echoes build number
whatever.myTool.echoBuildNumber() // echoes build number
}
So the env which you are looking for can be accessible using like this in groovy script
${env.BUILD_NUMBER}
${env.JOB_NAME}
${env.WORKSPACE}
${env.BUILD_ID}

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

Injecting secrets in Jenkins multibranch pipeline

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')]) {
}

Resources