如何加载groovy文件并执行它

7rfyedvj  于 2022-11-01  发布在  其他
关注(0)|答案(6)|浏览(141)

我有一个jenkinsfile放到了我的项目的根目录下,我想为我的管道拉入一个groovy文件并执行它。我能够让它工作的唯一方法是创建一个单独的项目并使用fileLoader.fromGit命令。我想

def pipeline = load 'groovy-file-name.groovy'
pipeline.pipeline()
wnvonmuf

wnvonmuf1#

如果您的Jenkinsfile和groovy文件在一个存储库中,并且Jenkinsfile是从SCM加载的,您必须执行以下操作:

示例.Groovy

def exampleMethod() {
    //do something
}

def otherExampleMethod() {
    //do something else
}
return this

Jenkins档案

node {
    def rootDir = pwd()
    def exampleModule = load "${rootDir}@script/Example.Groovy "
    exampleModule.exampleMethod()
    exampleModule.otherExampleMethod()
}
qxgroojn

qxgroojn2#

如果您有一个加载多个groovy文件的管道,并且这些groovy文件也在它们之间共享:

Jenkins文件.groovy

def modules = [:]
pipeline {
    agent any
    stages {
        stage('test') {
            steps {
                script{
                    modules.first = load "first.groovy"
                    modules.second = load "second.groovy"
                    modules.second.init(modules.first)
                    modules.first.test1()
                    modules.second.test2()
                }
            }
        }
    }
}

“第一次,太棒了”

def test1(){
    //add code for this method
}
def test2(){
    //add code for this method
}
return this

“第二棒极了”

import groovy.transform.Field
@Field private First = null

def init(first) {
    First = first
}
def test1(){
    //add code for this method
}
def test2(){
    First.test2()
}
return this
qnzebej0

qnzebej03#

在执行load之前,您必须执行checkout scm(或从SCM中检查代码的其他方法)。

mwyxok5s

mwyxok5s4#

感谢@anton和@Krzysztof Krasori,如果我结合checkout scm和确切的源文件,它工作得很好

示例.Groovy

def exampleMethod() {
    println("exampleMethod")
}

def otherExampleMethod() {
    println("otherExampleMethod")
}
return this

Jenkins档案

node {
    // Git checkout before load source the file
    checkout scm

    // To know files are checked out or not
    sh '''
        ls -lhrt
    '''

    def rootDir = pwd()
    println("Current Directory: " + rootDir)

    // point to exact source file
    def example = load "${rootDir}/Example.Groovy"

    example.exampleMethod()
    example.otherExampleMethod()
}
ct3nt3jp

ct3nt3jp5#

非常有用的线程,有同样的问题,解决了以下你.
我的问题是:- 〉呼叫一个-〉呼叫
这里我的解决方案:

Jenkins档案

node {
  checkout scm
  //other commands if you have

  def runner = load pwd() + '/first.groovy'
  runner.whateverMethod(arg1,arg2)
}

“第一次,太棒了”

def first.groovy(arg1,arg2){
  //whatever others commands

  def caller = load pwd() + '/second.groovy'
  caller.otherMethod(arg1,arg2)
}

注意:参数是可选的,如果有,请添加它们,或保留为空。
希望这能对你有进一步的帮助。

5w9g7ksd

5w9g7ksd6#

如果在加载的groovy脚本中调用的方法带有自己的节点块,则不应该在加载脚本的节点块中调用这些方法,否则就会毫无理由地阻塞外部节点。
因此,根据“Shishkin”的回答,这可能看起来像

示例.Groovy

def exampleMethod() {
    node {
        //do something
    }
}

def otherExampleMethod() {
    node {
        //do something else
    }
}
return this

Jenkins档案

def exampleModule
node {
    checkout scm // could not get it running w/o checkout scm
    exampleModule = load "script/Example.Groovy"
}
exampleModule.exampleMethod()
exampleModule.otherExampleMethod()

使用readTrusted的Jenkins文件

当运行最近的Jenkins时,您将能够使用readTrusted从包含Jenkins文件的scm中读取文件,而无需运行checkout -或node块:

def exampleModule = evaluate readTrusted("script/Example.Groovy")
exampleModule.exampleMethod()
exampleModule.otherExampleMethod()

相关问题