Linux 【花菜】Makefile-项目构建神器

花菜 · 2022年12月20日 · 3775 次阅读

1 背景

目前所在项目使用了docker-compose来构建,并且需要在同一个机器上部署两套环境(留下了没有 CI 的眼泪)
通过查阅资料,了解到可以使用-p命令来指定项目名称,并且通过环境变量的方式动态修改端口和网络
最终是顺利完成了任务,但是产生一个问题,就是启动应用命令特别的长。
比如:
要启动测试环境的服务和重启 nginx 容器

export TAG=v1.4.4; docker-compose -f docker-compose-base.yml -f docker-compose-test.yml --env-file $HOME/.env-memory-test --project-name memory-test-project up -d  --build --remove-orphans
docker-compose -f docker-compose-base.yml -f docker-compose-test.yml --env-file $HOME/.env-memory-test --project-name memory-test-project restart nginx

启动应用命令的意思是:

  • 设置一个环境变量,TAG=v1.4.4,这个docker-compose中会使用到
  • -f 指定docker-compose文件,可以使用多个,最终会合并
  • --env-file 指定启动的环境变量
  • --project-name 指定项目名称,但项目时可以省略,简短写法是-p
  • up启动docker-compose中所有的service
  • -ddaemon的方式运行
  • --build 启动之前先构建镜像
  • --remove-orphans 移除掉那些不在docker-compose中的service, 在docker-composeservice有变动时候会有用

要使用restart, ps, logs, down 等命令,都是避免不了一堆的前缀,
即使有命令补全,历史搜索辅助插件,但还是会让人不爽,并且也容易输错

2 目的

缩短命令,方便记忆,减少出错,提高工具的复用率

3 做法

针对命令太长,容易出错的
首先想到缩短命令可以使用alias, 这个可以轻松实现,但也会存在一些问题:

  • alias的命名不太容易
  • 适配多环境,多参数,实现起来有点麻烦
  • 在不同的 shell 环境或者不同用户都要配置
  • 其他项目不容易复用这个能力

参考很多开源项目,都是用到Makefile,不妨我也来试试

先看结果,背景中提到很长的命令,通过Makefile可以缩短成make up-tag tag=v1.4.4
这样就非常的简短,方便记忆
看看这个Makefile长成什么样

# Makefile

# 伪目标,避免文件和目标相同时,避免目标无法执行, 
.PHONY: up logs up-tag down build build-tag ps config exec restart

# 取变量
env := ${env}


ifeq ($(env), prod)
	# 只有明确指定了env=prod,才走这里
	project_name = memory-prod-project
	docker-compose-file = docker-compose-prod.yml
	env-file = ${HOME}/.env-memory-prod
else
	# 否则,env不传或者等于其他,全部走这里 
	project_name = memory-test-project
	docker-compose-file = docker-compose-test.yml
	env-file = ${HOME}/.env-memory-test
endif

cmd = docker-compose -f docker-compose-base.yml -f $(docker-compose-file) --env-file $(env-file) --project-name $(project_name)

tag := $(tag)

# 目标
up-tag:
	# export环境变量需要和docker-compose写在同一个行,否则两个进程执行,环境变量会无效
	export TAG=$(tag); $(cmd) up -d  --build --remove-orphans
	# 启动完应用容器后,需要重启nginx,否则upstream会失败
	$(cmd) restart nginx 

更多Makefile细节
参考这里

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册