最近公司的项目将代码仓库迁移到了gitlab中,为了代码安全,gitlab中的开发分支被设置成了受保护的分支,每次提交都要走下面的流程:

本地开发分支 -> 新建临时分支 -> 将临时分支上传仓库 -> 创建合并请求 -> 删除本地临时分支 -> 切换会开发分支

每次都是如此麻烦的流程,因此便萌生了使用shell脚本完成这些机械的过程。

一、思路

1、本地进行提交
2、创建提交分支
3、将分支上传到gitlab中
4、使用gitlab的api创建合并请求
5、切换回开发分支
6、删除提交分支

二、准备工作

2.1 获取用户token

setting -> Access Token

2.2、获取项目id

如何获取 project id

  • 11.4以上版本,project id 在项目首页
    进入你的项目,就可以获取到项目id
    setting

  • 10.2 以上版本,项目详情页 -> Settings -> General -> Expand General Settings
    setting

  • 如果没有Project ID,你可以使用项目的路径

2.3、查看API

GitLab API

在这,需要关注几个参数:

id: 上一步获取到的项目id

source_branch: 源分支(你推送上去的分支)

source_branch: 目标分支(你需要合并进去的分支)

title: 请求合并时的标题

remove_source_branch:合并成功后是否需要删除源分支(一般选择true)

三、脚本

#!/bin/sh
function rand(){
min=$1
max=$(($2-$min+1))
num=$(($RANDOM+1000000000)) #增加一个10位的数再求余
echo $(($num%$max+$min))
}
#echo "参数数量:$#"
echo "commit 信息:$1"
#git add -A

if [ $# -lt 1 ]; then
echo "请输入commit 信息"
exit -1
fi

git commit -m "$1"
branch_name="lyy_$(rand 40000 50000)"
#branch_name="lyy"
git checkout -b $branch_name
echo "切换到分支:$branch_name"

git push origin $branch_name

echo "推送完成"

gitlab_token="xxxxx"
project_id=19433339
user_id=
doma="gitlab.com"
base_url="https://$doma/api/v4"
target_branch="master"
title="lyy merge request"

#echo "验证账号"
#curl --insecure --header "Authorization: Bearer $gitlab_token" "$base_url/projects/$project_id"

echo "创建合并请求"
web_url=`curl --data-urlencode --insecure --header "Authorization: Bearer $gitlab_token" -d "id=$project_id&source_branch=$branch_name&target_branch=$target_branch&title=$title&remove_source_branch=true" -X POST "$base_url/projects/$project_id/merge_requests" | jq '.web_url'`

echo "合并详情:$web_url"

git checkout $target_branch
git branch -d $branch_name
echo "删除本地分支:$branch_name"

echo "完成"
exit 0

由于我这是使用Curl进行网络传输,需要注意几个点:

–insecure 忽略SSL验证

–header 设置token(gitlab的所有api都需要将你的token设置到头中)

-d 设置Post的请求参数

-X POST 强制使用POST请求

TIP: 如果是比较老的版本,需要将Authorization: Bearer改为PRIVATE-TOKEN:

四、获取合并请求地址

有时,我们可能需要关闭合并请求,这时就需要请求地址了。

在上面使用API创建合并请求时,gitlab会返回一个json字符串给我们,里面便有合并详情的url

setting

因此,我们可以使用jq这个工具解析json,便可以获取到 web_url

4、1安装jq

jq 官网
brew install jq

4.2 使用json解析出 web_url

web_url=`curl xxxx` | jq '.web_url'

最终效果

setting

五、参考地址

Shell 脚本传递参数
Curl Post请求
jq