我们正在使用Jenkins管道多分支插件与蓝海。通过阅读,我相信将项目的构建号与Jenkins运行联系起来是很常见的,因为这允许从安装的应用程序到CI系统,然后到源代码控制中的更改,再到促使更改的问题的可追溯性。问题是,对于每个分支,运行号从0开始。对于具有多个分支的项目,似乎不可能保证唯一的内部版本号。
qlckcl4x1#
你可以从$GIT_BRANCH中获取Git分支名称,并将其添加到$BUILD_NUMBER中,以创建一个跨分支的唯一ID(只要你的公司没有被大公司接管,将你迁移到另一个Jenkins服务器并重置所有内部版本号:为了防止 * 该 *,您可能需要使用$BUILD_URL)。唯一的问题是$GIT_BRANCH包含/字符,加上命名分支时使用的任何字符,这些字符可能允许也可能不允许出现在所有需要ID的位置。($BUILD_URL也将包含:和/这样的字符)如果这是一个问题,一个解决方案是删除tr中不需要的字符:
$GIT_BRANCH
$BUILD_NUMBER
$BUILD_URL
/
:
tr
export MY_ID=$(echo $GIT_BRANCH-$BUILD_NUMBER | tr -dc [A-Za-z0-9-])
(-dc表示删除这些字符的补充,因此A-Z、a-z、0-9和-是您要 * 保留 * 的字符。)
-dc
A-Z
a-z
0-9
-
wi3ka0sx2#
也许您不想使用唯一的(全局数字)内部版本号,而是尝试使用唯一的(全局)内部版本显示名称?根据“管道语法:全局变量引用”currentBuild.displayName是可写属性。因此,您可以向构建号添加附加信息(以便使其全局唯一),并在后续工件/应用构建步骤中使用该字符串(以便将其合并到应用的版本输出中,以实现所需的可跟踪性),例如:
currentBuild.displayName
currentBuild.displayName = "${env.BRANCH_NAME}-${currentBuild.id}"
使用构建的计划或开始时间格式(currentBuild.timeInMillis)作为可读日期,或使用SCM修订版本可能也很有用,例如生成“20180119-091439-rev 149923”。另见:
currentBuild.timeInMillis
o3imoua43#
一种方法是让一个作业从所有分支调用,并使用它的内部版本号。这个作业可以只是一个普通的管道作业,带有一个虚拟的Jenkinsfile,如echo“hello”。然后像这样调用它
def job = build job: 'build number generator', quietPeriod: 0, parameters: [ string(value: "${BRANCH_NAME}-${BUILD_NUMBER}", name: 'UID') ] def BNUMBER = job.getNumber().toString() currentBuild.displayName = "build #"+BNUMBER echo BNUMBER
不确定是否需要该UID参数,但它强制对“构建编号生成器”作业的所有调用都是唯一的,因此Jenkins不会优化同时发生的构建以使用相同的“构建编号生成器”作业。
rdlzhqv94#
您可以使用外部服务来管理项目的唯一内部版本号。这也有助于跨分支机构和CI服务器获取唯一内部版本号。https://www.nextbuildnumber.net/
4条答案
按热度按时间qlckcl4x1#
你可以从
$GIT_BRANCH
中获取Git分支名称,并将其添加到$BUILD_NUMBER
中,以创建一个跨分支的唯一ID(只要你的公司没有被大公司接管,将你迁移到另一个Jenkins服务器并重置所有内部版本号:为了防止 * 该 *,您可能需要使用$BUILD_URL
)。唯一的问题是
$GIT_BRANCH
包含/
字符,加上命名分支时使用的任何字符,这些字符可能允许也可能不允许出现在所有需要ID的位置。($BUILD_URL
也将包含:
和/
这样的字符)如果这是一个问题,一个解决方案是删除tr
中不需要的字符:(
-dc
表示删除这些字符的补充,因此A-Z
、a-z
、0-9
和-
是您要 * 保留 * 的字符。)wi3ka0sx2#
也许您不想使用唯一的(全局数字)内部版本号,而是尝试使用唯一的(全局)内部版本显示名称?
根据“管道语法:全局变量引用”
currentBuild.displayName
是可写属性。因此,您可以向构建号添加附加信息(以便使其全局唯一),并在后续工件/应用构建步骤中使用该字符串(以便将其合并到应用的版本输出中,以实现所需的可跟踪性),例如:使用构建的计划或开始时间格式(
currentBuild.timeInMillis
)作为可读日期,或使用SCM修订版本可能也很有用,例如生成“20180119-091439-rev 149923”。另见:
o3imoua43#
一种方法是让一个作业从所有分支调用,并使用它的内部版本号。这个作业可以只是一个普通的管道作业,带有一个虚拟的Jenkinsfile,如echo“hello”。然后像这样调用它
不确定是否需要该UID参数,但它强制对“构建编号生成器”作业的所有调用都是唯一的,因此Jenkins不会优化同时发生的构建以使用相同的“构建编号生成器”作业。
rdlzhqv94#
您可以使用外部服务来管理项目的唯一内部版本号。这也有助于跨分支机构和CI服务器获取唯一内部版本号。https://www.nextbuildnumber.net/