Общая библиотека 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 класс напрямую с groovyCLI локально и на сервере 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()

Другие вопросы по тегам