web-dev-qa-db-fra.com

Comment charger un fichier groovy et l'exécuter

J'ai un jenkinsfile déposé à la racine de mon projet et je voudrais extraire un fichier groovy pour mon pipeline et l'exécuter. La seule manière pour que cela fonctionne est de créer un projet séparé et d'utiliser la commande fileLoader.fromGit. je voudrais faire 

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

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

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()
}
57
Anton Shishkin

Vous devez faire checkout scm (ou un autre moyen de vérifier le code auprès de SCM) avant de faire load.

14
Krzysztof Krasoń

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

Si vous avez un pipeline qui charge plusieurs fichiers groovy et que ces fichiers groovy partagent également des éléments 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
1
awefsome

Ciao, fil très utile, avait le même problème, résolu à vous suivre.

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 avez ou laissez les champs vides.

J'espère que cela pourrait aider davantage.

0
kancio