批量操作脚本让你5mins搞定发版

代码分支管理

大家在做微服务拆分后,难免会导致Application项目以及一些二房包的数量加剧,10+个项目我想应该是很容易的超过。然后这些细粒度的拆分后就会导致发布版本时候的麻烦。

展示一下现阶段我们的一个git的分支流程图,仅供参考。

http://static.cyblogs.com/git_flow_publish_20210415.jpg

简单说明一下:

  • dev环境每次都是从master拉取一个分支,取名为dev-{发布日期}-{sequenceId}sequenceId01开始叠加,避免一个版本需要反复拉取多次。
  • 到了test阶段,也是为了收敛(前期严格一点)。提测的时候代码需要合并到test分支来。
  • UAT阶段,还是需要从master拉取分支,如果出现要重新拉取分支的情况下,还是严格拉取master分支的代码。主要是为了与master保持一致,避免把别人的覆盖掉。取名为release-{发布日期}-{sequenceId},规则同上。
  • 上生产后,验证完毕后需要把代码合并到master分支,并且打包tag

但是在这个过程中,需要有拉取新分支,合并分支,批量删除分支,打tag等等繁琐的操作,项目一多如果有一个批量脚本就更好了。下面我就列举一些平时使用最多的几个,仅供参考:

批量脚本

01-批量拉取新分支

比如一个新的迭代要开始了,就需要从master拉取dev分支。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#! /bin/bash

# 目录空间
HOME_DIR="/Users/chenyuan"
WORK_DIR=$HOME_DIR"/Workspaces/xxx" // 替换为你的工作目录

# 过滤目录
EXCLUDE_DIR_OR_FILE=("cr-test-demo" "git_batch_co_brach.sh" "git_batch_co_push_remote.sh" "git_batch_co_merge_push_remote.sh")

# 分支名字
OLD_BR_NAME="$1"
NEW_BR_NAME="$2"

# 校验参数
if [ -f $OLD_BR_NAME ]; then
echo "Please input your old branch name."
exit 0
fi

if [ -f $NEW_BR_NAME ]; then
echo "Please input your new branch name."
exit 0
fi

# 切换到某个分支
function gitCheckoutBrachAndPushRemote() {
echo "-------- $1 --------"
cd "$1"
pwd
git checkout $OLD_BR_NAME
git fetch
git pull
git checkout -b $NEW_BR_NAME $OLD_BR_NAME
git push --set-upstream origin $NEW_BR_NAME
echo "success push branch " $NEW_BR_NAME " to remote"
}

## get all folder in "$WORK_DIR"
for i in `ls "$WORK_DIR"`;do
cd "$WORK_DIR"
if [[ -d $i ]] && [[ ! "${EXCLUDE_DIR_OR_FILE[@]}" =~ "${i}" ]];then
gitCheckoutBrachAndPushRemote "$i"
fi
done

具体使用,比如以master为基础拉取一个新分支

1
./git_batch_co_push_remote.sh master dev-20210419-01
02-批量切换分支

做不同的需求时候,需要来回的切换分支。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#! /bin/bash

# 目录空间
HOME_DIR="/Users/chenyuan"
WORK_DIR=$HOME_DIR"/Workspaces/xxx" // 替换为你的工作目录

# 过滤目录
EXCLUDE_DIR_OR_FILE=("cr-test-demo" "git_batch_co_brach.sh" "git_batch_co_push_remote.sh" "git_batch_co_merge_push_remote.sh")

# 分支名字
BR_NAME="$1"

# 校验参数
if [ -f $BR_NAME ]; then
echo "Please input your branch name."
exit 0
fi

# 切换到某个分支
function gitCheckoutBrach() {
cd "$1"
pwd
git fetch
git checkout $BR_NAME
echo "success checkout to " $BR_NAME
}

## get all folder in "$WORK_DIR"
for i in `ls "$WORK_DIR"`;do
cd "$WORK_DIR"
if [[ -d $i ]] && [[ ! "${EXCLUDE_DIR_OR_FILE[@]}" =~ "${i}" ]];then
gitCheckoutBrach "$i"
fi
done

具体的使用,先切换成master分支。

1
./git_batch_co_brach.sh dev-20210412-01
03-批量删除远程分支

有时候不小心写错了分支名字,或者分支太多,需要删除批量删除远程分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#! /bin/bash

# 目录空间
HOME_DIR="/Users/chenyuan"
WORK_DIR=$HOME_DIR"/Workspaces/xxx" // 替换为你的工作目录

# 过滤目录
EXCLUDE_DIR_OR_FILE=("cr-test-demo" "git_batch_co_brach.sh" "git_batch_co_push_remote.sh" "git_batch_co_merge_push_remote.sh")

# 分支名字
BR_NAME="$1"

# 校验参数
if [ -f $BR_NAME ]; then
echo "Please input your branch name."
exit 0
fi

# 切换到某个分支
function doSomething() {
cd "$1"
pwd
git fetch
git push origin --delete $BR_NAME
echo "success delete remote branch: " $BR_NAME
}

## get all folder in "$WORK_DIR"
for i in `ls "$WORK_DIR"`;do
cd "$WORK_DIR"
if [[ -d $i ]] && [[ ! "${EXCLUDE_DIR_OR_FILE[@]}" =~ "${i}" ]];then
doSomething "$i"
fi
done

具体的使用

1
./git_batch_delete_remote.sh dev-20210412-01

结果就是可以把远程分支dev-20210412-01一次性全部删除掉。

04-批量合并分支代码

从一个环境到另外也跟环境,就需要大量的merge操作。其实Gitmerge操作比SVN的要好很多。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#! /bin/bash

# 目录空间
HOME_DIR="/Users/chenyuan"
WORK_DIR=$HOME_DIR"/Workspaces/xxx" // 替换为你的工作目录

# 过滤目录
EXCLUDE_DIR_OR_FILE=("cr-test-demo" "git_batch_co_brach.sh" "git_batch_co_push_remote.sh" "git_batch_co_merge_push_remote.sh")

# 分支名字
BR_NAME="$1"

# 校验参数
if [ -f $BR_NAME ]; then
echo "Please input your branch name."
exit 0
fi

# 切换到某个分支
function gitCheckoutBrach() {
cd "$1"
pwd
git merge $BR_NAME
git push
echo "success merge from branch" $BR_NAME " and push remote"
}

## get all folder in "$WORK_DIR"
for i in `ls "$WORK_DIR"`;do
cd "$WORK_DIR"
if [[ -d $i ]] && [[ ! "${EXCLUDE_DIR_OR_FILE[@]}" =~ "${i}" ]];then
gitCheckoutBrach "$i"
fi
done

具体使用,记得要先更新相关的代码哦~

比如是从dev合并到test,那么先更新对应的代码,然后co到test的目录去。

1
./git_batch_co_merge_push_remote.sh dev-20210412-01
05-批量给分支打tag

比如我们的流程是在上生产后为master打一个新的tag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#! /bin/bash

# 目录空间
HOME_DIR="/Users/chenyuan"
WORK_DIR=$HOME_DIR"/Workspaces/xxx" // 替换为你的工作目录

# 过滤目录
EXCLUDE_DIR_OR_FILE=("cr-test-demo" "git_batch_co_brach.sh" "git_batch_co_push_remote.sh" "git_batch_co_merge_push_remote.sh")

# 分支名字
TAG_NAME=$1

# 校验参数
if [ -f $TAG_NAME ]; then
echo "Please input your tag name."
exit 0
fi

# 切换到某个分支
function doSomething() {
cd "$1"
pwd
git fetch
git checkout master
git tag -a $TAG_NAME -m "创建分支$TAG_NAME"
echo "success create tag " $TAG_NAME
git push origin --tags
echo "success push tag to remote" $TAG_NAME
}

## get all folder in "$WORK_DIR"
for i in `ls "$WORK_DIR"`;do
cd "$WORK_DIR"
if [[ -d $i ]] && [[ ! "${EXCLUDE_DIR_OR_FILE[@]}" =~ "${i}" ]];then
doSomething "$i"
fi
done

具体使用,首先切换为master分支。

1
./git_batch_tag_push.sh v1.0.0
06-批量mvn打包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#! /bin/bash

# 目录空间
HOME_DIR="/Users/chenyuan"
WORK_DIR=$HOME_DIR"/Workspaces/xxx" // 替换为你的工作目录

# 需要deploy的工程
NEED_DEPLOY_DIR_OR_FILE=("xxxx") // 这里添加你要打包的项目名称,空格分开


## get all folder in "$WORK_DIR"
for i in "${NEED_DEPLOY_DIR_OR_FILE[@]}";do
#cd "$WORK_DIR"
echo "$WORK_DIR/$i";
cd "$WORK_DIR/$i";
git pull
mvn install deploy -Dpmd.skip=true -Dcheckstyle.skip=true -Dmaven.test.skip=true
done

具体使用

1
./git_batch_deploy_snapshot.sh

上面的这些脚本也是因为当时自己要发布版本,总共写脚本花费了20~30mins的时候,发布时间也才30mins。如果那天我不写这个脚本,业务我每次都要花费60+mins去做,而且其他不熟悉的人做发布的时候肯定会花费更多的时间。开发就应该把那些重复的事情标准化与产品化。能够真的做到可持续~

参考地址

如果大家喜欢我的文章,可以关注个人订阅号。欢迎随时留言、交流。如果想加入微信群的话一起讨论的话,请加管理员微信号:chengcheng222e,他会拉你们进群。

简栈文化服务订阅号