已經有兩位同學寫過類似的 wiki 了,值得一看:
為啥我又來湊熱鬧呢?基於下面兩個原由:
-
- 我的機子是 Win10,上面腳本的適用環境是 Mac/Linux
-
- gitlab 倉庫換了地址,導致上面的腳本不可用了
因為我的開發環境是:win10 + vscode + git,計划就在這個基礎上優化提交 request 流程。所以,采用cygwin + shell
來實現下面的功能。
vscode 如何集成 cygwin,可以參考我的這篇文章:vscode 集成 cygwin
提供能力
Create merge request
- 自動識別倉庫/項目名稱和ID
- 當前本地分支作為 source branch
- 手動輸入遠程分支名作為 target branch,默認 test 分支
- 使用 last commit 作為 merge title
Accept merge request
- 提供可選的 Accept merge request 功能
如何在項目中使用?
1、在 win10 上安裝 cygwin
2、在 vscode 中集成 cygwin
3、將下面腳本的 PRIVATE_TOKEN 更改為你自己的后保存為 mr.sh,我把它放在 cygwin 安裝目錄的 /home/廖大爺/sh 文件夾下。ps:你可以把它放在任何位置
4、更改腳本的 GITLAB_URL 為你項目所在的 gitlab 地址
5、打開 cygwin 終端,執行 vim .bashrc
,鍵入alias merge='bash ~/sh/mr.sh'
,保存並退出,再執行source .bashrc
6、使用 vscode 進入項目后,打開 vscode 終端,或使用 cygwin cd 到項目目錄,執行merge
等同於merge test
,或執行merge 其他遠程分支名
mr.sh
#!/bin/bash
set -e
TARGET_BRANCH=$1
if [ -z $TARGET_BRANCH ]; then
TARGET_BRANCH=test
fi
PRIVATE_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxx'
GITLAB_URL='gitlab 倉庫域名,比如 http://192.168.8.258'
REMOTE_URL=$(git remote -v | grep push | awk '{print $2}')
PROJECT_NAME=$(echo $REMOTE_URL | cut -d ':' -f2 | cut -d '.' -f1)
API_URL=$GITLAB_URL/api/v3
PROJECT_URL=$GITLAB_URL/$PROJECT_NAME
assignee_name=xuyang
assignee_id=57
RED_COLOR='\e[31m'
BLUE_COLOR='\e[34m'
END_COLOR='\e[0m'
urlencode() {
local length="${#1}"
for (( i = 0; i < length; i++ )); do
local c="${1:i:1}"
case $c in
[a-zA-Z0-9.~_-]) printf "$c" ;;
*) printf "$c" | xxd -p -c1 | while read x;do printf "%%%s" "$x";done
esac
done
}
getUserId() {
printf $(curl --header \
"PRIVATE-TOKEN: ${PRIVATE_TOKEN}" \
$API_URL/users?username=${assignee_name} | cut -d ',' -f3 | cut -d ':' -f2)
}
getProjectId() {
printf $(curl --header \
"Private-Token: ${PRIVATE_TOKEN}" \
$PROJECT_URL 2>/dev/null | grep 'data-autocomplete-project-id' | cut -d '=' -f4 | cut -d ' ' -f1 | cut -d "'" -f2)
}
echo -e "
${BLUE_COLOR}Get merge request info ... ${END_COLOR}"
projectId=$(getProjectId)
projectId=${projectId:-902}
sourceBranch=$(git branch | grep \* | cut -d ' ' -f2)
targetBranch=$TARGET_BRANCH
title=$(git log -1 --pretty=%B)
# echo merge info
echo -e "
projectId: ${RED_COLOR}$projectId${END_COLOR}
sourceBranch: ${sourceBranch}
targetBranch: ${targetBranch}
title: ${title}
remoteUrl: ${REMOTE_URL}"
# create merge request
createMR() {
title=$(urlencode "$title")
data="source_branch=$sourceBranch&target_branch=$targetBranch&assignee_id=$assignee_id&title=$title"
echo $(curl --header "PRIVATE-TOKEN: ${PRIVATE_TOKEN}" \
--data $data \
"$API_URL/projects/$projectId/merge_requests" 2>/dev/null)
}
echo -e "
${BLUE_COLOR}Creating merge request... ${END_COLOR}"
merge_request_res=$(createMR)
merge_request_id=$(echo $merge_request_res | cut -d ':' -f2 | cut -d ',' -f1)
# Accept merge request
if [[ $merge_request_id == *[0-9] ]]; then
echo -e "
${BLUE_COLOR}Create merge request success! The merge_request_id is $merge_request_id${END_COLOR}"
read -p "Accept this merge request? (y/n) " isConfirm
if [[ $isConfirm == "n" ]]; then
echo -e "
${RED_COLOR}Cancel accept merge request${END_COLOR}"
exit
fi
curl -X PUT --header "PRIVATE-TOKEN: ${PRIVATE_TOKEN}" \
"$API_URL/projects/$projectId/merge_requests/$merge_request_id/merge" \
2>/dev/null
echo "
Merged Success!"
exit
else
echo -e "
${RED_COLOR}Create merge request Fail:${END_COLOR}
$merge_request_res"
fi
echo -e "
${BLUE_COLOR}Click on the link below for more details:${END_COLOR}
$PROJECT_URL/merge_requests
"