82 votes

Comment charger un fichier groovy et l'exécuter

J'ai un fichier jenkins déposé à la racine de mon projet et j'aimerais extraire un fichier groovy pour mon pipeline et l'exécuter. La seule façon dont j'ai pu faire fonctionner cela est de créer un projet distinct et d'utiliser la commande fileLoader.fromGit . je voudrais faire

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

128voto

anton Points 856

Si votre fichier Jenkinsfile et groovy dans un référentiel et Jenkinsfile est chargé à partir de SCM, vous devez faire:

Exemple.Groovy

 def exampleMethod() {
    //do something
}

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

JenkinsFile

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

32voto

awefsome Points 161

Si vous avez un pipeline qui charge plus d'un fichier groovy et que ces fichiers groovy partagent également des choses entre eux:

JenkinsFile.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()
                }
            }
        }
    }
}
 

first.groovy

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

second.groovy

 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
 

20voto

krzyk Points 1044

Vous devez faire checkout scm (ou une autre façon de retirer le code de SCM) avant de faire load .

10voto

Malli Points 177

Merci @anton et @Krzysztof Krasori, cela a bien fonctionné si j'ai combiné checkout scm et le fichier source exact

Exemple.Groovy

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

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

JenkinsFile

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

4voto

kancio Points 1

Ciao, fil très utile, a eu le même problème, résolu en vous suivant.

Mon problème était: Jenkinsfile -> appeler un first.groovy -> appeler second.groovy

Voici ma solution:

Jenkinsfile

 node {
  checkout scm
  //other commands if you have

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

first.groovy

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

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

NB: les arguments sont facultatifs, ajoutez-les si vous en avez ou laissez-les vides.

J'espère que cela pourrait aider davantage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X