【问题标题】:Jenkins: pass a variable between shell scripts and stagesJenkins:在 shell 脚本和阶段之间传递一个变量
【发布时间】:2020-04-19 12:58:32
【问题描述】:

我正在尝试设置一个 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
~                                             

我想在这里做什么?

【问题讨论】:

  • @Cyrus 我使用 bash

标签: bash shell jenkins groovy


【解决方案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 方法的局部变量)。

【讨论】:

  • Tnx 的解释,帮了我很多!