在 Jenkins 管道的 shell 步骤中访问 Groovy 变量

时间:2021-06-28 04:55:50

标签: jenkins jenkins-pipeline jenkins-groovy

SSHUER 中的

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
         '''
      }
    }
  }

1 个答案:

答案 0 :(得分:1)

您对 environment 块的使用有点奇怪,它应该位于 pipeline 块内,变量应该在 environment 块内初始化。
如果是在外部定义的变量将不会作为环境变量传递给shell脚本。

如果您想在 `pipeline' 块中使用 environment 块,只需定义您想要的参数(作为字符串),它们将可用于所有阶段,并且它们将作为环境变量传递给壳。
例如:

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
         """
            }
        }
    }
}