The Jenkins continuous integration (CI) server allows job configuration to be scripted and version controlled instead of being configured using the web interface. That makes is easier to migrate jobs to another environment and changes easier to trace.
Such jobs are called “pipeline jobs” and come in two flavours: declarative
and scripted
. We prefer scripted pipelines because they offer you the full power of the groovy language.
One common problem in CI jobs is that you need credentials to log into other systems, e.g. for storing build artifacts or deploying to some staging server.
The credentials should of course never be stored as plain text in your repository, like directly in your Jenkinsfile
. Also you do not want to appear them in build logs and the like.
Solution for scripted pipelines
Fortunately there is a nice solution available in the withCredentials
-step.
First you need to manage the credentials in the central Jenkins credential management. There are several credential types like username and password, api token, secret text or username and private key.
Then you can reference them in your pipeline script like below:
// stuff to build the docker images...
stage ('Transfer release images to registry') {
withCredentials([usernamePassword(credentialsId: 'private-artifactory', passwordVariable: 'dockerKey', usernameVariable: 'dockerUser')]) {
// avoid using credentials in groovy string interpolation
sh label: 'Login to docker registry', script: '''
docker login --username $dockerUser --password $dockerKey ''' + my-artifactory.intranet
// do something while being logged in
sh label: 'Logout from docker registry', script: '''
docker logout my-artifactory.intranet
'''
}
// stuff after publishing the docker images
Note that we do not use the injected environment variables in groovy’s string interpolation as that would expose the credentials on the underlying OS as the documentation states.