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

我面临的问题是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

4

1 回答 1

0

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

詹金斯文件:

    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 作为上下文的方法调用。您还应该能够通过将上下文传递给您的班级来做到这一点。

于 2020-11-10T22:31:27.337 回答