代码之家  ›  专栏  ›  技术社区  ›  pingu

如何使用Jenkins&管道多分支插件跨分支获得唯一的构建编号

  •  15
  • pingu  · 技术社区  · 7 年前

    我们正在使用Jenkins Pipeline Multibranch插件和Blue Ocean。

    通过我的阅读,我认为将项目的构建编号与Jenkins运行联系起来是很常见的,因为这允许从已安装的应用程序到CI系统,再到源代码控制的更改,再到引发更改的问题的可追溯性。

    问题是,对于每个分支,运行编号从0开始。对于具有多个分支的项目,似乎不可能保证唯一的内部版本号。

    3 回复  |  直到 6 年前
        1
  •  7
  •   Silas S. Brown    5 年前

    你可以 get the Git branch name from $GIT_BRANCH 并将此添加到 $BUILD_NUMBER 创建跨分支机构的唯一ID(只要您的公司不做类似于让自己被一家大型公司接管的事情,该公司会将您迁移到另一个Jenkins服务器并重置所有内部版本号:以防止 那个 ,您可能要使用 $BUILD_URL ).

    唯一的障碍是 $GIT\u分行 包含 / 字符,加上命名分支时使用的任何字符,这些字符可能在需要ID的所有位置都被允许,也可能不被允许( $BUILD\u URL 还将包含以下字符 : / )如果这是一个问题,一个解决方法是使用 tr :

    export MY_ID=$(echo $GIT_BRANCH-$BUILD_NUMBER | tr -dc [A-Za-z0-9-])
    

    ( -dc 表示删除这些字符的补码,因此 A-Z , a-z , 0-9 - 是您想要的字符 保持 .)

        2
  •  5
  •   Reinhold Füreder    7 年前

    您可能希望尝试使用唯一的(全局)生成显示名称,而不是唯一的(全局数字)生成编号?

    currentBuild.displayName 是可写属性。因此,您可以例如向构建编号添加其他信息(以使其全局唯一),并在后续工件/应用程序构建步骤中使用该字符串(将其合并到应用程序的版本输出中以实现所需的可追溯性),例如:

    currentBuild.displayName = "${env.BRANCH_NAME}-${currentBuild.id}"
    

    使用已格式化的生成计划或开始时间( currentBuild.timeInMillis )作为可读日期,或使用SCM修订版也可能有用,例如导致“20180119-091439-rev149923”。

    另请参见:

        3
  •  4
  •   Hannu Taskinen    4 年前

    一种方法是拥有一个从所有分支调用并使用其内部版本号的作业。该作业可以只是一个普通的管道作业,带有一个类似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参数,但它会强制所有对“build number generator”作业的调用都是唯一的,这样Jenkins就不会优化同时发生的生成以使用相同的“build number generator”作业。