【问题标题】:Jenkins pass value calculated in stage to shell scriptJenkins将阶段计算的值传递给shell脚本
【发布时间】:2018-06-09 07:14:26
【问题描述】:

我正在尝试通过 Jenkins 声明性管道将提交消息连接字符串传递给 shell 脚本。我可以得到连接的字符串,但我不知道如何将它传递给我的 shell 脚本。环境变量在我的 shell 脚本中是可读的,但我不能在我的阶段之外设置环境变量,因为我定义了我的 git 连接,如果我在阶段中设置它,它不会更新我调用的环境变量在我的帖子部分。如何将 changeString 的值传递给我的 bash 脚本(成功)?

pipeline { 
    agent any 
    environment {
        CHANGE_STRING = 'Initial default value.'
    }
    stages {
        stage('Build') { 
            environment {
                CHANGE_STRING = 'This change is only available in this stage and not in my shell script'
            } 
            steps { 
                echo 'Build stage'
                git branch: 'develop',
                credentialsId: 'blah',
                url: 'blah.git'
                sh """ 
                npm install
                """ 
                script{                   
                    MAX_MSG_LEN = 100
                    def changeString = ""

                    def changeLogSets = currentBuild.changeSets
                    for (int i = 0; i < changeLogSets.size(); i++) {
                        def entries = changeLogSets[i].items
                        for (int j = 0; j < entries.length; j++) {
                            def entry = entries[j]
                            truncated_msg = entry.msg.take(MAX_MSG_LEN)
                            changeString += " - ${truncated_msg} [${entry.author}]\n"
                        }
                    }

                    if (!changeString) {
                        changeString = " - No new changes"
                    }
                    //I would like to set CHANGE_STRING here
                }
            }
        }
    }
    post {
        success {
            echo 'Successfull build'
            sh """ 
            bash /var/lib/jenkins/jobs/my-project/hooks/onsuccess
            """ 
        }
    }
}

【问题讨论】:

    标签: jenkins groovy jenkins-pipeline


    【解决方案1】:

    如果您想从script 步骤导出环境变量并在当前阶段之外访问它,您必须使用未在全局或本地environment {} 块中指定的变量名称。考虑以下示例:

    pipeline { 
        agent any 
        environment {
            IMMUTABLE_VARIABLE = 'my value'
        }
        stages {
            stage('Build') { 
                steps { 
                    script{                   
                        def random = new Random()
                        if (random.nextInt(2) == 1) {
                            env.CHANGE_STRING = "Lorem ipsum dolor sit amet"
                        } else {
                            env.CHANGE_STRING = "Foo Bar"
                        }
    
                        env.IMMUTABLE_VARIABLE = 'a new value'
    
                        echo "IMMUTABLE_VARIABLE = ${env.IMMUTABLE_VARIABLE}"
                    }
                }
            }
        }
        post {
            success {
                echo 'Successfull build'
                sh '''
                echo $CHANGE_STRING
                echo "IMMUTABLE_VARIABLE = $IMMUTABLE_VARIABLE"
                '''
            }
        }
    }
    

    这只是您的管道脚本的简化。当我运行它时,我看到以下控制台输出:

    [Pipeline] node
    Running on Jenkins in /var/jenkins_home/workspace/test-pipeline
    [Pipeline] {
    [Pipeline] withEnv
    [Pipeline] {
    [Pipeline] stage
    [Pipeline] { (Build)
    [Pipeline] script
    [Pipeline] {
    [Pipeline] echo
    IMMUTABLE_VARIABLE = my value
    [Pipeline] }
    [Pipeline] // script
    [Pipeline] }
    [Pipeline] // stage
    [Pipeline] stage
    [Pipeline] { (Declarative: Post Actions)
    [Pipeline] echo
    Successfull build
    [Pipeline] sh
    [test-pipeline] Running shell script
    + echo Foo Bar
    Foo Bar
    + echo IMMUTABLE_VARIABLE = my value
    IMMUTABLE_VARIABLE = my value
    [Pipeline] }
    [Pipeline] // stage
    [Pipeline] }
    [Pipeline] // withEnv
    [Pipeline] }
    [Pipeline] // node
    [Pipeline] End of Pipeline
    Finished: SUCCESS
    

    post success 块中的 shell 脚本在第一行打印Foo Bar,在第二行打印IMMUTABLE_VARIABLE = my value。另请注意,即使我已明确尝试覆盖

    env.IMMUTABLE_VARIABLE = 'a new value'
    

    它没有产生任何影响,当我这样做时

    echo "IMMUTABLE_VARIABLE = ${env.IMMUTABLE_VARIABLE}"
    

    它只是回显了来自environment {} 块的初始值:

    IMMUTABLE_VARIABLE = my value
    

    希望对你有帮助。

    【讨论】:

    • 完美,帮助并解释了更多相关项目。我测试并得到了完全相同的结果,现在可以完成我的管道工作流程,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 2015-09-09
    • 2021-01-11
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多