当我的主分支启用了GitHub分支保护时,我正在寻找一个很好的流程来管理项目的版本号。
在理想的世界中,当您合并到“发布”分支时,您的持续集成服务器将运行其测试,然后自动增加项目的版本号并返回到您的SCM系统。
但是,通过分支保护,您无法在没有Pull请求的情况下提交到您的分支,因此您有一个catch-22,当CI服务器尝试更新版本号时,CI服务器无法将其推送到受保护的分支。
我可以想到一些解决方法,所有这些都是次优的:
我希望还有其他我没有想过的选择。
我们使用的是Javascript和npm,但我认为这个问题与语言无关,例如,Java和Maven肯定存在同样的问题。
答案 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类似的设置。