Search code examples
jenkinsgitlabjenkins-pipelinejenkins-job-dslgitlab-api

Create multiple Jenkins jobs from same repo via SEED job


I have a repository with multiple Jenkinsfiles (at least there will be multiple Jenkins files) and I want to setup the Jobs in Jenkins using a SEED job.

So far I can set up one job based on my remote repository.

#!/usr/bin/env groovy

/*
 * Setup jobs from gitlab project docker-jenkins-pipelines
 */
def createPipelineJob(final String repo) {

    String repoName = repo.substring(repo.lastIndexOf("/") + 1, repo.length())

    pipelineJob(repoName) {
        definition {
            cpsScm {
                scm {
                    git {
                        remote {
                            url('git@gitlab.com:' + repo +'.git')
                        }

                        branches('*/main')
                        //branches('*/feat*')
                    }
                }

                scriptPath("src/main/jobs/ADMIN-initialize-repository/Jenkinsfile")
            }
        }
    }
}

createPipelineJob('sommerfeld.sebastian/docker-jenkins-pipelines')

Now I would like to iterate all folders in my repo (https://gitlab.com/sommerfeld.sebastian/docker-jenkins-pipelines/-/tree/main/src/main/jobs) and create separate jobs for all Jenkinsfiles.

I would like to have some sort of wildcard for src/main/jobs/*/Jenkinsfile. But looping the folder would be okay too and mybe even better because I could better define the jobnames.

But I don't know how to iterate the folders. Can anyone give me a hint on how to do that? Is there an APi call for gitlab.com or something?


Solution

  • I would suggest to not use the API. You do have groovy at hand, and you can iterate through the files. When you checkout the repository you have all information.

    https://stackoverflow.com/a/38899519/3708208 is a good starting point to iterate over the files with groovy, there might be some sandbox security limitations, but this shows how you can iterate over a set of files. Calling the method to create the pipeline jobs should be something like:

        new File(parentPath).traverse(type: groovy.io.FileType.FILES, nameFilter: ~/Jenkinsfile/) { it ->
            createPipelineJob("sommerfeld.sebastian/docker-jenkins-pipelines/${it.parent.name}")
        } //code untested :)