Вызов плагина Jenkins git из класса общей библиотеки - PullRequest
0 голосов
/ 14 июля 2020
  • У меня есть давняя декларативная конвейерная инфраструктура
  • Я хотел бы начать размещать повторяющийся код в разделяемых библиотеках

Проблема, с которой я столкнулся, - это вызов 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

...