Search code examples
jenkinssvnmultibranch-pipeline

Multibranch Pipeline in Jenkins with SVN


I have SVN as my SCM. The SVN Root URL structure is as follows. https://svn.domain.com/orgName

Under this, I have a folder called "test". Then I have tags, branches and trunk. For example, https://svn.domain.com/orgName/test/trunk
https://svn.domain.com/orgName/test/branches

Under trunk and branches, I have various modules. One module is Platform which is the core module. The URL structure for my project under Platform is as follows.

https://svn.domain.com/orgName/test/trunk/Platform/MyProject https://svn.domain.com/orgName/test/branches/Platform/1.0.0.0/MyProject

Not sure if the above structure is correct or not. But this is how it is structured in my organization and it can't be changed. Now, I have the following questions.

  1. At what level should I maintain the Jenkinsfile?
  2. How should I pass the branch name (including trunk) to this file?

It will be great if someone can provide some details (if possible step by step) on how to use Multibranch pipeline with SVN. Unfortunately, I could not find any tutorial or examples to achieve this.


Solution

  • I figured this out on my own. Here are the details, in case, someone needs help.

    For Trunk, add the Jenkinsfile inside trunk/Platform (in my case) and for Branches, add Jenkinsfile inside branches/Platform/ folder. For branches, it is better to keep the Jenkinsfile inside each version folder since it has some benefits. This approach will create a Jenkins job for each version.

    In the Jenkins job (for multibranch pipeline), add the base url for Project Repository Base. In my case, it is https://svn.domain.com/orgName/test. In Include branches field, add trunk/Platform, branches/Platform/* in my case. In Jenkinsfile, to get branch name, use the built in variable $BRANCH_NAME. This gives trunk/Platform for trunk and branches/Platform/1.0.0.0 (for example) for branches.

    Only challenge is that job names are created like Trunk/Platform, Branches/Platform/1.0.0.0. So the workspace gets created like Trunk%2FPlatform, Branches%2FPlatform%2F1.0.0.0 since "/" gets encoded with %2F. While using in jobs, make sure the job name is appropriately modified using the below code.

    def cws = "${WORKSPACE_DIR}\\" + "${JOB_NAME}".replace("%2F","_").replace("/","\\")
    echo "\u2600 workspace=${cws}"
    def isTrunk = "${JOB_NAME}".toLowerCase().contains("trunk")
    def version = ""
    def verWithBldNum = ""
    echo "\u2600 isTrunk=${isTrunk}"
    if(!isTrunk)
     {
        version = "${JOB_NAME}".substring("${JOB_NAME}".lastIndexOf("%2F") + 3, "${JOB_NAME}".length())
        echo "\u2600 version=${version}"
        verWithBldNum = "${version}".substring(0, "${version}".lastIndexOf('.') + 1) + "${BUILD_NUMBER}"
        echo "\u2600 verWithBldNum=${verWithBldNum}"
     }
    else
    {
        echo "\u2600 Branch is Trunk"
    }