Name Last Update
client Loading commit data...
configure Loading commit data...
public Loading commit data...
server Loading commit data...
.gitignore Loading commit data...
README.md Loading commit data...

关于自动化部署

实现功能

  • 拉取分支代码
  • 执行前端spm,gulp任务
  • 执行服务端类库加载
  • 服务端代码打包分发
  • 重启服务
  • 回滚代码

部署开发环境

  • 拉取开发分支代码:git checkout develop && git pull
  • 执行spm: cd /Data/code/yohobuy-portal/client&&spm install
  • 执行npm: cd /Data/code/yohobuy-portal/server&&cnpm install -d
  • 执行重启: pm2 restart yohobuy-portal

部署测试环境

  • 打包当前版本代码: cd /Data/code/yohobuy-portal&&zip -r ./bakup/app_{2016-01-25}.zip public/ server/
  • 拉取开发分支代码:git checkout {release/1.1} && git pull
    • git branch -a
    • git checkout -b release/1.1 remotes/origin/release/1.1
  • 执行spm: cd /Data/code/yohobuy-portal/client&&spm install&&gulp
  • 执行npm: cd /Data/code/yohobuy-portal/server&&cnpm install -d
  • 执行分发测试服务器:scp /Data/code/yohobuy-portal yoho@remote_ip:remote_folder
  • unzip
  • pm2 restart

部署正式和预生产

  • 拉取开发分支代码:git checkout master && git pull
  • 执行spm: cd /Data/code/yohobuy-portal/client&&spm install&&gulp
  • 执行npm: cd /Data/code/yohobuy-portal/server&&cnpm install -d
  • 执行分发测试服务器:scp /Data/code/yohobuy-portal yoho@remote_ip:remote_folder
  • unzip
  • pm2 restart

实现原理

先把执行命令行封装成RESTful接口,再使用inquirer封装出一套交互命令,后续再和运维系统进行集成。

命令行模式

  1. 配置

    1. 选择环境
    2. 配置接口域名
    3. 配置redis
    4. 配置apiKey
    5. 配置log路径
    6. 配置api日志等级
    7. 配置yo日志等级
    8. 配置app日志等级
  2. 发布

    1. 选择发布环境
    2. 判断该环境是否有配置参数
    3. 有则填写发布主机
    4. 显示配置参数,提示确认是否发布
    5. 如果是测试环境需要选择一个release版本(正式环境和预生产取master,开发环境取dev)
    6. 发布(检出一个版本,构建,打包,传输到目标机代码目录,解包,重启服务)
    7. 显示发布结果
  3. 回滚

    1. 选择发布环境
    2. 选择一个发布的zip包
    3. 发布(检出一个版本,构建,打包,传输到目标机代码目录,解包,重启服务)
    4. 显示发布结果

API模式

1.系统配置接口

接口:/config

a. 获取配置

GET:/config/:env


属性名称 类型 例子 说明
env String all all:所有配置,development:开发配置,test:测试配置,preview:预生产配置,production:生产配置

返回结果:

 {
    "development": {
        "redis": null,
        "apiKey": "xxxx",
        "domain": "http://192.168.102.215:8081/platform",
        "target": "192.168.102.23",
        "loggers": {
            "api": {
                "level": "verbose"
            },
            "yo": {
                "level": "verbose"
            },
            "app": {
                "level": "verbose"
            }
        }
    },
    "test": {
        "redis": {
            "port": 6379,
            "host": "localhost"
        },
        "apiKey": "xxxx",
        "domain": "http://192.168.102.202:8081/platform",
        "target": "192.168.102.23",
        "logsFile": "/Data/logs",
        "loggers": {
            "api": {
                "level": "verbose"
            },
            "yo": {
                "level": "verbose"
            },
            "app": {
                "level": "verbose"
            }
        }
    },
    "preview": {
        "redis": {
            "port": 6379,
            "host": "192.168.74.17"
        },
        "apiKey": "xxxx",
        "domain": "http://192.168.0.61:8081/a",
        "target": "192.168.102.23",
        "logsFile": "/Data/logs/",
        "loggers": {
            "api": {
                "level": "info"
            },
            "yo": {
                "level": "info"
            },
            "app": {
                "level": "info"
            }
        }
    },
    "production": {
        "redis": {
            "port": 6379,
            "host": "localhost"
        },
        "apiKey": "xxxxx",
        "domain": "http://192.168.0.6:8081/a",
        "target": "192.168.102.23",
        "logsFile": "/Data/logs/",
        "loggers": {
            "api": {
                "level": "warn"
            },
            "yo": {
                "level": "warn"
            },
            "app": {
                "level": "warn"
            }
        }
    }
}

b. 新增或修改配置

POST: /config/:env

提交方式:form表单方式


属性名称 类型 例子 说明
env String development development:开发配置,test:测试配置,preview:预生产配置,production:生产配置,只能设置单个环境的配置
redisPort Number 6379 redis端口
redisHost String localhost redis的服务端地址
apiKey String xxxx apidoc文档访问秘钥
domain String http://192.168.0.6:8081/a 域名地址
target String '192.168.102.123' 目标主机
logsFile String /Data/logs/ 日志目录
loggersApiLevel String warn API日志级别
loggersYoLevel String verbose yo日志级别
loggersAppLevel String info app的日志级别

返回结果:

{
    "preview": {
        "redis": {
            "port": 6379,
            "host": "192.168.74.17"
        },
        "apiKey": "xxxx",
        "target": "192.168.102.23",
        "domain": "http://192.168.0.61:8081/a",
        "logsFile": "/Data/logs/",
        "loggers": {
            "api": {
                "level": "info"
            },
            "yo": {
                "level": "info"
            },
            "app": {
                "level": "info"
            }
        }
    }
}

或者更新不成功

{

}

c.删除配置

DELETE: /config/:env


属性名称 类型 例子 说明
env String all all:所有配置,development:开发配置,test:测试配置,preview:预生产配置,production:生产配置

返回结果(展示剩下的配置,如果没有配置,展示为空):

{

}

2.程序包任务接口

接口:/task

a. 查看程序包信息

GET: /task/:env


属性名称 类型 例子 说明
env String all all:所有配置,development:开发配置,test:测试配置,preview:预生产配置,production:生产配置

返回结果

{
    "state":"checkouted",//checkout,build,config,zip,send,unzipAndStart
    "env":"preview",
    "branch":['0.1.0','0.1.1'],
    "config": {
        "redis": {
            "port": 6379,
            "host": "192.168.74.17"
        },
        "apiKey": "xxxx",
        "domain": "http://192.168.0.61:8081/a",
        "logsFile": "/Data/logs/",
        "loggers": {
            "api": {
                "level": "info"
            },
            "yo": {
                "level": "info"
            },
            "app": {
                "level": "info"
            }
        }
    }
}

b. 程序包发布任务

POST: /task/:type/:env/

提交方式:form表单方式


属性名称 类型 例子 说明
env String all all:所有配置,development:开发配置,test:测试配置,preview:预生产配置,production:生产配置
type String deploy 任务类型
version String release/1.1 如果是测试环境

返回结果(同查询结果)

c. 程序包回滚

POST: /task/:type/:env/

提交方式:form表单方式


属性名称 类型 例子 说明
env String all all:所有配置,development:开发配置,test:测试配置,preview:预生产配置,production:生产配置
type String rollback 任务类型
version String 0.1.1 程序版本
tar String test_1455874849660_release1.1.tar.gz 发布压缩包

返回结果(同查询结果)