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()
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()
}
Vous devez faire checkout scm
(ou un autre moyen de vérifier le code auprès de SCM) avant de faire load
.
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()
}
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
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.