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

JBC*_*BCP 10 versioning github

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

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

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

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

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

我希望还有其他我没有想过的选择.

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

小智 4

我曾经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))
Run Code Online (Sandbox Code Playgroud)

该脚本适用于简单的整数版本号,但如果您愿意,可以遵循 semver。这是一个 Android 项目,所以我添加了一个 gradle 函数,该函数会取出最后一个标签,并在构建时使用 if 作为版本号。

/*
 * 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()
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这适用于从 GitHub 发布版本,但对于版本是代码一部分的 R 或 python 包来说,它不起作用。 (2认同)