美文网首页
Makefile-项目构建神器

Makefile-项目构建神器

作者: 梨花菜 | 来源:发表于2022-12-19 17:58 被阅读0次

    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细节
    参考这里

    相关文章

      网友评论

          本文标题:Makefile-项目构建神器

          本文链接:https://www.haomeiwen.com/subject/avoyqdtx.html