使用 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
不确定上面的结构是否正确。但这就是它在我的组织中的结构,无法更改。现在,我有以下问题。
- 我应该在什么级别维护 Jenkinsfile?
- 我应该如何将分支名称(包括主干)传递给这个文件?
如果有人能提供一些关于如何将多分支管道与 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"
}
我有 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
不确定上面的结构是否正确。但这就是它在我的组织中的结构,无法更改。现在,我有以下问题。
- 我应该在什么级别维护 Jenkinsfile?
- 我应该如何将分支名称(包括主干)传递给这个文件?
如果有人能提供一些关于如何将多分支管道与 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"
}