从共享库类调用Jenkins git插件


  • 我有一个长期存在的声明性管道基础设施
  • 我想开始将重复的代码放入共享库

我面临的问题是从共享库函数/类调用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-reos中提取项目文件这里的目标是将重复的代码转移到共享函数调用中


我已经阅读了手册中关于如何在共享库中使用git的以下部分:
https://www.jenkins.io/doc/book/pipeline/shared-libraries/#accessing-步骤

使用文档中的示例,我创建了共享库文件

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')
}
}
}
}
}

这加载了类并调用了函数fine,但当它到达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

对我来说,它可以将Jenkins上下文传递到共享库,如下所示:

Jenkinsfile:

pullRepo(this, repo, branch)
vars/pullRepo.groovy:
def call(def context, String repo, String branch) {
echo "||------ CLONING $repo ------||"
dir("deps/$repo") {
context.git branch: branch, changelog: false, credentialsId: 'jenkinsgit', poll: false, url: "git@github.com:myprivateorg/$repo.git"
}
}

请注意,我将Jenkins上下文传递到上下文变量中,并将git作为上下文的一个方法进行调用。您还应该能够通过将上下文传递给您的类来实现这一点。

最新更新