簡體   English   中英

在 Jenkins 管道的 shell 步驟中訪問 Groovy 變量

[英]Access a Groovy variable within shell step in Jenkins pipeline

SSHUERstage 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 腳本。

如果你想使用 `pipeline' 塊內的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塊之外執行此操作,但是它們不會被傳遞環境變量,您將需要使用字符串插值( """代替of ''' ) 來計算將命令傳遞給 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
         """
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM