2016-09-21 51 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如果有幫助,請將答案標記爲已接受。 –

相關問題