2017-08-10 2 views
1

Ich arbeite an einer Jenkins Shared Library.Wo soll ich die Funktion in der Pipeline-Datei platzieren?

Mein Plan ist es, in der Lage zu sein, die Anzahl der Zeilen in jedem Jenkinsfile auf das Minimum zu reduzieren.

Ich möchte in der Lage sein, etwas zu tun wie:

buildProduct() und dass es eine Pipeline bauen ausstellen, die in der gemeinsamen genutzten Bibliothek befindet.

Meine standardPipeline.groovy Datei sieht so aus:

import com.company.utils.pipelineFunctions; 
import com.company.utils.Git; 

def ris = new pipelineFunctions() 

def run_in_stage(String stage_name, Closure command){ 
    ris.run_in_stage(stage_name, command, emailadd) 
} 

def call(body) { 

     def config = [:] 
     body.resolveStrategy = Closure.DELEGATE_FIRST 
     body.delegate = config 
     body() 

     node { 
      // Clean workspace before doing anything 
      deleteDir() 


      try { 
       def ris = new pipelineFunctions() 
       //run_in_stage('Clone', { 
       run_in_stage('Clone', { 
        checkout scm 
       }) 

       stage ('Build') { 
        sh "echo 'building ${config.projectName} ...'" 
       } 
       stage ('Tests') { 
        parallel 'static': { 
         sh "echo 'shell scripts to run static tests...'" 
        }, 
        'unit': { 
         sh "echo 'shell scripts to run unit tests...'" 
        }, 
        'integration': { 
         sh "echo 'shell scripts to run integration tests...'" 
        } 
       } 
       stage ('Deploy') { 
        sh "echo 'deploying to server ${config.serverDomain}...'" 
        sh "echo Itai ganot" 
       } 
      } catch (err) { 
       currentBuild.result = 'FAILED' 
       throw err 
      } 
     } 
    } 

Die pipelineFunctions.groovy Datei sieht so aus:

package com.company.utils; 
import com.company.utils.Git; 

def run_in_stage(String stage_name, Closure command, String sendTo){ 

    def gitTool = new Git() 

    String ulink = gitTool.getCommitter() 
    String jlink = "(<${env.BUILD_URL}|Open>)" 

    println "============================================================" 
    stage (stage_name) { 
     try { 
      command() 
      if (currentBuild.result == 'FAILURE') { 
       error "Build failed, see log for further details." 
      } 
      println "============================================================" 
     } catch (Exception ex) { 
      def except = "${ex}" 
      String emailadd = ulink+'@company.com' 
      if (currentBuild.result == null) { 
      currentBuild.result = "FAILURE" } 
         this.notifyStatus(stage_name, currentBuild.result, except) 
      echo "Pipeline failed at stage: ${stage_name}" 
      throw ex 
     } 
    } 
} 

return this; 

Wenn ich laufen die Build es mit dem folgenden Fehler fehl:

groovy.lang.MissingPropertyException: No such property: ris for class: groovy.lang.Binding 

Ich versuche zu verstehen, wo soll ich die run_in_stage Funktion def Denn wo immer ich es hingebe, führt es dazu, dass der Build fehlschlägt.

Irgendeine Idee, was ich falsch mache?

Antwort

0

In standardPipeline.groovy müssen Sie ris innerhalb der run_in_stage-Methode deklarieren, um es dort verwenden zu können. Z.B .:

import com.company.utils.pipelineFunctions; 
import com.company.utils.Git; 

// This instance may no longer be necessary, not sure if it's used outside run_in_stage 
def ris = new pipelineFunctions() 

def run_in_stage(String stage_name, Closure command){ 
    def ris = new pipelineFunctions() 
    String emailadd = '[email protected]' // edit: for 3rd param 
    ris.run_in_stage(stage_name, command, emailadd) 
} 

Edit: Ich lief diese nach dem Bericht eines nicht näher beschriebener Fehler in den Kommentar, und ich habe die oben mit einem Beispiel dafür, was ich brauchte, aktualisiert hinzuzufügen.

Die oben funktionierte gut für mich (nachdem ich einige andere Sachen zu entfernen, die nicht verfügbar oder nicht relevant war), wenn aus der folgenden Pipeline-Skript aufgerufen:

// just loading above shared library explicitly 
@Library('jenkins-pipeline-library-test') _ 

StandardPipeline { 
    println 'something' 
} 

Edit 2: Hier ist ein Beispiel dafür, was das gemeinsame Bibliothek Projektstruktur werden sollte, da in dem Fall hat keine Verwirrung darüber, wo jede der Dateien platziert werden soll: https://github.com/grdryn/jenkins-pipeline-library-test

+0

ich noch einen Fehler auf dem „def ris = new pipelineFunctions()“ in dem run_in_stage Funktion –

+0

@ItaiGanot erhalten Ich habe das obige und ru neu erstellt n es. Der einzige Fehler, den ich bekam, war sehr explizit: 'groovy.lang.MissingPropertyException: Keine solche Eigenschaft: emailadd für class: StandardPipeline'. Ich habe das Update für das oben hinzugefügt (nur erklärt etwas namens'Emailadd' im Bereich). Ist das der Fehler, dem du begegnet bist, oder war es etwas anderes? –

Verwandte Themen