- У меня есть давняя декларативная конвейерная инфраструктура
- Я хотел бы начать размещать повторяющийся код в разделяемых библиотеках
Проблема, с которой я столкнулся, - это вызов git
плагин из функции / класса общей библиотеки. Я немного потерялся, так как мой опыт действительно связан только с декларативным материалом Jenkins, а не с особенностями Groovy / Java.
Вот фрагмент Jenkinsfile (до использования общей библиотеки):
pipeline {
agent any
stages {
stage('Prep Workspace') {
steps {
script {
if ((env.BRANCH_NAME == 'staging') || (env.BRANCH_NAME == 'production')) {
BRANCH=env.BRANCH_NAME
} else {
BRANCH='master'
}
}
echo "||------ Get ProjectOne Dependency ------||"
dir('deps/ProjectOne') {
git branch: "${BRANCH}",
changelog: false,
credentialsId: 'jenkinsgit',
poll: false,
url: 'git@github.com:myprivateorg/ProjectOne.git'
}
echo "||------ Get ProjectTwo Dependency ------||"
dir('deps/ProjectTwo') {
git branch: "${BRANCH}",
changelog: false,
credentialsId: 'jenkinsgit',
poll: false,
url: 'git@github.com:myprivateorg/ProjectTwo.git'
}
}
}
}
}
Обратите внимание на повторяющиеся вызовы для получения файлов проекта из репозиториев git. Цель здесь - переместить повторяющийся код в общий вызов функции.
Я прочитал следующую часть руководства о том, как использовать git
в общей библиотеке: https://www.jenkins.io/doc/book/pipeline/shared-libraries/#accessing -шагов
Используя пример из документации, я создал файл общей библиотеки
In src/org/test/gitHelper.groovy
:
package org.test;
def checkOutFrom(String repo, String branch='master') {
echo "||------ CLONING $repo ------||"
git branch: branch, changelog: false, credentialsId: 'jenkinsgit', poll: false, url: "git@github.com:myprivateorg/$repo.git"
}
return this
Затем в Jenkinsfile
:
@Library('jenkins-shared-library') _
pipeline {
agent any
stages {
stage('Prep Workspace') {
steps {
script {
if ((env.BRANCH_NAME == 'staging') || (env.BRANCH_NAME == 'production')) {
BRANCH=env.BRANCH_NAME
} else {
BRANCH='master'
}
def g = new org.test.gitHelper()
g.checkOutFrom('ProjectOne')
g.checkOutFrom('ProjectTwo')
}
}
}
}
}
Это загружает класс и вызывает функцию нормально, но терпит неудачу, когда попадает в git
сам:
groovy.lang.MissingPropertyException: No such property: git for class: java.lang.String
Я использовал g.getClass()
, чтобы подтвердить, что это тип class org.test.gitHelper
, а НЕ java.lang.String
, поэтому я не уверен, откуда он берет этот тип.
Обратите внимание, что я тоже пробовал этот способ:
vars/pullRepo.groovy
def call(String repo, String branch) {
echo "||------ CLONING $repo ------||"
dir("deps/$repo") {
git branch: branch, changelog: false, credentialsId: 'jenkinsgit', poll: false, url: "git@github.com:myprivateorg/$repo.git"
}
}
Jenkinsfile:
pullRepo('ProjectOne', 'master')
Я получаю точно такую же ошибку : groovy.lang.MissingPropertyException: No such property: git for class: java.lang.String