- 我有一个长期的声明性管道基础设施
- 我想开始将重复的代码放入共享库中
我面临的问题是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 repos 中下拉项目文件的重复调用。这里的目标是将重复的代码移动到共享函数调用中。
我已经阅读了手册中关于如何git
在共享库中使用的以下部分:
https ://www.jenkins.io/doc/book/pipeline/shared-libraries/#accessing-steps
使用文档中的示例,我创建了共享库文件
在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"
}
}
詹金斯文件:
pullRepo('ProjectOne', 'master')
我得到完全相同的错误:groovy.lang.MissingPropertyException: No such property: git for class: java.lang.String