我如何使用 Jenkins 和 Pipeline Multibranch 插件跨分支拥有唯一的内部版本号
How can I have unique build numbers across branches with Jenkins & the Pipeline Multibranch Plugin
我们正在使用 Jenkins Pipeline Multibranch Plugin with Blue Ocean。
通过我的阅读,我认为将项目的内部版本号与 Jenkins 运行 相关联是很常见的,因为这允许从已安装的应用程序到 CI 系统的可追溯性,然后到源代码管理的更改,然后是提示更改的问题。
问题是对于每个分支,运行编号都是从0开始的。对于一个有多个分支的项目,似乎无法保证唯一的内部版本号。
也许您可能想尝试使用唯一(全局)构建显示名称而不是唯一(全局数字)构建编号?
根据"pipeline syntax: global variables reference" currentBuild.displayName
是可写的属性。所以你可以例如向构建号添加附加信息(以使其全局唯一)并在后续 artifact/application 构建步骤中使用该字符串(将其合并到应用程序的版本输出中以实现所需的可追溯性),例如类似于:
currentBuild.displayName = "${env.BRANCH_NAME}-${currentBuild.id}"
使用构建的时间表或格式化的开始时间 (currentBuild.timeInMillis
) 作为可读日期,或使用 SCM 修订版也可能有用,例如导致“20180119-091439-rev149923”。
另请参阅:
您可以 get the Git branch name from $GIT_BRANCH
并将其添加到 $BUILD_NUMBER
以创建跨分支机构唯一的 ID(只要您的公司不做类似让自己被一家大公司接管的事情)将您迁移到另一个 Jenkins 服务器并重置所有内部版本号:为了防止 that,您可能需要使用 $BUILD_URL
).
唯一的障碍是 $GIT_BRANCH
包含 /
字符,以及您在命名分支时使用的任何字符,并且在您需要 ID 的所有地方可能允许也可能不允许使用这些字符。 ($BUILD_URL
还将包含 :
和 /
等字符)如果这是一个问题,一种解决方法是使用 tr
:[=26= 删除不需要的字符]
export MY_ID=$(echo $GIT_BRANCH-$BUILD_NUMBER | tr -dc [A-Za-z0-9-])
(-dc
表示删除这些字符的补码,所以A-Z
、a-z
、0-9
和-
就是你要删除的字符保持.)
一种方法是从所有分支调用一个作业并使用它的内部版本号。该作业可以只是一个普通的管道作业,带有一个像 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 不会优化同时发生的构建以使用相同的“内部版本号生成器”作业。
我们正在使用 Jenkins Pipeline Multibranch Plugin with Blue Ocean。
通过我的阅读,我认为将项目的内部版本号与 Jenkins 运行 相关联是很常见的,因为这允许从已安装的应用程序到 CI 系统的可追溯性,然后到源代码管理的更改,然后是提示更改的问题。
问题是对于每个分支,运行编号都是从0开始的。对于一个有多个分支的项目,似乎无法保证唯一的内部版本号。
也许您可能想尝试使用唯一(全局)构建显示名称而不是唯一(全局数字)构建编号?
根据"pipeline syntax: global variables reference" currentBuild.displayName
是可写的属性。所以你可以例如向构建号添加附加信息(以使其全局唯一)并在后续 artifact/application 构建步骤中使用该字符串(将其合并到应用程序的版本输出中以实现所需的可追溯性),例如类似于:
currentBuild.displayName = "${env.BRANCH_NAME}-${currentBuild.id}"
使用构建的时间表或格式化的开始时间 (currentBuild.timeInMillis
) 作为可读日期,或使用 SCM 修订版也可能有用,例如导致“20180119-091439-rev149923”。
另请参阅:
您可以 get the Git branch name from $GIT_BRANCH
并将其添加到 $BUILD_NUMBER
以创建跨分支机构唯一的 ID(只要您的公司不做类似让自己被一家大公司接管的事情)将您迁移到另一个 Jenkins 服务器并重置所有内部版本号:为了防止 that,您可能需要使用 $BUILD_URL
).
唯一的障碍是 $GIT_BRANCH
包含 /
字符,以及您在命名分支时使用的任何字符,并且在您需要 ID 的所有地方可能允许也可能不允许使用这些字符。 ($BUILD_URL
还将包含 :
和 /
等字符)如果这是一个问题,一种解决方法是使用 tr
:[=26= 删除不需要的字符]
export MY_ID=$(echo $GIT_BRANCH-$BUILD_NUMBER | tr -dc [A-Za-z0-9-])
(-dc
表示删除这些字符的补码,所以A-Z
、a-z
、0-9
和-
就是你要删除的字符保持.)
一种方法是从所有分支调用一个作业并使用它的内部版本号。该作业可以只是一个普通的管道作业,带有一个像 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 不会优化同时发生的构建以使用相同的“内部版本号生成器”作业。