前提:
公司对gitlab的管理定义的规范,所有人都需要遵守此规范。规范大概如下:
1.确保每个应用代码库有develop(开发)、prepub(预发)、及master(产线)分支
2.对于产线bug,从master拉取代码到bugfix分支修改--->合并至master ,将bugfix-->develop bugfix-->prepub
3.并行功能的开发。基于develop分别拉取子分支,命名feature-xx
4.master、prepub做严格管控,只有leader,运维人员有权限push,merge
5.对每次产线发布前对master分支打tag,用于代码的回滚
运维的烦恼:
每次应用发布之前,会有很多重复而又会误操作的代码合并问题,一直伴随着。。。。
目的:
把所有代码的合并,都交给script来处理,一次编写永久使用,及不会出现误操作也可减轻运维工作量
此处贴出自己的脚本,希望各位给出自己的看法,是否有其他可以改进的地方
#!/bin/bash
work_dir=/Users/xxx/git-manage
project=$1
appname=$2
src_branch=$3
dest_branch=$4
git_url=git@gxxx.com
group=$1
git_repo=${git_url}:${group}/${appname}.git
set -x
usage() {
echo "USAGE:$0 project appname src-branch dest-branch"
exit 200
}
if [ $# -ne 4 ];then
usage
fi
project_zone() {
mun=$(ls ${work_dir}|awk /^${project}$/'{print $0}')
if [[ $mun = $project ]];then
cd ${work_dir}/$project
else
mkdir -p ${work_dir}/$project
cd ${work_dir}/$project
fi
}
#judge appname exist
app_name() {
var=`ls ${work_dir}/$project|grep "\b$appname\b"`
if [[ ! -z $var ]];then
cd $appname
else
git clone ${git_repo}
cd $appname
fi
}
#src-branch judge
srcBranch() {
#check remote git branch
local remote_branch=$(git branch -r |grep "\b${src_branch}\b"|awk -F / /^${src_branch}$/'{print $NF}')
local local_branch=$(git branch|grep "\b${src_branch}\b"|awk '{print $NF}')
if [[ $remote_branch = $src_branch ]];then
if [[ $local_branch = $src_branch ]];then
git checkout $src_branch
git pull origin $src_branch
else
git checkout -b $src_branch origin/${src_branch}
git pull origin $src_branch
fi
else
echo "remote git server not exist the ${src_branch}"
exit 203
fi
}
destBranch() {
local remote_branch=$(git branch -r |grep "\b${dest_branch}\b"|grep -v HEAD|awk -F / /^${dest_branch}$/'{print $NF}')
local local_branch=$(git branch |grep "\b${dest_branch}\b"|awk '{print $NF}')
if [[ $remote_branch = $dest_branch ]];then
if [[ $local_branch == $dest_branch ]];then
git checkout $dest_branch
git pull origin $dest_branch
else
git checkout -b $dest_branch origin/${dest_branch}
git pull origin $dest_branch
fi
else
echo "remote git server not exist the ${dest_branch}"
exit 204
fi
}
merge_code() {
local local_branch=$(git branch|grep "\*"|awk '{print $NF}')
local date=`date +%F`
local merge_code=`git status|grep -i "conflict"|wc -l`
if [ $dest_branch = "master" ];then
git tag v"$date"_before
git push --tags
git merge $src_branch
if [ $merge_code -ge 1 ];then
echo "$project $appname merge conflict" > $work_dir/confilct.txt
else
git push origin $dest_branch
echo "code merge successed"
cd $work_dir
fi
else
git merge $src_branch
if [ $merge_code -ge 1 ];then
echo "$project $appname merge conflict" > $work_dir/confilct.txt
cd $work_dir
exit 234
else
git push origin $dest_branch
echo "code merge successed"
cd $work_dir
fi
fi
}
project_zone
app_name
srcBranch
destBranch
merge_code