you are better than you think

用Makefile做一点微小的工作

· by thur · Read in about 2 min · (223 Words)
Makefile shell

有一个内网服务的模块,升级过程大体是在一个目录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

Comments