Я не знаю, является ли это оптимальным решением, я - трубопровод Дженкинса и Groovy newb ie, но это сработало для меня.
Вот Jenkinsfile
:
@Library('jenkinsLib') _
def getVar() {
echo "${env.myVar}"
}
mymaster(this.&getVar)
А вот mymaster.groovy
:
def call(Closure getVar) {
pipeline {
agent any
stages {
stage('one') {
steps {
echo "This is Pipeline one"
script {
getVar()
}
}
}
}
}
}
Резюме: вы можете передать метод (замыкание) в качестве параметра, чтобы сделать его видимым внутри call()
метода. Чтобы получить замыкание, необходимо использовать оператор .&
. Кроме того, Дженкинс жалуется на вызов методов вне условия script
, поэтому вам может потребоваться добавить один.
В качестве примечания хотелось бы отметить, что такой подход очень ясен (явен) - внутри библиотеки вы используете только то, что знаете, а код не имеет внешних зависимостей.
Если вы хотите передать много методов в качестве аргументов, вы можете рассмотреть возможность использования Map
для перехвата многих аргументов и обеспечения более явного вызова.
Изменено Jenkinsfile
с использованием большего количества методов и нового стиля вызова:
@Library('jenkinsLib') _
def getVar(){
echo "${env.myVar}"
}
def getVar2(){
echo "${env.myVar2}"
}
mymaster([
getVar: this.&getVar,
getVar2: this.&getVar2
])
и mymaster.groovy
с использованием Map
вместо фиксированных аргументов:
def call(Map args) {
pipeline {
agent any
stages {
stage('one') {
steps {
echo "This is Pipeline one"
script {
args.getVar()
args.getVar2()
}
}
}
}
}
}
К сожалению, у этого решения есть недостаток - вы не имеете такого большого контроля над передаваемыми аргументами, вы необходимо вручную проверить, что находится в args
карте (или не допускать ошибок в аргументах при вызове).