我在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。 修改后的代码块可以反映当前状态。
答案 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())
}
}
}
}
}
}