Jenkins: передать переменную между сценариями оболочки и этапами - PullRequest
0 голосов
/ 19 апреля 2020

Я довольно новичок в Дженкинс, так что не обращаю на меня внимания :) Я пытаюсь настроить конвейер Дженкинса, где я получаю «связанное» имя сервера с помощью сценария оболочки и сохраняю его в переменной ($ 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 Ответ

1 голос
/ 19 апреля 2020

Переменные среды, которые назначены в сценариях оболочки, не сохраняются вне сеанса оболочки. Вы должны получить стандартный вывод из шага 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 класса сценария ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...