Search code examples
jenkinscontinuous-integrationjenkins-pipelinecontinuous-deployment

Jenkins pipeline script global variable


I am learning jenkins, and am working on a sample pipeline

pipeline {
agent any

stages {
    stage('Stage1') { 
        steps {
            bat  '''
                    cd C:/Users/roger/project/
            
                    python -u script1.py
                '''
        }
    }
stage('Stage2') { 
        steps {
            bat  '''
                    cd cd C:/Users/roger/project/abc/
            
                    python -u script2.py
                '''
        }
    }
stage('Stage3') { 
        steps {
            bat  '''
                    cd cd C:/Users/roger/project/abc/new_dir/
            
                    python -u demo.py
                '''
        }
    }
}
}

is there a way to store the base path of project C:/Users/roger/project/ as a variable, so that it can be used to append new path to it instead of writing the whole path.

How could I write above stages, so that I don't have to repeat writing the same base path each time to each stage


Solution

  • You have several options, the easiest way will be to define the parameter inside the environment directive (read more) which will make the parameter available for all stages in the pipeline and will also load it to the execution environment of any interpreter step like sh, bat and powershell thus making the parameter also available to the scripts you execute as an environment variable.
    In addition the environment directive supports credential parameters which is very useful.
    In your case it will look like:

     pipeline {
         agent any
         environment {
             BASE_PATH = 'C:/Users/roger/project/'
         }
         stages {
             stage('Stage1') {
                 steps {
                     // Using the parameter as a runtime environment variable with bat syntax %%
                     bat  '''
                         cd %BASE_PATH%
                         python -u script1.py
                     '''
                 }
             }
             stage('Stage2') {
                 steps {
                     // Using groovy string interpolation to construct the command with the parameter value
                     bat  """
                         cd ${env.BASE_PATH}abc/
                         python -u script2.py
                     """
                 }
             }
         }
     }
    

    Another option you have is to use global variables defined at the top section of the pipeline, which will behave like any groovy variable and will be available for all stages in your pipeline (but not for the execution environment of interpreter steps).
    Something like:

     BASE_PATH = 'C:/Users/roger/project/'
    
     pipeline {
         agent any
         stages {
             stage('Stage1') {
                 steps {
                     // Using the parameter insdie a dir step to change directory 
                     dir(BASE_PATH) {
                         bat 'python -u script1.py'
                     }
                 }
             }
             stage('Stage2') {
                 steps {
                     // Using groovy string interpolation to construct the command with the parameter value
                     bat  """
                         cd ${BASE_PATH}abc/
                         python -u script2.py
                     """
                 }
             }
         }
     }