Jenkins:在Shell脚本和阶段之间传递变量

时间:2020-04-19 12:58:32

标签: 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}/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
~                                             

我甚至可能在这里尝试做什么?

1 个答案:

答案 0 :(得分:1)

在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批注,使该变量可从函数访问(否则它将实际上是script class的隐式run方法的局部变量)。 / p>