Библиотечные классы не могут напрямую вызывать такие шаги, как sh или git .Однако они могут реализовывать методы вне области действия включающего класса, которые, в свою очередь, вызывают шаги конвейера, например:
// src/org/foo/Zot.groovy
package org.foo;
def checkOutFrom(repo) {
git url: "git@github.com:jenkinsci/${repo}"
}
return this
, которые затем можно вызывать из сценариев конвейера:
def z = new org.foo.Zot()
z.checkOutFrom(repo)
Этот подход имеет ограничения;например, он предотвращает объявление суперкласса.
Альтернативно, набор шагов может быть явно передан с использованием этого в класс библиотеки, в конструктор или только в один метод:
package org.foo
class Utilities implements Serializable {
def steps
Utilities(steps) {this.steps = steps}
def mvn(args) {
steps.sh "${steps.tool 'Maven'}/bin/mvn -o ${args}"
}
}
При сохранении состояния на классах, таких как выше, класс должен реализовывать интерфейс Serializable.Это гарантирует, что конвейер, использующий класс, как показано в примере ниже, может правильно приостановить и возобновить работу в Jenkins.
@Library('utils') import org.foo.Utilities
def utils = new Utilities(this)
node {
utils.mvn 'clean package'
}
Если библиотеке требуется доступ к глобальным переменным, таким как env, они должны быть явноаналогичным образом передаются в классы или методы библиотеки.
Вместо передачи многочисленных переменных из сценариев конвейера в библиотеку,
package org.foo
class Utilities {
static def mvn(script, args) {
script.sh "${script.tool 'Maven'}/bin/mvn -s ${script.env.HOME}/jenkins.xml -o ${args}"
}
}
В приведенном выше примере показан сценарий, который передаетсяв одном статическом методе, который вызывается из сценариев конвейера следующим образом:
@Library('utils') import static org.foo.Utilities.*
node {
mvn this, 'clean package'
}
Для получения дополнительной информации см. документацию общей библиотеки jenkins: https://jenkins.io/doc/book/pipeline/shared-libraries/