如何从共享库 src 文件运行完整的 Jenkins 脚本化管道阶段

use*_*357 3 groovy jenkins jenkins-pipeline jenkins-shared-libraries

我最近开始在 Jenkins 管道中使用 Jenkins 共享库。我创建了一个“func.groov”类并将其定位在“src/org/prj/func.groovy”下:

package org.prj
import jenkins.model.
class func implements Serializable {
 def steps 
 func(steps) {
  this.steps = steps
 }
 def sh(args) {
  steps.sh "echo ${args}"
 }
 def setLBL(CurrentNodeName,newLabelName){
   jenkins.model.Jenkins.instance.slaves.each{ slave ->
     if (slave.getNodeName() == CurrentNodeName){
       slave.setLabelString(newLabelName)
     }
  }
} 
Run Code Online (Sandbox Code Playgroud)

Jenkinsfile(脚本)看起来像:

@Library('prj') import org.prj.func
def utils = new func(steps)
node(lbl)
{
  stage("A"){
     Build_node_lbl = env.NODE_NAME+System.currentTimeMillis()
     utils.setLBL(env.NODE_NAME,Build_node_lbl)

   }
}
Run Code Online (Sandbox Code Playgroud)

所以目前它有效。我的问题是如何创建一个完整的阶段(如“A”)作为 func.groovy 共享库中的一个函数,其中将包括,例如:

  1. GIT 结帐步骤
  2. sh 编译步骤
  3. Artifactory 部署步骤

我实际上希望使用 Jenkins 管道和分片库创建一个“构建块”(在我的示例中为“构建”)。

fis*_*x01 5

1. 使用类实例化

您可以像在 Java 中一样创建一个类。然后在您的Jenkinsfile实例中实例化该类并调用其函数。

src/org/prj/MyPipeline.groovy:

package org.prj

class MyPipeline {

  def steps

  MyPipeline(steps) {this.steps = steps}

  public def build() {
    steps.node('lbl') {
      steps.stage('A') {
        // Do build stuff
        // steps.sh(..)
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

詹金斯档案:

import org.prj.MyPipeline

def pipeline = new MyPipeline(this)
pipeline.build()
Run Code Online (Sandbox Code Playgroud)

2. 使用静态函数

您还可以使用静态上下文,无需实例化。但是,这需要将调用者上下文移交给管道:

src/org/prj/MyPipeline.groovy:

package org.prj

class MyPipeline {

  public static def build(caller) {
    caller.node('lbl') {
      caller.stage('A') {
        // Do build stuff
        caller.sh(..)
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

詹金斯档案:

import org.prj.MyPipeline

MyPipeline.build(this)
Run Code Online (Sandbox Code Playgroud)

  • Fwiw 您将无法访问 Jenkins 在您班级中的步骤。在第一个例子中,“node”和“stage”会抛出异常。您必须将 Jenkinsfile 上下文传递给构造函数(例如),然后使用此对象来调用 Jenkins 的步骤。 (2认同)