如何在GitHub受保护的分支中增加版本号?

时间:2016-09-21 16:08:25

标签: github versioning

当我的主分支启用了GitHub分支保护时,我正在寻找一个很好的流程来管理项目的版本号。

在理想的世界中,当您合并到“发布”分支时,您的持续集成服务器将运行其测试,然后自动增加项目的版本号并返回到您的SCM系统。

但是,通过分支保护,您无法在没有Pull请求的情况下提交到您的分支,因此您有一个catch-22,当CI服务器尝试更新版本号时,CI服务器无法将其推送到受保护的分支。

我可以想到一些解决方法,所有这些都是次优的:

  1. 启动系统,以便CI服务器制作PR以更新版本。我不确定你是否能用GitHub做到这一点,但即使这样做最终会为每一个“真正的”PR创建两个Pull请求,这很尴尬。
  2. 删除分支保护 - 现在任何人都可以将任何东西推送到分支机构,您必须通过手动流程管理您的开发人员
  3. 在拉取请求之前手动更新版本。这比#2略胜一筹,但它为开发人员在选择新版本号或将正确的版本号合并到错误的分支时出错提供了大门。
  4. 我希望还有其他我没有想过的选择。

    我们使用的是Javascript和npm,但我认为这个问题与语言无关,例如,Java和Maven肯定存在同样的问题。

1 个答案:

答案 0 :(得分:3)

我使用git tags使用Jenkins自动化版本控制。因此,每次作业运行时,它都会使用最后一个tag并将其递增。由于标记与提交不同,因此添加标记不会与分支保护冲突。

# get last tag
last=$(git describe --abbrev=0 --tags)
# increment and tag again
git tag $(($last + 1))
git push origin $(($last + 1))

此脚本适用于简单的整数版本号,但如果您愿意,可以使用semver。这是一个Android项目所以我添加了一个gradle函数,它将取出最后一个标记,并在构建时使用if for version。

/*
 * Gets the version name from the latest Git tag
 */
def getVersionName = { ->
    def stdout = new ByteArrayOutputStream()
    exec {
        commandLine 'git', 'describe', '--tags'
        standardOutput = stdout
    }
    return stdout.toString().trim()
}

我相信您可以使用与Javascript类似的设置。