2016-09-21 80 views
7

我正在寻找一个良好的流程来管理我的项目的版本号,当我的主分支已启用GitHub分支保护。如何在GitHub受保护的分支中增加版本号?

在一个理想的世界中,当你合并到你的'release'分支时,你的持续集成服务器将运行它的测试,然后自动递增你项目的版本号,并提交给你的SCM系统。

但是,使用分支保护,您不能在没有合并请求的情况下提交给您的分支,因此您有一个catch-22,当您尝试更新版本号时,您的CI服务器无法推送到受保护的分支。

我能想到一些变通的,所有这些都是次优:

  1. 钻机了一个系统,使您的CI服务器会作出PR更新版本。我不确定你是否可以用GitHub做到这一点,但即使这样做最终会为每一个'真正'的PR创建两个Pull请求,这非常尴尬。
  2. 移除分支保护 - 现在任何人都可以推什么树枝,你必须通过手动过程
  3. 手动更新的版本拉请求之前来管理你的开发人员。这略好于#2,但它为开发人员在选择新版本号时出错或将合适的版本号合并到错误的分支上打开了大门。

我希望有其他的选择,我没有想到。

我们正在使用Javascript和npm,但我相信问题是语言不可知的,当然也存在与Java和Maven相同的问题。

回答

1

我使用git tags来自动使用Jenkins进行版本控制。所以每次作业都会花费最后的tag并增加它。由于标签与提交不同,因此添加标签不会与Branch Protection发生冲突。

# 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函数,它将取出最后一个标记,并在构建时使用版本号。

/* 
* 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的类似设置。

+0

但是,这不会将版本ID提交回正确的项目? – JBCP

+0

否版本信息根本不在项目中。它在jenkins每次在主分支上看到更新的'git标签中。该项目只知道如何从最后的'tag'中取出版本信息。所以是的,没有反馈。 –

+0

@JBCP如果有帮助,请将答案标记为已接受。 –