关于自动化部署
实现功能
- 拉取分支代码
- 执行前端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封装出一套交互命令,后续再和运维系统进行集成。
命令行模式
-
配置
- 选择环境
- 配置接口域名
- 配置redis
- 配置apiKey
- 配置log路径
- 配置api日志等级
- 配置yo日志等级
- 配置app日志等级
-
发布
- 选择发布环境
- 判断该环境是否有配置参数
- 有则填写发布主机
- 显示配置参数,提示确认是否发布
- 如果是测试环境需要选择一个release版本(正式环境和预生产取master,开发环境取dev)
- 发布(检出一个版本,构建,打包,传输到目标机代码目录,解包,重启服务)
- 显示发布结果
-
回滚
- 选择发布环境
- 选择一个发布的zip包
- 发布(检出一个版本,构建,打包,传输到目标机代码目录,解包,重启服务)
- 显示发布结果
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 | 发布压缩包 |
返回结果(同查询结果)