2016-08-01 2 views
19

Я рассматриваю возможность использования сценария сценария Jenkins в последнее время, один вопрос заключается в том, что я не понимаю умного способа создания внутреннего кода повторного использования utils, представьте себе, у меня есть общая функция helloworld, которая будет используется множество рабочих мест для трубопроводов, поэтому я надеюсь, что создать utils.jar можно ввести его в путь класса работы.Создать сценарий сценария с использованием возобновляемых сценариев jenkins

Я заметил Дженкинс имеет схожую концепцию с global library, но моим беспокойство по поводу этого плагина:

Поскольку это плагин, так что нам нужно установить/обновить его через Jenkins плагиной менеджер, то может потребоваться перезагрузка чтобы применить изменения, это не то, что я хочу видеть, поскольку utils может измениться, добавьте всегда, мы надеемся, что он будет доступен сразу.

Во-вторых, это официальный jenkins shared lib, я не хочу (или они не будут применять нас) добавляет личный код в репозиторий jenkins.

Любая хорошая идея?

+0

Я не получаю ваше предложение _Secondly .._. – StephenKing

+0

Ответы здесь должны быть ясными, но этот блог может быть очень полезен: https://lvthillo.com/reusable-jenkins-pipeline-for-maven-jobs/ – DenCowboy

ответ

26

Shared Libraries (docs) позволяет сделать ваш код доступным для всех ваших сценариев конвейера. Вам не нужно создавать плагин для этого, и вам не нужно перезапускать Jenkins.

E.g. это my library и this a Jenkinsfile, который называет эту общую функцию.


EDIT (февраль 2017): Библиотека может быть доступна через внутренний сервер Git Дженкинса, или развернуты с помощью других средств (например, с помощью Chef) в каталог workflow-lib/ в домашнем каталоге Дженкинс пользователя. (все еще возможно, но очень unhandy).

Глобальная библиотека может быть сконфигурирован с помощью следующих средств:

  • @Library('github.com/...') аннотаций в Jenkinsfile, указывающих на URL из общей библиотеки репо.
  • настроен на уровне папки Jenkins.
  • сконфигурирован в конфигурации Jenkins как глобальная библиотека с тем преимуществом, что код доверял, то есть не подвергался безопасности сценария.

Сочетание первого и последнего метода будет явно не загружен разделяемой библиотеки, которая затем запрашивается только используя его имя в Jenkinsfile: @Library('mysharedlib').

+0

Ха, очень хорошее объяснение, если это так, то это именно то, что я хочу. – Tim

+0

Это так :-) Вы можете посмотреть все репозитории в https://github.com/TYPO3-cookbooks/, все они используют 'Jenkinsfile', содержащий только вызов конвейера. – StephenKing

+0

Я сделаю это точно. – Tim

1

Вот решение, которое сейчас мы используем для того, чтобы повторно использовать Jenkinsfile код:

node { 

    curl_cmd = "curl -H 'Accept: application/vnd.github.v3.raw' -H 'Authorization: token ${env.GITHUB_TOKEN}' https://raw.githubusercontent.com/example/foobar/master/shared/Jenkinsfile > Jenkinsfile.t 
    sh "${curl_cmd}" 
    load 'Jenkinsfile.tmp' 

} 

Я мог бы быть немного некрасиво, но это работает realiably и в дополнение к этому она также позволяет вставлять некоторый код конкретного хранилища до или после общего кода.

+0

Поскольку ваш скрипт 'Jenkinsfile.tmp', кажется, проверен на Git repo, вы, вероятно, можете просто использовать базовый шаг проверки git/scm для загрузки своего скрипта вместо ручного завитка. – Pom12

+0

Если бы это позволило мне проверить один файл из репозитория, это было бы здорово. Но если это будет проверять весь репозиторий, это явно не будет чем-то желательным, так как это репо может быть действительно большим. – sorin

+0

В этом случае другая возможность может заключаться в проверке вашего 'Jenkinsfile.tmp' Git repo как задания Freestyle Jenkins, который просто выполняет регулярный опрос на вашем репозитории Git, а затем загружает ваш файл Jenkins из этой другой рабочей области. – Pom12

7

В зависимости от того, как часто вы планируете повторное использование кода, вы также можете загрузить функцию (или набор функций) как часть другого конвейера.

{ 
    // ...your pipeline code... 

    git 'http://urlToYourGit/projectContainingYourScript' 
    pipeline = load 'global-functions.groovy' 
    pipeline.helloworld() // Call one of your defined function 

    // ...some other pipeline code... 
} 

Это может решение кажется немного громоздким по сравнению с StephenKing один, но то, что мне нравится в этом решении является то, что мои глобальные функции все поручены к Git и любой может легко изменить их без (почти) любого знания Дженкинс , только основы Groovy.

В сценарии Groovy есть load ing, убедитесь, что вы добавили return this в самом конце. Это позволит вам совершать звонки позже. В противном случае, если вы установили pipeline = load global-functions.groovy, переменная будет установлена ​​на null.

+0

Мы автоматически обновляем каталог '$ JENKINS_HOME/workflow-lib /' через Chef автоматически из Github. Вы можете сделать это также через работу Cron. Мне также не нравится внутренний псевдо-git-сервер Jenkins. – StephenKing

+1

не забудьте добавить 'return this' в конец вашего совместного скрипта. Посмотрите на этот ответ http://stackoverflow.com/questions/37800195/how-do-you-load-a-groovy-file-and-execute-it –

Смежные вопросы