如何在另一个阶段使用 Jenkins Pipeline 全局变量?

Jug*_*uge 3 sh jenkins jenkins-groovy jenkins-pipeline

我已经在 J​​enkins 管道中定义了全局变量

def BUILDNRO = '0'
pipeline { ...
Run Code Online (Sandbox Code Playgroud)

然后,我使用 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()
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我从上一个阶段获取价值并尝试在下一阶段获取全局变量

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

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

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

Jug*_*uge 5

我设法弄清楚了。这是我如何做到的解决方案。BUILDNRO 是 groovy 变量,如果想在 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())
          }
        }
      }     
    }
  }
}
Run Code Online (Sandbox Code Playgroud)