我们正在使用带有 Blue Ocean 的 Jenkins Pipeline Multibranch 插件。
通过我的阅读,我相信将项目的内部版本号与 Jenkins 运行相关联是很常见的,因为这允许从已安装的应用程序到 CI 系统的可追溯性,然后是源代码控制的更改,然后是提示的问题改变。
问题是对于每个分支,运行号从 0 开始。对于具有多个分支的项目,似乎无法保证唯一的内部版本号。
我们正在使用带有 Blue Ocean 的 Jenkins Pipeline Multibranch 插件。
通过我的阅读,我相信将项目的内部版本号与 Jenkins 运行相关联是很常见的,因为这允许从已安装的应用程序到 CI 系统的可追溯性,然后是源代码控制的更改,然后是提示的问题改变。
问题是对于每个分支,运行号从 0 开始。对于具有多个分支的项目,似乎无法保证唯一的内部版本号。
您可以从中获取 Git 分支名称$GIT_BRANCH
并将其添加到$BUILD_NUMBER
以创建一个跨分支唯一的 ID(只要您的公司不做类似让自己被迁移到另一台 Jenkins 服务器并重置所有内部版本号:为了防止这种情况,您可能需要使用$BUILD_URL
)。
只有 snag$GIT_BRANCH
包含/
字符,以及您在命名分支时使用的任何字符,这些在您想要 ID 的所有地方可能会或可能不会被允许。($BUILD_URL
也将包含像:
和这样的字符/
)如果这是一个问题,一种解决方法是删除不需要的字符tr
:
export MY_ID=$(echo $GIT_BRANCH-$BUILD_NUMBER | tr -dc [A-Za-z0-9-])
(-dc
表示删除这些字符的补码,所以,A-Z
和是您要保留的字符。)a-z
0-9
-
也许您可能想尝试一个唯一的(全局)构建显示名称而不是唯一的(全局数字)构建号?
根据“管道语法:全局变量引用”currentBuild.displayName
是可写属性。因此,您可以例如向构建号添加附加信息(以使其全局唯一)并在后续工件/应用程序构建步骤中使用该字符串(将其合并到应用程序的版本输出中以获得所需的可追溯性),例如:
currentBuild.displayName = "${env.BRANCH_NAME}-${currentBuild.id}"
使用格式为 ( currentBuild.timeInMillis
) 的构建计划或开始时间作为可读日期,或使用 SCM 修订版也可能有用,例如导致“20180119-091439-rev149923”。
也可以看看:
一种方法是拥有一个从所有分支调用的作业并使用它的内部版本号。该工作可以只是一个普通的管道工作,带有一个像 echo "hello" 这样的虚拟 Jenkinsfile。然后就这样称呼它
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 不会优化同时发生的构建以使用相同的“内部版本号生成器”作业。