Bash Jenkins:在shell脚本和stage之间传递一个变量

Bash Jenkins:在shell脚本和stage之间传递一个变量,bash,shell,jenkins,groovy,Bash,Shell,Jenkins,Groovy,我试图建立一个Jenkins管道,在这里我用一个shell脚本获取“相关”服务器名并将其存储在一个变量($server)中,然后我想在下一阶段使用该变量登录到该服务器并远程执行一个脚本。 我提出了以下方法,但无法确定如何在第一个和第二个函数之间传递服务器名称: 1 def SERVER 2 3 def fetch_server() { 4 sh """#!/bin/bash 5 SERVER = ${env.LOCAL_SCRIPT_PATH}/getServe

我试图建立一个Jenkins管道,在这里我用一个shell脚本获取“相关”服务器名并将其存储在一个变量($server)中,然后我想在下一阶段使用该变量登录到该服务器并远程执行一个脚本。 我提出了以下方法,但无法确定如何在第一个和第二个函数之间传递服务器名称:

  1 def SERVER
  2 
  3 def fetch_server() {
  4   sh """#!/bin/bash
  5     SERVER = ${env.LOCAL_SCRIPT_PATH}/getServer.sh ${params.HOSTNAME} ${TOKEN}
  6   """
  7 }
  8 def provisioning() {
  9   sh """#!/bin/bash
 10     ssh -o StrictHostKeyChecking=no username@$SERVER 'bash -s' ${env.REMOTE_SCRIPT_PATH}/script.py
 11   """
 12 }
 13 
 14 pipeline {
 15   agent {
 16     label 'slave1'
 17   } // end agent
 18   environment {
 19     REMOTE_SCRIPT_PATH = '/usr/local/bin/scripts'
 20     LOCAL_SCRIPT_PATH  = './jobs/scripts'
 21   }
 22   parameters {
 23     string(
 24       name: 'HOSTNAME',
 25       defaultValue: '---',
 26       description: 'Enter the hostname of server'
 27     ) // end HOSTNAME parameter
 28   } // end parameters
 29   stages {
 30     stage('Stage 1') {
 31       steps {
 32         withCredentials([string(credentialsId: 'some_cred', variable: 'TOKEN')]) {
 33           fetch_server()
 34         } 
 35       } // end steps
 36     } // end Stage 1 
 37     stage('Stage 2') {
 38       steps {
 39         sshagent(credentials : ['username']) {
 40            provisioning()
 41         } // end ssh credentials
 42       } // end steps 
 43     } // end Stage 2
 44   } // end stages
 45   post {
 46     always {
 47       cleanWs()
 48     } // end always
 49   } // end post step
 50 } // end pipeline
~                                             

甚至可能是我在这里试图做的吗?

分配给shell脚本的环境变量在shell会话之外不会持久存在。您必须从
sh
步骤中获取标准输出,并将其分配给Groovy变量,如下所示:

@groovy.transform.Field String SERVER = null

def fetch_server() {
  SERVER = sh( returnStdout: true, 
               script: "${env.LOCAL_SCRIPT_PATH}/getServer.sh ${params.HOSTNAME} ${TOKEN}" ).trim()
}

注意使用
@groovy.transform.Field
注释,这是从函数中访问变量所必需的(否则它实际上将是的隐式
run
方法的局部变量)。

@Cyrus我使用bashTnx进行解释,这对我帮助很大!