原文地址:
原標題: 升級Gerrit的commit-msg,檢查git commit時必須填寫開發(fā)任務編號TaskID]
https://www.cnblogs.com/simplestupid/p/9195491.html
公司使用git+gerrit+jenkins進行持續(xù)集成實踐辆雾,其中gerrit用來進行Code Review裸影。另外我們自己研發(fā)了一套敏捷項目管理系統(tǒng)TPM(TeamPlus Management)碘饼,用來管理開發(fā)任務和電子看板。此時有一個需求,希望開發(fā)人員提交的代碼能夠關聯(lián)到TPM上的開發(fā)任務斧账,這樣就能實現(xiàn)需求與代碼的關聯(lián)埋市,實現(xiàn) 需求->backlog->userstory->task->code->build->test->deploy->prod 的全流程數(shù)據(jù)關聯(lián)冠桃。
目前的一個方式是在開發(fā)人員提交代碼的同時,在comments中指定TaskID道宅,其中TaskID是TPM系統(tǒng)中開發(fā)任務編號食听。但是很多時候開發(fā)人員提交代碼是,忘記在comments log中指定TaskID污茵,導致數(shù)據(jù)缺失樱报,不能有效輔助研發(fā)過程改進。
為此泞当,考慮參考Gerrit的commit-msg的方式迹蛤,在commit代碼同時,檢查comments log中是否有指定合法的TaskID襟士。(Gerrit的commit-msg笤受,就是在commit代碼的同事,給comments log增加一個Change-ID編號)
首先敌蜂,修改commit-msg箩兽,增加TaskID的檢查。
# Check for if missing a unique TaskID related with TPM
#
check_TaskID() {
COMMIT_FILE=$MSG
COMMIT_MSG=$(cat $MSG)
TASK_ID=$(echo "$COMMIT_MSG" | grep -Eo "#task[A-Za-z0-9]+")
if [ -z "$TASK_ID" ]; then
echo "[ERROR] Please add TPM TaskID comment logs with a format like 'comment logs #task20180623001'"
exit 1
else
echo "[INFO] StoryId=["$TASK_ID"]"
fi
}
# Check for, and add if missing, a unique Change-Id
#
add_ChangeId() {
...
...
...
check_TaskID
add_ChangeId
其次章喉,是替換舊的commit-msg文件汗贫。
檢索了一遍gerrit-site目錄身坐,沒有發(fā)現(xiàn)commit-msg文件,懷疑是在gerrit.war中落包。解開gerrit.war部蛇,仍然沒有發(fā)現(xiàn)commit-msg文件,懷疑實在某個依賴lib中咐蝇。我們用的gerrit版本是2.12.8涯鲁。翻了一下gerrit的源代碼,commit-msg是在gerrit-server/src/main/resources/com/google/gerrit/server/tools/root/hooks/commit-msg有序,推測是在gerrit-server的依賴lib中抹腿。解開gerrit-server-server.jar后,果然發(fā)現(xiàn)commit-msg旭寿。
gerrit2.15版本的hooks在./WEB-INF/lib/gerrit-server-libserver.jar中,解壓后commit-msg路徑是com/google/gerrit/server/tools/root/hooks
之后有兩種辦法替換:
1警绩、重新編譯gerrit源碼。覺得太麻煩盅称,放棄肩祥。
2、依次解壓gerrit.war和gerrit-server-server.jar缩膝,修改commit-msg混狠,再用jar命令依次打包gerrit-server-server.jar和gerrit.war。
注意打gerrit.war的時候疾层,需要指定Manifest檀蹋,指定gerrit.war的Main-Class: Main,否則java -jar gerrit.war啟動的時候找不到MainClass云芦。
最后俯逾,升級修改后的gerrit。
網(wǎng)上找一找gerrit版本升級的網(wǎng)頁有一堆舅逸。務必注意桌肴,升級之前一定要備份gerrit-site。
1琉历、停止gerrit坠七。 cd gerrit-site/bin; sh gerrit.sh stop
2、備份gerrit-site
3旗笔、啟動新的gerrit彪置。 java -jar new-gerrit.war init -d gerrit-site
之后基本上一路回車就行。這個過程會替換gerrit-site/bin/gerrit.war蝇恶,并會重新配置一遍gerrit拳魁。
驗證效果
1、啟動gerrit撮弧。 cd gerrit-site/bin; sh gerrit.sh start
2潘懊、打開 http://gerrit地址/tools/hooks/commit-msg姚糊,查看是否是修改以后的文件。
3授舟、git clone項目測試救恨。
:~/code>git clone ssh://[項目地址] && scp -p -P 29418 [gerrit地址]:hooks/commit-msg AgileMng/.git/hooks/
Cloning into 'AgileMng'...
remote: Counting objects: 1952, done
remote: Finding sources: 100% (1952/1952)
remote: Total 1952 (delta 918), reused 1870 (delta 918)
Receiving objects: 100% (1952/1952), 1.17 MiB, done.
Resolving deltas: 100% (918/918), done.
commit-msg 100% 4946 4.8KB/s 00:00
:~/code/AgileMng>touch 1
:~/code/AgileMng>git add 1
:~/code/AgileMng>git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: 1
#
:~/code/AgileMng>git commit -m "add new file 1"
[ERROR] Please add TPM TaskID in comment logs with a format like 'comment logs #task20180623001'
:~/code/AgileMng>git commit -m "add new file 1 #task20180618 new file 1"
[INFO] TaskId=[#task20180618]
[master 48daaed] add new file 1 #task20180618 new file 1
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 1