用Makefile做一点微小的工作
有一个内网服务的模块,升级过程大体是在一个目录A中git pull->go build, 然后B目录中备份->stop->替换->start。这个模块有个control.sh负责起停模块,有个build.sh负责编译,备份是靠cp module module.bak。这样就可能会有备份版办覆盖的问题,比较好的方式是使用模块的版本号作为备份文件后缀。
总的需求就是自动化,可以编译/备份/升级/回滚。备份时候希望按照版本号进行,回滚的时候可以按照指定版本号进行回滚。这种升级方式不可取,作为一个过渡的临时方案.
改造第一步,利用golang 的ldflags
在模块编译的时候给模块指定版本号。版本号就用 short commit id + date
的格式。
第二步,搞一个脚本,调用build backup deploy rollback
,
因为懒得再用shell封装一遍,再加上shell需要解决调用顺序依赖,偷个懒用Makefile 来解决这个问题。
1.先定义版本号
NAME:=module
TAG:= `git describe --always`
DATE:=`date -d @$(shell git log -n1 --format="%ct") +%Y%m%d`
LATESTVERSION:=$(TAG)-$(DATE)
BUILDVERSION:='settings.buildVersion=$(LATESTVERSION)'
LDFLAGS:=-X $(BUILDVERSION)
2.编译
build:
@echo "Building $(NAME)"
go build -ldflags "$(LDFLAGS)" -o $(NAME)
echo "---------------------"
3.备份
backup: check_version
mkdir -p $(BACKUPPATH)
echo "备份$(NAME) cfg/cfg.toml,版本:$(LASTVERSION)"
cd $(DEPLOYPATH) && cp $(NAME) $(BACKUPPATH)/$(NAME).$(LASTVERSION) && cp cfg/cfg.toml $(BACKUPPATH)/cfg.toml.$(LASTVERSION)
echo "================="
增加的变量
DEPLOYPATH:=/home/work/module/
BACKUPPATH:=/home/work/backup/module/
LASTVERSION:=`cd $(DEPLOYPATH) && ./$(NAME) -v |grep -oP ": .\w+-\w+" | sed 's/: //g' || exit 1`
增加的check_version, 注意,shell变量声明和使用需要在一行中完成
。这里使用shell来判断,没有使用Makefile的ifeq。ifeq是做变量展开,类似C的宏,就是说如果使用ifeq ($(LASTVERSION),$(LATESTVERSION))
,得到的永远都是false
check_version:
l1=$(LATESTVERSION); \
l2=$(LASTVERSION); \
if [ "X$${l1}" = "X$${l2}" ]; \
then \
echo "warning:部署版本与线上版本一致,不作任何操作,请检查是否为最新代码"; \
echo "升级版本:$${l1},线上版本:$${l2}"; \
exit 3; \
else \
echo "线上版本: $${l2}, 升级版本:$${l1}"; \
fi
4.部署
deploy: backup build
echo "升级 $(NAME), 线上版本:$(LASTVERSION) 升级后版本:$(LATESTVERSION)"
cd $(DEPLOYPATH) && sh control.sh stop && cp $(BUILDPATH)/$(NAME) ./$(NAME) && sleep 1 && sh control.sh start && sh control.sh status
echo "================="
增加的变量
BUILDPATH:=$(shell pwd -P)
5.回滚
rollback:
ifndef ROLLBACKVERSION
echo "===请选择回滚版本==="
echo "$(ROLLBACKVERSIONLIST)"
echo "===请选择回滚版本==="
exit 1
endif
echo "回滚到版本:$(version)"
cd $(DEPLOYPATH) && sh control.sh stop && cp $(BACKUPPATH)/$(NAME).$(ROLLBACKVERSION) $(NAME) && cp $(BACKUPPATH)/cfg.toml.$(ROLLBACKVERSION) cfg/cfg.toml && sh control.sh start && sh control.sh status
echo "================="
增加的变量
ROLLBACKVERSIONLIST=`ls -rt $(shell find $(BACKUPPATH) -type f -name "$(NAME).*") | awk -F"/" '{print $$NF}' | sed 's/$(NAME)\.//g'`
ROLLBACKVERSION:=$(version)
回滚时使用make rollback version=xxxx