2 votes

Plugin Pipeline multi-branches chargeant plusieurs fichiers jenkins par branche

Je suis capable de charger automatiquement un fichier Jenkins via le plugin de pipeline multi-branches avec une limitation d'un seul fichier Jenkins par branche.

J'ai plusieurs fichiers Jenkins par branche que je veux charger, j'ai essayé avec la méthode ci-dessous en créant un fichier Jenkins principal et en chargeant des fichiers spécifiques. Dans le code ci-dessous, il fusionne 1.Jenkinsfile y 2.Jenkinsfile comme un seul pipeline.

node {
  git url: 'git@bitbucket.org:xxxxxxxxx/pipeline.git', branch: 'B1P1'
      sh "ls -latr"
          load '1.Jenkinsfile'
              load '2.Jenkinsfile'

}

Existe-t-il un moyen de charger plusieurs codes de pipeline Jenkins séparément à partir d'une même branche ?

1voto

user8096147 Points 11

Je l'ai fait en écrivant une bibliothèque de partage (ref https://jenkins.io/doc/book/pipeline/shared-libraries/ ) contenant le fichier suivant (dans vars/generateJobsForJenkinsfiles.groovy) :

/**
 * Creates jenkins pipeline jobs from pipeline script files
 * @param gitRepoName name of github repo, e.g. <organisation>/<repository>
 * @param filepattern ant style pattern for pipeline script files for which we want to create jobs
 * @param jobPath closure of type (relativePathToPipelineScript -> jobPath) where jobPath is a string of formated as '<foldername>/../<jobname>' (i.e. jenkins job path)
 */
def call(String gitRepoName, String filepattern, def jobPath) {
    def pipelineJobs = []
    def base = env.WORKSPACE
    def pipelineFiles = new FileNameFinder().getFileNames(base, filepattern)

    for (pipelineFil in pipelineFiles) {

        def relativeScriptPath = (pipelineFil - base).substring(1)
        def _jobPath = jobPath(relativeScriptPath).split('/')
        def jobfolderpath = _jobPath[0..-2]
        def jobname = _jobPath[-1]

        echo "Create jenkins job ${jobfolderpath.join('/')}:${jobname} for $pipelineFil"

        def dslScript = []
        //create folders
        for (i=0;  i<jobfolderpath.size(); i++)
            dslScript << "folder('${jobfolderpath[0..i].join('/')}')"

        //create job
        dslScript << """
            pipelineJob('${jobfolderpath.join('/')}/${jobname}') {
                definition {
                    cpsScm {
                        scm {
                            git {
                                remote {
                                    github('$gitRepoName', 'https')
                                    credentials('github-credentials')
                                }
                                branch('master')
                            }
                        }
                        scriptPath("$relativeScriptPath")
                    }
                }
                configure { d ->
                    d / definition / lightweight(true)
                }
            }
            """
        pipelineJobs << dslScript.join('\n')
        //println dslScript
    }

    if (!pipelineJobs.empty)
        jobDsl sandbox: true, scriptText: pipelineJobs.join('\n'), removedJobAction: 'DELETE', removedViewAction: 'DELETE'

}

0voto

hakamairi Points 1442

Il est très probable que vous souhaitiez faire correspondre d'anciens jobs Jenkins (pré pipeline) fonctionnant sur une seule branche d'un projet à un seul pipeline multi-branches. L'approche appropriée serait de créer des étapes qui dépendent des entrées (comme une question à l'utilisateur s'il veut déployer vers staging / live).

Vous pouvez également créer un nouveau job jenkins Pipeline séparé qui fait référence au SCM de votre projet et pointe vers votre autre fichier Jenkins (puis un job pipeline pour chaque autre fichier Jenkins).

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