在管道SH脚本中使用Jenkins环境变量

8

我没有找到在sh脚本中使用Jenkins提供的BUILD_NUMBER的方法。 我已经阅读了一些类似问题的答案,但没有什么帮助。

node {
    echo "Build number 1 $BUILD_NUMBER"
    // output ok

    stage('stage1') {
        echo "Build number 2 $BUILD_NUMBER"
        // output ok

        def BUILD_NUMBER = "$BUILD_NUMBER"

        withCredentials([sshUserPrivateKey(credentialsId: 'github-rsa-key', variable: 'RSAKEY')]) {
            echo "Build number 3 " + BUILD_NUMBER
            // output ok

            echo "Build number 4 $BUILD_NUMBER"
            // output ok

            // -----------------

            sh 'echo $BUILD_NUMBER' // NullPointer
            sh "echo $BUILD_NUMBER" // NullPointer
            sh "echo \$BUILD_NUMBER" // NullPointer
            sh "echo BUILD_NUMBER" // NullPointer
            withEnv(["BUILD_NUMBER=BUILD_NUMBER"]) {
                sh "echo $BUILD_NUMBER" // NullPointer!!
            }
            env.BUILD_NUMER = "$BUILD_NUMBER"
            sh "echo $BUILD_NUMBER" // NullPointer
            sh "echo ${env.BUILD_NUMBER}" // NullPointer
        }
    }
}

你正试图打印构建号码吗? - mbn217
3个回答

7

基本解决方案: 将shell脚本包装在"""块中

node {
    echo "Build number 1: $BUILD_NUMBER"
    // output ok

    stage('stage1') {
        echo "Build number 2: $BUILD_NUMBER"
        // output ok

        def BUILD_NUMBER = "$BUILD_NUMBER"


            echo "Build number 3: " + BUILD_NUMBER
            // output ok

            echo "Build number 4: $BUILD_NUMBER"
            // output ok

            // -----------------

        sh 'printenv'

        sh """ 
            echo "Build number in sh script: ${env.BUILD_NUMBER}"
            echo "Job base name: ${env.JOB_BASE_NAME}"
        """
        // output ok
    }
}

控制台输出:

Running on Jenkins in /var/lib/jenkins/workspace/test-infra-env
[Pipeline] {
[Pipeline] echo
Build number 1: 5
[Pipeline] stage
[Pipeline] { (stage1)
[Pipeline] echo
Build number 2: 5
[Pipeline] echo
Build number 3: 5
[Pipeline] echo
Build number 4: 5
[Pipeline] sh
+ printenv
JENKINS_HOME=/var/lib/jenkins
MAIL=/var/mail/jenkins
USER=jenkins
...
...
JOB_BASE_NAME=test-infra-env
BUILD_NUMBER=5
...
...
[Pipeline] sh
+ echo Build number in sh script: 5
Build number in sh script: 5
+ echo Job base name: test-infra-env
Job base name: test-infra-env
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

4

可能有更符合习惯的方法(如果您知道,请分享),但是如果您首先在环境块中定义它,它就可以工作。例如:

stage('Show Build Number') {
  environment {
    BUILD_NUMBER = "${env.BUILD_NUMBER}"
  }
  steps {
    sh '''
      echo "This is build $BUILD_NUMBER"
    '''
  }
}

Code Maven 上有一篇很好的文章,提供了有用的例子。


2
这是一个对我有效的简单示例。 Jenkins 2.164.2
编辑以添加物理脚本:/tmp/script.sh 包含...
#!/bin/bash

echo "Script: - Build number: $BUILD_NUMBER"

"Jenkins工作"
node {
    echo "Node: Build number: $BUILD_NUMBER"

    stage('stage1') {
        echo "Stage: Build number: $BUILD_NUMBER"

        sh ("echo Shell: Build number: $BUILD_NUMBER")

        sh ("/tmp/script.sh")
    }
}

这个例子使用了一个 "withCredentials" 块。请注意单引号,参考链接在这里 - https://jenkins.io/doc/pipeline/steps/credentials-binding/
node {
    echo "Build number 1 $BUILD_NUMBER"
    // output ok

    stage('stage1') {
        withCredentials([string(credentialsId: 'my_password', variable: 'TOKEN')]) {
            sh '''
               echo "Shell: Build number: $BUILD_NUMBER"
            '''
            sh ('/tmp/script.sh')
        }
    }
}

尝试在 withCredentials() 块中执行此操作将导致 groovy.lang.MissingPropertyException: No such property: BUILD_NUMBER for class: groovy.lang.Binding - alex
尝试最后一个例子,虽然我的withCredentials代码块不完全像你的,但它对我起作用了。 - Adam vonNieda
你的回答看起来和问题代码完全一样,你是不是只是说它在新版本的Jenkins中可以正常工作?还是能否在描述中具体解释差异和解决方案,因为现在我无法理解如何解决这个问题。 - justin.m.chase
@justin.m.chase - 你只是想从 Jenkins 作业中调用的 shell 脚本中引用 Jenkins 作业构建编号变量吗?只需在 shell 脚本中将其作为变量引用即可。我所做的只是发布对我有用的简单示例,以便提供帮助。我刚刚尝试了第一个示例(我上面写的前两个代码块),它是由管道作业调用的外部 shell 脚本,并且可以正常工作。 - Adam vonNieda
1
这对我也起作用了,虚惊一场。在代码中我还有另一个问题,它在过程中意外重置了变量,使得环境变量似乎没有设置。 - justin.m.chase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接