2017-02-21 5 views
5

ich viele Projekte in verschiedenen Repositories, die die gleichen grundlegenden CI-Workflow zu teilen, die ich als deklarative Pipeline leicht ausdrücken können:Wie eine deklarative Pipeline in vielen Projekten teilen

pipeline { 
    agent any 

    options { 
    buildDiscarder(logRotator(numToKeepStr: '20')) 
    } 

    stages { 
    stage('CI') { 
     steps { 
     echo 'Do CI' 
     } 
    } 

    stage('QA') { 
     steps { 
     echo 'Do QA' 
     } 
    } 
    } 

    post { 
    always { 
     junit allowEmptyResults: true, testResults: '**/target/surefire-reports/TEST-*.xml' 
     // etc... 
    } 

    failure { 
     echo 'Failure mail' 
     // etc 
    } 
    } 
} 

Ich mag würde die Verwendung derselben Deklarativen Pipeline für alle meine Projekte und die Möglichkeit, die Definition der Pipeline an nur einer Stelle zu ändern und die Änderungen automatisch in allen Projekten zu verwenden.

Im Wesentlichen, was ich in einem Projekt zu tun; s Jenkinsfile ist dies:

loadPipelineFromScm 'repository', 'pipeline.groovy' 

Ich kann schon dies mit gemeinsam genutzten Bibliotheken, aber ich bin nicht in der Lage zu verwenden deklarative Pipeline Funktionen dann nicht mehr.

Gibt es eine Möglichkeit, eine Deklarative Pipeline über viele Repositories zu teilen?

+0

Sind Sie sicher, dass eine deklarative Pipeline nicht in einer gemeinsam genutzten Bibliothek arbeiten kann? Die Dokumentation [Deklarative Pipeline: Benachrichtigungen und freigegebene Bibliotheken] (https://jenkins.io/blog/2017/02/15/declarative-notifications/) scheint genau das zu tun. Könntest du etwas ähnliches nicht tun? – herm

Antwort

0

Ich habe das gleiche Problem für meine eigene Arbeit behandelt. Die beste Lösung, die ich kommen könnte mit war gehören ein generic Jenkinsfile in jedem Projekt/repo in meiner Organisation:

node 
{ 
    checkout([$class: 'GitSCM', branches: [[name: env.DELIVERY_PIPELINE_BRANCH]], userRemoteConfigs: [[credentialsId: env.DELIVERY_PIPELINE_CREDENTIALS, url: env.DELIVERY_PIPELINE_URL]]]) 
    stash includes: '*.groovy', name: 'assets', useDefaultExcludes: false 
    load './Jenkinsfile.groovy' 
} 

I verwendet Umgebungsvariablen, falls etwas brauchen, könnte wahrscheinlich ändern dynamischer sein, auch als meine Beispiel aktuell (das ist alles noch in Entwicklung).

Dann stash wird verwendet, um den Rest der groovy Skripte später zu halten und sie in der deklarativen Pipeline zu stürzen.

Schließlich lädt es die Deklarative Pipeline. Verwirrt sich nicht mit den Ansichten, im Grunde verhält sich alles normal.

Also es ist nicht genau das, was Sie gesucht haben, und ich würde lieber die Fähigkeit haben, von SCM in erster Linie zu ziehen. Aber hey, es hat vorerst gut genug für mich gearbeitet.

1

Während die Ansichten mit dem Vorschlag von noober01 intakt bleiben, funktioniert die deklarative Pipeline nicht richtig. Z.B. when-Klauseln werden ignoriert, da erwartet wird, dass das Pipelineelement die oberste Ebene ist, was bedeutet, dass es stattdessen als Skript-Pipeline analysiert wird.

das folgende Problem von dem Team hinter Jenkins abgelehnt Siehe: loading external declarative pipelines issue

Verwandte Themen