2015-05-13 51 views
3

目前,我們已經爲聲納亞軍配置了pre commit hook for subversion。現在我們的項目正在轉向Git(Gitlab),所以我們需要將我們的預提交鉤子移至Git預提交和預推鉤子。Git pre commit and pre push hook for sonar runner

我們有兩個要求

  1. 對於每一個提交/推它應該運行聲納(使用本地安裝 聲納亞軍)靜態代碼分析和發現任何違法然後 它應該拒絕提交/推。

  2. 對於每個提交/推送應該有有效的jira id,它是 分配給推送代碼給git的人。 Jira id應該是 提交消息的一部分。

有沒有人已經實現了鉤子?

+0

問找到的工具一般是題外話這裏,請參閱http://stackoverflow.com/help/on-topic獲取完整列表 – jthill

+0

@jthill我是n找到工具在這裏。我正在尋找解決方案。 –

+0

@SilentWarrior您是否找到適合您的解決方案?你想與社區分享嗎?我會感興趣! – Jan

回答

0

我還在尋找聲納的鉤子。但我可以給你JIRA號碼檢查掛鉤。該鉤子只檢查JIRA服務器上的JIRA號碼是否有效。

的JIRA號檢查鉤客戶端commig-msg

#!/bin/bash 

JIRA_API_ISSUE_URL=http://jira7.{xxxxx}.org/rest/api/latest/issue/ 
HARD_MODE="false" 
TIME_OUT=3 

$(grep -i 'merge' "$1") 
result=$? 
if [ $result -eq 0 ];then 
    # echo "INFO : can commit because 'merge' keyword exists." 
    exit 0 
fi 

jira_num=$(grep -ohE -m 1 '[ABCDEFGHIJKLMNOPQRSTUVWXYZ0-9]+-[0-9]+' "$1" | head -1) 
if [ "${jira_num}" == "" ];then 
    echo "ERROR : commit does not contains JIRA_NUM. for example: PROJ-123" 
    exit 1 
fi 
check_url=${JIRA_API_ISSUE_URL}${jira_num} 
http_response=$(curl -m ${TIME_OUT} --write-out %{http_code} --silent --output /dev/null ${check_url}) 

if [ ${HARD_MODE} == "true" ];then 
    if [ "$http_response" -eq "401" ]; then 
     # echo "INFO : can find jira issue number, allow commit"; 
     exit 0; 
    else 
     echo "ERROR : can not find the jira issue num:${jira_num}, please check: ${check_url}"; 
     exit 1; 
    fi 
else 
    if [ "$http_response" -eq "404" ]; then 
     echo "ERROR : can not find the jira issue num:${jira_num}, please check: ${check_url}"; 
     exit 2; 
    elif [ "$http_response" -eq "000" ]; then 
     echo "WARN : request time out or error occured, url:${check_url}, but allow commit in loose mode."; 
     exit 0; 
    else 
     # echo "INFO : http response:${http_response}, not 404, allow commit. url: ${check_url}"; 
     exit 0; 
    fi 
fi 

服務器端update

#!/bin/bash 

JIRA_API_ISSUE_URL=http://jira7.{xxxxx}.org/rest/api/latest/issue/ 
TIME_OUT=5 

# --- Command line 
refname="$1" 
oldrev="$2" 
newrev="$3" 

# --- Safety check 
# if [ -z "$GIT_DIR" ]; then 
# echo "Don't run this script from the command line." >&2 
# echo " (if you want, you could supply GIT_DIR then run" >&2 
# echo " $0 <ref> <oldrev> <newrev>)" >&2 
# exit 1 
# fi 

if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then 
    echo "usage: $0 <ref> <oldrev> <newrev>" >&2 
    exit 1 
fi 

hashStrs="" 
if [[ "$oldrev" =~ ^0+$ ]]; then 
    # list everything reachable from newrev but not any heads 
    hashStrs=$(git rev-list $(git for-each-ref --format='%(refname)' refs/heads/* | sed 's/^/\^/') "$newrev") 
else 
    hashStrs=$(git rev-list "$oldrev..$newrev") 
fi 

# echo ${hashStrs} 

hashArr=($hashStrs) 
for hash in "${hashArr[@]}"; do 
    message=$(git cat-file commit ${hash} | sed '1,/^$/d') 
    if grep -i 'merge'<<<"$message";then 
      # echo "INFO : branch: ${refname}, hash: ${hash}, 'merge' keyword exists. continue check other commit.." 
     continue 
    fi 

    jira_num=$(grep -ohE -m 1 '[ABCDEFGHIJKLMNOPQRSTUVWXYZ0-9]+-[0-9]+' <<< "$message" | head -1) 

    if [ "${jira_num}" == "" ];then 
     echo "ERROR : branch: ${refname}, hash commit (${hash}) does not contains JIRA_NUM. for example: PROJ-123" 
     exit 1 
    fi 
    check_url=${JIRA_API_ISSUE_URL}${jira_num} 
    http_response=$(curl -m ${TIME_OUT} --write-out %{http_code} --silent --output /dev/null ${check_url}) 

    if [ "$http_response" -eq "401" ]; then 
     # echo "INFO : branch: ${refname}, hash commit (${hash}) can find jira issue number, continue check other commit.."; 
     continue; 
    else 
     echo "ERROR : branch: ${refname}, hash commit (${hash}) can not find the jira issue num:${jira_num}, http code return:"${http_response}", please  check: ${check_url}"; 
     exit 1; 
    fi 

done 


# --- Finished 
# echo "INFO : branch: ${refname}, all commits with JIRA numbers, allow commit." 
exit 0 

參考:
http://note.youdao.com/noteshare?id=6cfe6bd7da2f5c009ac04061e24c4991