Общая библиотека Jenkins - импорт классов из папки / src в / vars
Я пытаюсь написать общую библиотеку Jenkins для моего процесса CI. Я хотел бы сослаться на класс, который находится в\src
папка внутри глобальной функции, определенной в \vars
папка, так как это позволило бы мне поместить большую часть логики в классы, а не в глобальные функции. Я слежу за структурой репозитория, описанной в официальной документации Jenkins:
Структура общей библиотеки Jenkins.
Вот упрощенный пример того, что у меня есть:
/src/com/example/SrcClass.groovy
package com.example
class SrcClass {
def aFunction() {
return "Hello from src folder!"
}
}
/vars/classFromVars.groovy
import com.example.SrcClass
def call(args) {
def sc = new SrcClass()
return sc.aFunction()
}
Jenkinsfile
@Library('<lib-name>') _
pipeline {
...
post {
always {
classFromVars()
}
}
}
Моей целью были глобальные классы в /vars
папка, чтобы действовать как своего рода публичный фасад и использовать ее в моем Jenkinsfile
как настраиваемый шаг без необходимости создавать экземпляр класса в script
блок (что делает его совместимым с декларативными конвейерами). Мне все кажется довольно простым, но я получаю эту ошибку при запускеclassFromVars
файл:
<root>\vars\classFromVars.groovy: 1: unable to resolve class com.example.SrcClass
@ line 1, column 1.
import com.example.SrcClass
^
1 error
Я пробовал запустить classFromVars
класс напрямую с groovy
CLI локально и на сервере Jenkins, и у меня одинаковая ошибка в обеих средах. Я также попытался указать путь к классам при запуске/vars
скрипт, получив ту же ошибку, с помощью следующей команды:
<root>>groovy -cp <root>\src\com\example vars\classFromVars.groovy
Возможно ли то, чего я пытаюсь достичь? Или я должен просто поместить всю свою логику в/vars
class и избегайте использования /src
папка?
Я нашел несколько репозиториев на GitHub, которые, похоже, указывают на то, что это возможно, например, этот:https://github.com/fabric8io/fabric8-pipeline-library, который использует классы в/src
папка во многих классах в /vars
папка.
2 ответа
Как отметил @Szymon Stepniak, -cp
параметр в моем groovy
команда была неверной. Теперь он работает локально и на сервере Jenkins. Мне еще предстоит объяснить, почему он не работал на сервере Jenkins.
Я обнаружил, что когда я хотел импортировать класс из имеющейся у меня общей библиотеки, на шаг сценария в
/vars
Мне нужно было сделать это так:
//thanks to '_', the classes are imported automatically.
// MUST have the '@' at the beginning, other wise it will not work.
// when not using "@BRANCH" it will use default branch from git repo.
@Library('my-shared-library@BRANCH') _
// only by calling them you can tell if they exist or not.
def exampleObject = new example.GlobalVars()
// then call methods or attributes from the class.
exampleObject.runExample()