Нет такого метода DSL 'getVar' при использовании общих библиотек - PullRequest
2 голосов
/ 26 февраля 2020

Я создал общую библиотеку для хранения моего декларативного конвейера, а затем вызвал ее в Jenkinsfile. В файле Jenkins есть определения для методов, которые вызываются в сценариях конвейера в общей библиотеке. Я не понимаю, почему эта ошибка возникает. Какое решение для этого?

Jenkinsfile:

@Library('jenkinsLib')_

def getVar(){
   echo "${env.myVar}"
}

mymaster()

Под var в jenkinsLib общая библиотека сценария mymaster. groovy:

def call(){

  pipeline {
      agent any
      stages {
        stage('one') {
          steps {
            echo "This is Pipeline one"
            getVar()
          }
        }
      }
    }

}

Может работать, когда функции определены с определением конвейера, которое противоположно DRY, и при этом конвейеры выглядят большими и повторяемыми. Ниже показан этот случай:

def call(){

  pipeline {
      agent any
      stages {
        stage('one') {
          steps {
            echo "This is Pipeline one"
            getVar()
          }
        }
      }
    }

} 

def getVar(){
   echo "${env.myVar}"
}

Ответы [ 2 ]

3 голосов
/ 26 февраля 2020

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

0 голосов
/ 26 февраля 2020

Любой код Groovy должен использоваться в секции script. Только методы Дженкинса могут использоваться без script (т.е. только с steps).

В вашем случае

def getVar(){
   echo "${env.myVar}"
}

- это функция Groovy, поэтому вам необходимо используйте его внутри script секции.

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