jenkinscontinuous-integrationbuild-automationcicdjenkins-shared-libraries

Jenkins - set options in a shared library for all pipelines that use the shared library


I have a bunch of repositories which use (parts of) the same Jenkins shared library for running tests, docker builds, etc. So far the shared library has greatly reduced the maintenance costs for these repos.

However, it turned out that basically all pipelines use the same set of options, e.g.:

@Library("myExample.jenkins.shared.library") _
import org.myExample.Constants

pipeline {
    options {
        disableConcurrentBuilds()
        parallelsAlwaysFailFast()
    }

    agent {
        label 'my-label'
    }

    stages {
        stage {
            runThisFromSharedLibrary(withParameter: "foo")
            runThatFromSharedLibrary(withAnotherParameter: "bar")
            ...

...

In other words, I need to copy-and-paste the same option snippets in any new specific pipeline that I create. Also, this means that I need to edit separately each Jenkinsfile (along with any peer-review processes we use internally) when I decide to change the set of options.

I'd very much like to remove this maintenance overhead somehow. How can I delegate the option-setting to a shared library, or otherwise configure the required options for all pipelines at once?


Solution

  • Two options will help you the most:

    1. go to Jenkins-->Manage Jenkins-->Configure System--> Global properties.
    2. Mark the Environment variables box then add name and value for the variable.

    then you will be able to use it normally in your Jenkins pipelines as below code snippets.

    Jenkinsfile will look like below:

    @Library('shared-library') _
    customServicePipeline(agent: 'staging',
            timeout: 3,
            server:'DEV')
    

    shared library function

    // customServicePipeline.groovy  
    
    def call(Map pipelineParams = [:]) {
        pipeline {
            agent { label "${pipelineParams.agent}" }
            tools {
                maven 'Maven-3.8.6'
                jdk 'JDK 17'
            }
            options {
                timeout(time: "${pipelineParams.timeout}", unit: 'MINUTES')
            }
            stages {
                stage('Prep') {
                    steps {
                      echo 'prep started'
                      pingServer(pipelineParams.get("server"))
                    }
                }
            }
        }
    }