Общие библиотеки Jenkins: можно ли передавать аргументы сценариям оболочки, импортированным как libraryResource?

У меня следующая установка:

(Вычеркнуто) Jenkinsfile:

@Library('my-custom-library') _

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                printHello name: 'Jenkins'
            }
        }
    }
}

моя-пользовательская-библиотека / ресурсы / com / org / scripts / print-hello.sh:

#!/bin/bash

echo "Hello, $1"

моя-пользовательская-библиотека / vars / printHello.groovy:

def call(Map parameters = [:]) {
    def printHelloScript = libraryResource 'com/org/scripts/print-hello.sh'
    def name = parameters.name
    //the following line gives me headaches
    sh(printHelloScript(name))
}

Я ожидаю Hello, Jenkins, но выдает следующее исключение:

groovy.lang.MissingMethodException: нет сигнатуры метода: java.lang.String.call () не применяется для типов аргументов: (java.lang.String) значения: [Jenkins]

Возможные решения: wait (), any (), wait (long), split (java.lang.String), take (int), each (groovy.lang.Closure)

Итак, возможно ли сделать что-то подобное, описанному выше, без смешивания кода Groovy и Bash?


person ebu_sho    schedule 14.11.2018    source источник


Ответы (1)


Да, попробуйте withEnv

Пример, который они приводят, выглядит так:

node {
  withEnv(['MYTOOL_HOME=/usr/local/mytool']) {
    sh '$MYTOOL_HOME/bin/start'
  }
}

Более применимо к вам:

// resources/test.sh
echo "HI here we are - $PUPPY_DOH --"

// vars/test.groovy
def call() {
   withEnv(['PUPPY_DOH=bobby']) {
    sh(libraryResource('test.sh'))
  }
}

Печать:

[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] libraryResource
[Pipeline] sh
+ echo HI here we are - bobby --
HI here we are - bobby --
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }

Используя это, вы можете передать его, используя именованную переменную с ограниченной областью видимости, что-то вроде

def call(Map parameters = [:]) {
    def printHelloScript = libraryResource 'com/org/scripts/print-hello.sh'
    def name = parameters.name
    withEnv(['NAME=' + name]) { // This may not be 100% syntax here ;)
    sh(printHelloScript)
}

// print-hello.sh
echo "Hello, $name"
person chrisb    schedule 28.01.2019
comment
Вы можете использовать withEnv(["NAME=${name}"]) (обратите внимание на двойные кавычки). Вы также можете сначала экранировать содержимое переменной. - person iliis; 04.11.2020