Skip to content

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

@jenkins-infra-bot

Description

@jenkins-infra-bot

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 = [:] <span class="code-comment">//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]}"
}
}
}
}
}
}


Originally reported by rpocase, imported from: Allow variables and functions to be defined within pipeline to be used in any stage
  • assignee: abayer
  • status: Closed
  • priority: Critical
  • component(s): pipeline-model-definition-plugin
  • resolution: Won't Fix
  • resolved: 2018-04-12T15:59:31+00:00
  • votes: 43
  • watchers: 57
  • imported: 2025-12-06
Raw content of original issue

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 = [:] <span class="code-comment">//empty map

def my_list //undefined shared variable
}

stages {
    stage(<span class="code-quote">'stage1'</span>) {
      steps {
        script {
          <span class="code-comment">//If def can be anywhere in pipeline {}, drop script {}

my_list = [1,2,3]
}
}
}

    stage(<span class="code-quote">'stage2'</span>) {
      steps {
        script {
            <span class="code-keyword">for</span>(<span class="code-object">int</span> i=0; i&lt;my_list.size();i++) {
                echo <span class="code-quote">"Doing something with ${my_list[i]}"</span>
            }
        }
      }
    }
}

}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions