如何在其他阶段使用Jenkins Pipeline全局变量?

时间:2019-09-25 13:09:28

标签: jenkins jenkins-pipeline sh jenkins-groovy

我在Jenkins管道中定义了全局变量

def BUILDNRO = '0'
pipeline { ...

然后我使用shell脚本操纵变量,以通过使用作业内部版本号作为标识符来并行运行内部版本,因​​此我们不会混合使用不同的docker群。

    stage('Handle BUILD_NUMBER') {
        steps {
            script {
            BUILDNRO = sh( script: '''#!/bin/bash
            Build=`echo ${BUILD_NUMBER} | grep -o '..$'`
            # Check if BUILD first character is 0
            if [[ $Build:0:1 == "0" ]]; then
                # replace BUILD first character from 0 to 5
                Build=`echo $Build | sed s/./5/1`
            fi
            echo $Build
            ''',returnStdout: true).trim()
            }
        }
    }

我从previos阶段获得了价值,并试图在下一阶段获得全局变量

    stage('DOCKER: Init docker swarm') {
        steps {
            echo "BUILDNRO is: ${BUILDNRO}"  --> Value is here.
            sh '''#!/bin/bash
            echo Buildnro is: ${BUILDNRO}   --> This is empty.
            ...
        }
    }

这将使全局变量为空。为什么?在前一阶段,它具有价值。

编辑1。 修改后的代码块可以反映当前状态。

2 个答案:

答案 0 :(得分:0)

如果在shell模块中使用单引号(```),则Jenkins将每个变量都视为bash变量。解决方案是使用双引号(“”“),但是如果您将bash变量制成,则必须对其进行转义。在下面的示例中,您使用了用例并转义了bash变量

pipeline {
    agent any
    stages {
        stage('Handle BUILD_NUMBER') {
            steps {
                script {
                    BUILDNRO = sh(script: 'pwd', returnStdout: true).trim()
                    echo "BUILDNRO is: ${BUILDNRO}"
                }
            }
        }
        stage('DOCKER: Init docker swarm') {
            steps {
                sh """#!/bin/bash
            echo Buildnro is: ${BUILDNRO}
            variable=world
            echo "hello \${variable}"
            sh """
            }
        }

    }
}

第二阶段的输出:

Buildnro is: /var/lib/jenkins/workspace/stack1
hello world

答案 1 :(得分:0)

我设法弄清楚了。这是我如何做到的解决方案。 BUILDNRO是常规变量,如果要在bash变量中使用,则必须使用withEnv传递。第一阶段的BUILD_NUMBER是bash变量,因此可以在第一阶段直接使用脚本。

def BUILDNRO = '0'

pipeline {
  ....
  stages {
    stage('Handle BUILD_NUMBER') {
      steps {
        script {
          BUILDNRO = sh( script: '''#!/bin/bash
          Build=`echo ${BUILD_NUMBER} | grep -o '..$'`
          ''',returnStdout: true).trim()
        }
      }
    }
    stage('DOCKER: Init docker swarm') {
      steps {
        dir("prose_env/prose_api_dev_env") {
          withEnv(["MYNRO=${BUILDNRO}"]) {
            sh(returnStdout: false, script: '''#!/bin/bash
            echo Buildnro is: ${MYNRO}`
            '''.stripIndent())
          }
        }
      }     
    }
  }
}