在Jenkins阶段之间传递变量

时间:2017-11-23 19:49:55

标签: jenkins jenkins-pipeline

我想以某种方式将我在A阶段读到的变量传递给B阶段。我在一些例子中看到人们把它写到文件中,但我想这不是一个很好的解决方案。我尝试将它写入环境变量,但我并没有真正成功。如何正确设置?

为了让它工作,我尝试了很多东西并且读到我应该使用“”而不是'''来启动shell并将这些变量转义为\${foo}

以下是我作为管道的内容:

#!/usr/bin/env groovy

pipeline {

    agent { node { label 'php71' } }

    environment {
        packageName='my-package'
        packageVersion=''
        groupId='vznl'
        nexus_endpoint='http://nexus.devtools.io'
        nexus_username='jenkins'
        nexus_password='J3nkins'
    }

    stages{

        // Package dependencies
        stage('Install dependencies') {
            steps {
                sh '''
                    echo Skip composer installation
                    #composer install  --prefer-dist --optimize-autoloader --no-interaction
                '''
            }
        }

        // Unit tests
        stage('Unit Tests') {
            steps {
                sh '''
                    echo Running PHP code coverage tests...
                    #composer test
                '''
            }
        }

        // Create artifact
        stage('Package') {
            steps {
                echo 'Create package refs'
                sh """
                    mkdir -p ./build/zpk
                    VERSIONTAG=\$(grep 'version' composer.json)
                    REGEX='"version": "([0-9]+.[0-9]+.[0-9]+)"'
                    if [[ \${VERSIONTAG} =~ \${REGEX} ]]
                    then
                        env.packageVersion=\${BASH_REMATCH[1]}
                        /usr/bin/zs-client packZpk --folder=. --destination=./build/zpk --name=${env.packageName}-${env.packageVersion}.zpk --version=${env.packageVersion}
                    else
                        echo "No version found!"
                        exit 1
                    fi
                """
            }
        }

        // Publish ZPK package to Nexus
        stage('Publish packages') {
            steps {
                echo "Publish ZPK Package"
                sh "curl -u ${env.nexus_username}:${env.nexus_password} --upload-file ./build/zpk/${env.packageName}-${env.packageVersion}.zpk ${env.nexus_endpoint}/repository/zpk-packages/${groupId}/${env.packageName}-${env.packageVersion}.zpk"
                archive includes: './build/**/*.{zpk,rpm,deb}'
            }
        }
    }
}

正如您所看到的,我从舞台 Package 中读取的packageVersion也需要在发布阶段使用。

对管道的总体提示当然也欢迎。

2 个答案:

答案 0 :(得分:14)

您的代码中的一个问题是您在sh步骤中分配了环境变量的版本。此步骤将在其自己的独立进程中执行,继承父进程环境变量。

但是,将数据传递回父级的唯一方法是通过STDOUT/STDERR或退出代码。如果您需要字符串值,最好从sh步骤回显版本并将其分配给script上下文中的变量。

如果重用该节点,脚本上下文将保持不变,并且变量将在后续阶段中可用。下面是一个工作示例。请注意,任何尝试将其置于parallel块中都可能失败,因为版本信息变量可以由多个进程写入。

#!/usr/bin/env groovy

pipeline {

    environment {
        AGENT_INFO = ''
    }

    agent {
        docker {
            image 'alpine'
            reuseNode true
        }
    }

    stages {

        stage('Collect agent info'){
            steps {
                echo "Current agent  info: ${env.AGENT_INFO}"
                script {
                    def agentInfo = sh script:'uname -a', returnStdout: true
                    println "Agent info within script: ${agentInfo}"
                    AGENT_INFO = agentInfo.replace("/n", "")
                    env.AGENT_INFO = AGENT_INFO
                }
            }
        }

        stage("Print agent info"){
            steps {
                script {
                    echo "Collected agent info: ${AGENT_INFO}"
                    echo "Environment agent info: ${env.AGENT_INFO}"
                }
            }
        }
    }
}

答案 1 :(得分:3)

另一个不涉及使用script而是声明性的选项是将内容存储在一个小的临时环境文件中。

然后,如果根据需要跨并行或分布式节点喷射工作负载,则可以使用此存储(例如仅用于运行的临时缓存)。

类似的东西:

pipeline {
    agent any

    stages {
        stage('first stage') {
            steps {
                // Write out any environment variables you like to a temporary file
                sh 'echo export FOO=baz > myenv'

                // Stash away for later use
                stash 'myenv'
            }
        }

        stage ("later stage") {
            steps {

                // Unstash the temporary file and apply it
                unstash 'myenv'
                sh 'source ./myenv'

                // Now continue on with variables set
                sh 'echo $FOO'
            }
        }
    }
}