使用 SVN 在 Jenkins 中使用多分支管道

Multibranch Pipeline in Jenkins with SVN

我有 SVN 作为我的 SCM。 SVN RootURL结构如下。 https://svn.domain.com/orgName

在此之下,我有一个名为“test”的文件夹。然后我有标签、分支和主干。例如, https://svn.domain.com/orgName/test/trunk
https://svn.domain.com/orgName/test/branches

在主干和分支下,我有各种模块。一个模块是Platform,它是核心模块。我的项目在 Platform 下的 URL 结构如下。

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

不确定上面的结构是否正确。但这就是它在我的组织中的结构,无法更改。现在,我有以下问题。

  1. 我应该在什么级别维护 Jenkinsfile?
  2. 我应该如何将分支名称(包括主干)传递给这个文件?

如果有人能提供一些关于如何将多分支管道与 SVN 结合使用的详细信息(如果可能的话,一步一步),那就太好了。不幸的是,我找不到任何教程或示例来实现这一点。

这是我自己想出来的。以下是详细信息,以防有人需要帮助。

对于 Trunk,将 Jenkinsfile 添加到 trunk/Platform 中(在我的例子中),对于 Branches,将 Jenkinsfile 添加到 branches/Platform/ 文件夹中。对于分支,最好将 Jenkinsfile 保存在每个版本文件夹中,因为它有一些好处。这种方法将为每个版本创建一个 Jenkins 作业。

在 Jenkins 作业(对于多分支管道)中,为 Project Repository Base 添加基础 url。在我的例子中,它是 https://svn.domain.com/orgName/test。在 Include branches 字段中,在我的例子中添加 trunk/Platform、branches/Platform/*。在 Jenkinsfile 中,要获取分支名称,请使用内置变量 $BRANCH_NAME。这为主干提供 trunk/Platform,为分支提供 branches/Platform/1.0.0.0(例如)。

唯一的挑战是创建的作业名称类似于 Trunk/Platform、Branches/Platform/1.0.0.0。因此,工作区的创建类似于 Trunk%2FPlatform、Branches%2FPlatform%2F1.0.0.0,因为“/”使用 %2F 编码。在作业中使用时,请确保使用以下代码适当修改作业名称。

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"
}