我正在尝试建立一个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
~
我甚至可能在这里尝试做什么?
答案 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>