在詹金斯管道中使用全局变量

use*_*418 11 groovy jenkins jenkins-pipeline

我尝试了各种方式,但似乎没有任何效果。这是我的詹金文件。

def ZIP_NODE
def CODE_VERSION
pipeline{
    /*A declarative pipeline*/

    agent {
        /*Agent section*/ 
        // where would you like to run the code 
        label 'ubuntu' 
        }
    options{
        timestamps()
        }
    parameters {
        choice(choices: ['dev'], description: 'Name of the environment', name: 'ENV')
        choice(choices: ['us-east-1', 'us-west-1','us-west-2','us-east-2','ap-south-1'], description: 'What AWS region?', name: 'AWS_DEFAULT_REGION')
        string(defaultValue: "", description: '', name: 'APP_VERSION')

        }
    stages{
        /*stages section*/
        stage('Initialize the variables') {
            // Each stage is made up of steps
            steps{
                script{
                    CODE_VERSION='${BUILD_NUMBER}-${ENV}'
                    ZIP_NODE='abcdefgh-0.0.${CODE_VERSION}.zip'
                }
            }                
        }
        stage ('code - Checkout') {
            steps{
                checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'xxxxxxxxxxxxxxxxxxxxxxxxxx', url: 'http://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.git']]]) 
            }  
        }

        stage ('code - Build'){
            steps{
                sh ''' 
                    echo ${JOB_NAME}
                    pwd
                    echo ${ZIP_NODE}
                    echo 'remove alraedy existing zip files'
                    rm -rf *.zip
                    zip -r ${ZIP_NODE} . 
                    chmod 777 $ZIP_NODE 
                ''' 
            }
        }
        stage('Deploy on Beanstalk'){
            steps{
                build job: 'abcdefgh-PHASER' , parameters: [[$class: 'StringParameterValue', name: 'vpc', value: ENV], [$class: 'StringParameterValue', name: 'ZIP_NODE', value: ZIP_NODE], [$class: 'StringParameterValue', name: 'CODE_VERSION', value: CODE_VERSION], [$class: 'StringParameterValue', name: 'APP_VERSION', value: BUILD_NUMBER], [$class: 'StringParameterValue', name: 'AWS_DEFAULT_REGION', value: AWS_DEFAULT_REGION], [$class: 'StringParameterValue', name: 'ParentJobName', value: JOB_NAME]]
            }
        }
    } 

}
Run Code Online (Sandbox Code Playgroud)

阶段脚本的输出(“初始化变量”)没有任何作用,它没有设置全局变量ZIP_NODE的值:

[Pipeline] stage
[Pipeline] { (Initialize the variables)
[Pipeline] script
[Pipeline] {
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
Run Code Online (Sandbox Code Playgroud)

然后我们进入阶段(代码-Build),我们没有得到ZIP_NODE的值。请参阅22:34:17的echo声明

[Pipeline] stage
[Pipeline] { (code - Build)
[Pipeline] sh
22:34:16 [abcdefgh-ci-dev-pipeline] Running shell script
22:34:17 + echo abcdefgh-ci-dev-pipeline
22:34:17 abcdefgh-ci-dev-pipeline
22:34:17 + pwd
22:34:17 /home/advisor/Jenkins/workspace/abcdefgh-ci-dev-pipeline
22:34:17 + echo
22:34:17 
22:34:17 + echo remove alraedy existing zip files
Run Code Online (Sandbox Code Playgroud)

感谢@awefsome,我有一些观察,我想补充一下细节:当我使用下面的代码时,我得到了想要的输出,即ZIP_NODE的正确值:

 stage ('code - Build'){
            steps{
                sh "echo ${JOB_NAME} && pwd && echo ${ZIP_NODE} && echo 'remove alraedy existing zip files' && rm -rf *.zip && zip -r ${ZIP_NODE} . && chmod 777 $ZIP_NODE"
            }
        }
Run Code Online (Sandbox Code Playgroud)

但是当我使用下面的代码时,我没有得到ZIP_NODE的值:

stage ('code - Build'){
            steps{

                sh ''' 
                        echo ${ZIP_NODE}
                        echo ${JOB_NAME}
                        pwd
                        echo ${ZIP_NODE}
                        echo ${CODE_VERSION}
                        #rm -rf .ebextensions
                        echo 'remove alraedy existing zip files'
                        rm -rf *.zip
                        zip -r ${ZIP_NODE} . 
                        chmod 777 $ZIP_NODE 
                    '''
            }
        }
Run Code Online (Sandbox Code Playgroud)

Sim*_*mon 13

sh '''
'''
Run Code Online (Sandbox Code Playgroud)

应该

sh """
"""
Run Code Online (Sandbox Code Playgroud)

用单引号引起的变量不会被处理。


avi*_*amg 7

jenkins 上的全局环境应该在管道之外,可以在脚本内初始化/使用,当然管道内的所有范围都知道:

例子

def internal_ip

pipeline {
    agent { node { label "test" } }
        stages {
            stage('init') {
                steps {
                    script {
                        def x
                        if(env.onHold.toBoolean() == true){
                            x=1
                        }else{
                            x=2
                        }
                        internal_ip = sh (
                            script: "echo 192.168.0.${x}",
                            returnStdout: true
                        ).trim()   
                    }
                }
            }
            stage('test') {
                steps {
                    script {
                        echo  "my internal ip is: ${internal_ip}"
                    }
                }
            }
        }    
    }
}
Run Code Online (Sandbox Code Playgroud)


Ger*_*ica 7

除了@ avivamg答案之外,这是正确的。

剩下的一个问题是,如果您想要访问 Jenkins 的环境变量(请参阅 参考资料http://<JENKINS_URL>/env-vars.html/)来初始化这些全局变量,例如:

def workspaceDir=${WORKSPACE}
Run Code Online (Sandbox Code Playgroud)

你得到:

groovy.lang.MissingPropertyException: No such property: WORKSPACE for class: groovy.lang.Binding
Run Code Online (Sandbox Code Playgroud)

的想法:

def workspaceDir

pipeline {
    
    environment {
        workspaceDir=${WORKSPACE}
    }

    stages {
        stage('Globals test') {
            steps {
                script {
                   echo "workspaceDir=${workspaceDir}"
                   echo workspaceDir
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

导致输出:

workspaceDir=null
null
Run Code Online (Sandbox Code Playgroud)

因为涉及两个不同的上下文:环境Groovy,它们显然是相互独立的。

它适用于:

environment {
    workspaceDir=${WORKSPACE}
}
Run Code Online (Sandbox Code Playgroud)

但这是一个环境变量,而不是 Groovy 上下文中的变量。

在 Groovy 上下文中的声明和初始化通过阶段进行:

def workspaceDir

pipeline {

    stages {
        stage('Initializing globals') {
            steps {
                script {
                    workspaceDir = "${WORKSPACE}"
                }
            }
        }

        stage('Globals test') {
            steps {
                script {
                   echo "workspaceDir=${workspaceDir}"
                   echo workspaceDir
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

workspaceDir=C:\Users\jenkins\AppData\Local\Jenkins\.jenkins\workspace\Globals-test-project
C:\Users\jenkins\AppData\Local\Jenkins\.jenkins\workspace\Globals-test-project
Run Code Online (Sandbox Code Playgroud)


awe*_*ome 6

尝试遵循并查看进展情况:

def ZIP_NODE
def CODE_VERSION
pipeline{
    /*A declarative pipeline*/

    agent {
        /*Agent section*/ 
        // where would you like to run the code 
        label 'master' 
        }
    options{
        timestamps()
        }
    parameters {
        choice(choices: ['dev'], description: 'Name of the environment', name: 'ENV')
        choice(choices: ['us-east-1', 'us-west-1','us-west-2','us-east-2','ap-south-1'], description: 'What AWS region?', name: 'AWS_DEFAULT_REGION')
        string(defaultValue: "", description: '', name: 'APP_VERSION')

        }
    stages{
        /*stages section*/
        stage('Initialize the variables') {
            // Each stage is made up of steps
            steps{
                script{
                    CODE_VERSION="${BUILD_NUMBER}-${ENV}"
                    ZIP_NODE="abcdefgh-0.0.${CODE_VERSION}.zip"
                }
            }                
        }
        stage ('code - Checkout') {
            steps{
                println "checkout skipped"
                //checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'xxxxxxxxxxxxxxxxxxxxxxxxxx', url: 'http://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.git']]]) 
            }  
        }

        stage ('code - Build'){
            steps{
                sh "echo ${JOB_NAME} && pwd && echo ${ZIP_NODE} && echo 'remove alraedy existing zip files' && rm -rf *.zip && zip -r ${ZIP_NODE} . && chmod 777 $ZIP_NODE"
            }
        }
        stage('Deploy on Beanstalk'){
            steps{
                println "build job skipped"
                //build job: 'abcdefgh-PHASER' , parameters: [[$class: 'StringParameterValue', name: 'vpc', value: ENV], [$class: 'StringParameterValue', name: 'ZIP_NODE', value: ZIP_NODE], [$class: 'StringParameterValue', name: 'CODE_VERSION', value: CODE_VERSION], [$class: 'StringParameterValue', name: 'APP_VERSION', value: BUILD_NUMBER], [$class: 'StringParameterValue', name: 'AWS_DEFAULT_REGION', value: AWS_DEFAULT_REGION], [$class: 'StringParameterValue', name: 'ParentJobName', value: JOB_NAME]]
            }
        }
    } 
}
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

Started by user jenkins
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] node
Running on Jenkins in /Users/Shared/Jenkins/Home/workspace/test
[Pipeline] {
[Pipeline] timestamps
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Initialize the variables)
[Pipeline] script
[Pipeline] {
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (code - Checkout)
[Pipeline] echo
21:19:06 checkout skipped
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (code - Build)
[Pipeline] sh
21:19:06 [test] Running shell script
21:19:06 + echo test
21:19:06 test
21:19:06 + pwd
21:19:06 /Users/Shared/Jenkins/Home/workspace/test
21:19:06 + echo abcdefgh-0.0.17-dev.zip
21:19:06 abcdefgh-0.0.17-dev.zip
21:19:06 + echo 'remove alraedy existing zip files'
21:19:06 remove alraedy existing zip files
21:19:06 + rm -rf '*.zip'
21:19:06 + zip -r abcdefgh-0.0.17-dev.zip .
21:19:06 
21:19:06 zip error: Nothing to do! (try: zip -r abcdefgh-0.0.17-dev.zip . -i .)
[Pipeline] }
[Pipeline] // stage
Run Code Online (Sandbox Code Playgroud)