在 Jenkins 管道的 shell 步骤中访问 Groovy 变量
Access a Groovy variable within shell step in Jenkins pipeline
SSHUER
in stage one
按要求打印。但是在 stage two
它不打印并给了我一个空值。 stage two
中的所有三个尝试语句均无效。我不能使用脚本块,因为我在实际代码中有一些特殊字符。关于如何在 stage two
.
中获取 SSHUSER 值的任何建议
def SSHUSER
environment {
if(params.CLOUD == 'google') {
SSHUSER = "test1"
} else if (params.CLOUD == 'azure') {
SSHUSER = "test2"
}
}
pipeline {
stage('stage one') {
steps {
echo "first attempt '${SSHUSER}'"
}
}
stage('stage two') {
steps {
sh '''#!/bin/bash
echo "first attempt '${SSHUSER}'"
echo "second attempt ${SSHUSER}"
echo "thrid attempt $SSHUSER"
if ssh ${SSHUSER}@$i 'test -e /tmp/test'";
then
echo "$i file exists "
fi
'''
}
}
}
你对 environment
块的用法有点奇怪,它应该位于 pipeline
块内,变量应该在 environment
块内初始化。
如果在外部定义,变量将不会作为环境变量传递给 shell 脚本。
如果你想在“管道”块中使用 environment
块,只需定义你想要的参数(作为字符串),它们将可用于所有阶段,它们将作为环境变量传递对于 shell.
例如:
pipeline {
agent any
parameters{
string(name: 'CLOUD', defaultValue: 'google', description: '')
}
environment {
SSHUSER = "${params.CLOUD == 'google' ? 'test1' : 'test2'}"
}
stages {
stage('stage one') {
steps {
echo "first attempt '${SSHUSER}'"
}
}
stage('stage two') {
steps {
sh '''#!/bin/bash
echo "first attempt '${SSHUSER}'"
echo "second attempt ${SSHUSER}"
echo "thrid attempt $SSHUSER"
if ssh ${SSHUSER}@$i 'test -e /tmp/test'";
then
echo "$i file exists "
fi
'''
}
}
}
}
如果您不想使用 environment
块或自己管理参数,您可以在 pipeline
块之外使用全局变量进行操作,但它们不会被传递给环境变量在将命令传递给 shell:
时,您需要使用字符串插值("""
而不是 '''
)来计算值
SSHUSER = ''
if(params.CLOUD == 'google') {
SSHUSER = "test1"
} else if (params.CLOUD == 'azure') {
SSHUSER = "test2"
}
pipeline {
agent any
parameters{
string(name: 'CLOUD', defaultValue: 'google', description: 'Bitbucket Payload', trim: true)
}
stages {
stage('stage one') {
steps {
echo "first attempt '${SSHUSER}'"
}
}
stage('stage two') {
steps {
sh """#!/bin/bash
echo "first attempt '${SSHUSER}'"
echo "second attempt ${SSHUSER}"
echo "thrid attempt $SSHUSER"
if ssh ${SSHUSER}@$i 'test -e /tmp/test'";
then
echo "$i file exists "
fi
"""
}
}
}
}
SSHUER
in stage one
按要求打印。但是在 stage two
它不打印并给了我一个空值。 stage two
中的所有三个尝试语句均无效。我不能使用脚本块,因为我在实际代码中有一些特殊字符。关于如何在 stage two
.
def SSHUSER
environment {
if(params.CLOUD == 'google') {
SSHUSER = "test1"
} else if (params.CLOUD == 'azure') {
SSHUSER = "test2"
}
}
pipeline {
stage('stage one') {
steps {
echo "first attempt '${SSHUSER}'"
}
}
stage('stage two') {
steps {
sh '''#!/bin/bash
echo "first attempt '${SSHUSER}'"
echo "second attempt ${SSHUSER}"
echo "thrid attempt $SSHUSER"
if ssh ${SSHUSER}@$i 'test -e /tmp/test'";
then
echo "$i file exists "
fi
'''
}
}
}
你对 environment
块的用法有点奇怪,它应该位于 pipeline
块内,变量应该在 environment
块内初始化。
如果在外部定义,变量将不会作为环境变量传递给 shell 脚本。
如果你想在“管道”块中使用 environment
块,只需定义你想要的参数(作为字符串),它们将可用于所有阶段,它们将作为环境变量传递对于 shell.
例如:
pipeline {
agent any
parameters{
string(name: 'CLOUD', defaultValue: 'google', description: '')
}
environment {
SSHUSER = "${params.CLOUD == 'google' ? 'test1' : 'test2'}"
}
stages {
stage('stage one') {
steps {
echo "first attempt '${SSHUSER}'"
}
}
stage('stage two') {
steps {
sh '''#!/bin/bash
echo "first attempt '${SSHUSER}'"
echo "second attempt ${SSHUSER}"
echo "thrid attempt $SSHUSER"
if ssh ${SSHUSER}@$i 'test -e /tmp/test'";
then
echo "$i file exists "
fi
'''
}
}
}
}
如果您不想使用 environment
块或自己管理参数,您可以在 pipeline
块之外使用全局变量进行操作,但它们不会被传递给环境变量在将命令传递给 shell:
"""
而不是 '''
)来计算值
SSHUSER = ''
if(params.CLOUD == 'google') {
SSHUSER = "test1"
} else if (params.CLOUD == 'azure') {
SSHUSER = "test2"
}
pipeline {
agent any
parameters{
string(name: 'CLOUD', defaultValue: 'google', description: 'Bitbucket Payload', trim: true)
}
stages {
stage('stage one') {
steps {
echo "first attempt '${SSHUSER}'"
}
}
stage('stage two') {
steps {
sh """#!/bin/bash
echo "first attempt '${SSHUSER}'"
echo "second attempt ${SSHUSER}"
echo "thrid attempt $SSHUSER"
if ssh ${SSHUSER}@$i 'test -e /tmp/test'";
then
echo "$i file exists "
fi
"""
}
}
}
}