Как включить внешний файл кода в Jenkins Workflow

Я пытаюсь включить внешний код в свой Workflow script, но я что-то упустил. Кажется, что первый шаг работает. Если путь недействителен, это не удается:

evaluate( new File('/home/larry.fast/Wkflo.groovy'))

Но я пробовал ряд синтаксических вариаций в следующем и не нашел заклинания, которое работает. Все попытки вызвали варианты "неспособности разрешить класс mycode.Wkflo.

def z = mycode.Wkflo()

Wkflo.groovy содержит:

package mycode;
def hello() {
  echo "Hello from workflow"
}

Я также пробовал варианты, такие как run (File()) или удаление объявления пакета.

Ответ 1

Документация Jenkins Workflow теперь включает раздел "Загрузка Script Текст" https://github.com/jenkinsci/workflow-plugin/blob/master/TUTORIAL.md, но мне было трудно следовать. Вот простой пример, демонстрирующий, как создавать полные рабочие процессы и другие методы во внешних файлах.

Код рабочего процесса в Jenkins:

// Loading code requires a NODE context
// But we want the code accessible outside the node Context
// So declare extcode (object created by the LOAD operation) outside the Node block.
def extcode 

node {
    // paths are relative to your workspace
    // you may need to run git to populate your workspace
    git url: 'ssh://mygitrepo'
    extcode = load 'myExtCode.wkflo'

    // or you can directly access the file system
    // Eg. when developing your code in a local git clone
    extcode = load '/some/absolute/path/myExtCode.wkflo'

    // extcode is now a groovy object containing everything declared in the file
    extcode.hello('world')
}
// If your code contains Stage and Node blocks, 
// you'll want to initiate that code outside of the node() block above
extcode.extMain()

------ myExtCode.wkflo

// Any command placed at the root of the file get executed during the load operation
echo "hello from loading myExtCode"

// Methods declared in external code are accessible
//   directly from other code in the external file
//   indirectly via the object created by the load operation
//   eg.  extcode.hello('use this syntax from your main code')
def hello(whom) {
    echo "Hello ${whom}"
}

// Complete workflows should be created inside a controlling method
// else they will run nested inside the node() block when the load takes place (edit: added missing "def" keyword
def extMain() {
    stage 'External Code is running'
    node() {
        hello('from external node block')
    }
}

// !!Important Boilerplate!!     
// The external code must return it contents as an object
return this;