Как передать аргументы встроенному скрипту оболочки Jenkins DSL?

#jenkins #continuous-integration #jenkins-groovy #jenkins-job-dsl

Вопрос:

У меня есть шаг Дженкинса, на котором необходимо запустить встроенный сценарий оболочки. Для сценария требуется несколько аргументов, которые содержатся в конфигурации. Как правильно это сделать? Сценарий оболочки должен быть встроенным и не может быть в отдельном файле. Я пробовал что-то подобное, но это не работает.

 stage('Build Image') {              
    steps {
        script {
            docker.withRegistry('.......', 'Gitlab') {
                CHECK_SHA_RESULT = sh '''
                    ARG1=$1
                    ARG2=$2
                    // Do other stuff and output a result
                ''' ${config.var1} ${config.var2}
            }
        }
    }
}
 

Ответ №1:

Существует два варианта передачи значений:

  1. интерполяция строк
  2. разверните переменные среды

Интерполяция Строк

Вы можете просто передавать значения, расширяя переменные в заводных строках:

 sh """
    ARG1=${config.var1}
    ARG2=${config.var2}
    echo $ARG1
    echo $ARG2
"""
 

(двойные кавычки используются вместо одинарных)

Вы должны быть осторожны, потому что значения сначала расширяются, а затем выполняется код. Это означает, что вы можете вводить код. Пример:

  • конфигурационный файл:
     var1=text; cat /etc/passwd
    var2=hello
     
  • выполненный код:
     ARG1=text; cat /etc/passwd
    ARG2=hello
    echo $ARG1
    echo $ARG2
     

Переменные среды

Вы можете вводить значения с помощью переменных среды. Это намного безопаснее, потому что значения расширяются процессом оболочки (предотвращение внедрения команд).

 withEnv([
    "ARG1=${config.var1}",
    "ARG2=${config.var2}"
]) {
    sh '''
        echo $ARG1
        echo $ARG2
    '''
}
 

( sh сценарий определяется с помощью кавычек для записи)

Пример:

  • конфигурационный файл:
     var1=text; cat /etc/passwd
    var2=hello
     
  • доступные переменные среды:
    • ARG1 = text; cat /etc/passwd
    • ARG2 = hello
  • выполненный код:
     echo $ARG1
    echo $ARG2