Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-41335

Allow variables and functions to be defined within pipeline to be used in any stage

      I have several use cases where I may operate on a list or map on different stages of a pipeline. This variable may not be known ahead of time - it could be defined within a stage. I'd like a syntax that allows me to define variables within a pipeline.

      Today, I have to define a shared variable before entering pipeline {}.

      Jenkinsfile
      #!/bin/groovy
      // Define outside of pipeline to make sure accessible in all script {} blocks
      def my_list
      
      pipeline {
          agent { label 'label' }
          stages {
              stage('stage1') {
                steps {
                 script {
                     my_list = [1,2,3]
                 }
                }
              }
          
              stage('stage2') {
                steps {
                  script {
                      for(int i=0; i<my_list.size();i++) {
                          echo "Doing something with ${my_list[i]}"
                      }
                  }
                }
              }
          }
      }
      

      A simple approach would be to allow "def" to work anywhere within pipeline {}. This avoids any overly new syntax for pipeline.

      Another option would allow the user to provide a special pipeline {} block for defining non-env/params style variables. This could be helpful in allowing the user to use items available in script {} for defining shared state.

      Jenkinsfile with possible example syntax
      #!/bin/groovy
      
      
      pipeline {
          agent { label 'label' }    
      
          define {
             def my_map = [:] //empty map
             def my_list //undefined shared variable
           }
      
          stages {
              stage('stage1') {
                steps {
                  script {
                    //If def can be anywhere in pipeline {}, drop script {}
                    my_list = [1,2,3]
                  }
                }
              }
          
              stage('stage2') {
                steps {
                  script {
                      for(int i=0; i<my_list.size();i++) {
                          echo "Doing something with ${my_list[i]}"
                      }
                  }
                }
              }
          }
      }
      

          [JENKINS-41335] Allow variables and functions to be defined within pipeline to be used in any stage

          Robby Pocase created issue -
          Liam Newman made changes -
          Link New: This issue relates to JENKINS-41396 [ JENKINS-41396 ]
          Andrew Bayer made changes -
          Summary Original: Allow variable to be defined within pipeline to be used in any stage New: Allow variables and functions to be defined within pipeline to be used in any stage
          Andrew Bayer made changes -
          Link New: This issue is duplicated by JENKINS-41396 [ JENKINS-41396 ]
          Andrew Bayer made changes -
          Priority Original: Minor [ 4 ] New: Critical [ 2 ]
          Andrew Bayer made changes -
          Link New: This issue is blocked by JENKINS-39450 [ JENKINS-39450 ]
          Andrew Bayer made changes -
          Link Original: This issue is duplicated by JENKINS-41396 [ JENKINS-41396 ]
          Liam Newman made changes -
          Link New: This issue relates to JENKINS-42079 [ JENKINS-42079 ]
          Liam Newman made changes -
          Link New: This issue relates to JENKINS-42360 [ JENKINS-42360 ]
          James Dumay made changes -
          Epic Link New: JENKINS-45422 [ 183590 ]
          Christophe Carpentier made changes -
          Attachment New: screenshot-1.png [ 38956 ]

            abayer Andrew Bayer
            rpocase Robby Pocase
            Votes:
            43 Vote for this issue
            Watchers:
            57 Start watching this issue

              Created:
              Updated:
              Resolved: