Как создать withXCredentials, который оборачивает Jenkins withCredentials, используя Closure в общей переменной Jenkins? - PullRequest
1 голос
/ 03 марта 2020

Я хочу, чтобы этот код с таким синтаксисом был в моем конвейерном скрипте:

withXCredentials(id: 'some-cred-id', usernameVar: 'USER', passwordVar: 'PASS') {
   //do some stuff with $USER and $PASS
   echo "${env.USER} - ${env.PASS}"
}

Обратите внимание, что вы можете поместить любой код в withXCredenitals для выполнения. withXCredentials.groovy находится в моей общей библиотеке Jenkins в папке vars, и в ней будут использоваться оригинальные withCredentials:

//withXCredentials.groovy
def userVar = params.usernameVar
def passwordVar = params.passwordVar
def credentialsId = params.credentialsId

withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: credentialsId, usernameVariable: usernameVar, passwordVariable: passwordVar]]) {

        body()
}

. Я все еще изучаю расширенный материал groovy, но не могу понять, как чтобы сделать это.

Обратите внимание :

Мой вопрос больше о синтаксисе в groovy и использовании Closure и ответе здесь не то, что я после. С этим решением мне нужно сначала создать экземпляр класса, а затем вызвать метод. Поэтому я стараюсь не делать что-то вроде этого:

new WithXCredentials(this).doSomthing(credentialsId, userVar, passwordVar)

В документации Jenkins есть пример использования замыкания:

// vars/windows.groovy
def call(Closure body) {
    node('windows') {
        body()
    }
}

//the above can be called like this:
windows {
    bat "cmd /?"
}

Но это не объясняет, как пройти параметры, подобные этому

windows(param1, param2) {
    bat "cmd /?"
}

Смотрите здесь

1 Ответ

1 голос
/ 04 марта 2020

Итак, после поиска inte rnet я наконец нашел ответ. На случай, если кому-то понадобится то же самое. Будет работать следующий код:

// filename in shared lib: /vars/withXCredentials.groovy

def call(map, Closure body) {

    def credentialsId = map.credentialsId
    def passwordVariable =  map.passwordVariable
    def usernameVariable = map.usernameVariable
    withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: credentialsId, usernameVariable: usernameVariable, passwordVariable: passwordVariable]]) {
        echo 'INSIDE withXCredentials'
        echo env."${passwordVariable}"
        echo env."${usernameVariable}"
        body()
    }

}

При этом в вашем конвейере может быть следующее:

node('name') {
   withXCredentials([credentialsId: 'some-credential', passwordVariable: 'my_password', 
            usernameVariable: 'my_username']) { 
      echo 'Outside withXCredenitals'
      checkout_some_code username: "$env.my_username", password: "$env.my_password"
   }
}

...