【问题标题】:Using Jenkins Environment Variable in Pipeline SH script在管道 SH 脚本中使用 Jenkins 环境变量
【发布时间】:2019-09-24 03:46:48
【问题描述】:

我找不到在 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
        }
    }
}

【问题讨论】:

  • 您正在尝试打印内部版本号?

标签: jenkins environment-variables jenkins-pipeline sh


【解决方案1】:

基本解决方案:将 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

【讨论】:

    【解决方案2】:

    可能有一种更惯用的方法(如果您知道请分享),但如果您首先在 environment 块中定义它,它就会起作用。比如:

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

    code maven 上有一篇很好的帖子,其中包含有用的示例。

    【讨论】:

      【解决方案3】:

      这是一个对我有用的简单示例。詹金斯 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
      • 试试最后一个例子,虽然我的 withCredentials 块与你的不完全一样,但它确实对我有用。
      • 您的答案看起来与问题代码完全相同,您只是说它在较新版本的 jenkins 中有效吗?或者您能否在描述中具体解释差异和解决方案,因为我无法理解如何解决问题。
      • @justin.m.chase - 您只是想从 Jenkins 作业调用的 shell 脚本中引用 Jenkins 作业内部版本号变量?只需将其作为 shell 脚本中的变量引用即可。我所做的只是发布对我有用的简单示例,以提供帮助。我刚刚尝试了第一个示例(我在上面编写的前两个代码块),这是一个由管道作业调用的外部 shell 脚本,它可以工作。
      • 它也适用于我,虚惊一场。我在代码中遇到了另一个问题,它在此过程中意外重置了 var,它看起来好像没有设置 env var。
      猜你喜欢
      • 2021-12-14
      • 2021-12-17
      • 2017-08-09
      • 2018-10-02
      • 2015-04-30
      • 1970-01-01
      • 2022-08-22
      • 1970-01-01
      • 2021-06-06
      相关资源
      最近更新 更多