Commit 2bb71eae authored by zhouzihao's avatar zhouzihao

dev-支持部署参数

parent cbc7e122
......@@ -128,6 +128,45 @@ const serve_url = "http://127.0.0.1:3000" //后端想的服务地址
```
## [新特性] 部署测试环境
在build中有是否要部署的选项。如果勾选后可以选择要部署的模块列表。(这个数据来自项目)
在测试环境中只有被选中的模块才会更新。但是构建时docker的最新版本都会更新。
这里使用的原理是docker swarm中的update命令。
```shell
docker service update --image {image_name} {service_name}
```
这个service_name是服务更新的关键。可以在项目源数据里配置。如果不配置有默认情况。下面将讲详细介绍:
### 配置模式(推荐):
在项目第一次建立之初。要手动启动服务并且指定服务名。
在项目配置源数据时可以指定模块在环境中的服务名方便直接建立。
```json
{
"module_list":[
{
"name":"a",
"exec-file":"a-*-b",
"deploy":{
"dev":"[这里是服务名]"
}
}
]
}
```
注意模块必选使用这种方式进行配置。在deploy中是环境和环境名的键值对。也就说只有配置了对应环境的环境名才能正常的部署。
### 默认模式:
如果系统读不到这个值的话。则会生成一个默认的名字。
```
【环境名】-【模块名】
```
> 环境准备。在对应的dockerSwarm机器的master机器上要注册一个可以运行docker命令的runner。而且要和定义的环境名一致。
# 关于部署
项目部署在测试环境。地址:http://10.100.9.45/
......
......@@ -11,7 +11,13 @@ module.exports = {
var env_id = _.toInteger(body.env_id);
var branch = body.branch;
var version = body.version;
var result = await buildshell.build(p_id, env_id, branch, version);
// 接受是否发布的数据 没有传的情况下默认没有发布
var is_deploy = _.isEmpty(body.is_deploy) ? false : body.is_deploy;
//todo 这里的值是字符串还对象
var deploy_list = _.isEmpty(body.deploy_list) ? [] : body.deploy_list;
var result = await buildshell.build(p_id, env_id, branch, version,is_deploy,deploy_list);
res.end("{\"success\":true}");
} catch (error) {
console.log(error);
......
......@@ -2,7 +2,7 @@
* 基础配置
*/
const config = {
host: '10.16.11.106',
host: '10.16.7.209',
port: 3000
}
module.exports = config;
\ No newline at end of file
......@@ -3,7 +3,7 @@ var _ = require('lodash');
var databaseHelper = require("../tools/databaseHelper")
var javaBuilder = require('./java');
const build = async (p_id, env_id, branch, version) => {
const build = async (p_id, env_id, branch, version,is_deploy,deploy_list) => {
//获取项目基本信息
var projectObj = await databaseHelper.findOne('project', p_id, 'p_id');
console.log(JSON.stringify(projectObj));
......@@ -36,7 +36,7 @@ const build = async (p_id, env_id, branch, version) => {
switch (_.lowerCase(typeObj.name)) {
case "java":
await javaBuilder.buildJava(projectObj, envObj, typeObj, configList, branch, version);
await javaBuilder.buildJava(projectObj, envObj, typeObj, configList, branch, version,is_deploy,deploy_list);
break;
default:
throw new Error("never used type!");
......
......@@ -18,7 +18,7 @@ var config = require("../config/common");
* @param {*} branch 分支
* @param {*} version 版本号
*/
const buildJava = async (projectObj, envObj, typeObj, configList, branch, version) => {
const buildJava = async (projectObj, envObj, typeObj, configList, branch, version, is_deploy, deploy_list) => {
//start to buid
// 获取项目源数据
var projectMetaData = JSON.parse(projectObj.meta_data);
......@@ -117,6 +117,7 @@ const buildJava = async (projectObj, envObj, typeObj, configList, branch, versio
var docker_build_str = "";
var docker_tag_str = "";
var docker_push_str = "";
var deploy_str = "";
// todo 处理docker登录问题
var username = _.get(envObj, 'registry_username');
......@@ -133,6 +134,10 @@ const buildJava = async (projectObj, envObj, typeObj, configList, branch, versio
for (let v of module_list) {
let opt = "";
var module_name = "";
//构建项目的服务名
var deploy_name = "";
if (_.isString(v)) {
module_name = v;
opt = { filePath: project_dir + "/" + v + "/pom.xml" }
......@@ -142,6 +147,12 @@ const buildJava = async (projectObj, envObj, typeObj, configList, branch, versio
} else {
throw new Error("错误的类型")
}
deploy_name = envObj.name + "-" + module_name;
if (_.isObject(v) && _.has(v, `devlop.${envObj.name}`)) {
deploy_name = _.get(v, `devlop.${envObj, name}`);
}
var pom_object = await pomParserPromise(opt);
// console.log(JSON.stringify(pom_object));
// 这里默认情况下使用通配符 当配置时覆盖
......@@ -162,6 +173,11 @@ const buildJava = async (projectObj, envObj, typeObj, configList, branch, versio
docker_tag_str += " " + '- docker tag ${IMAGE_VERSION_' + service_name + '} ${IMAGE_LATEST_' + service_name + '}' + "\n";
docker_push_str += " " + '- docker push ${IMAGE_VERSION_' + service_name + '}' + "\n";
docker_push_str += " " + '- docker push ${IMAGE_LATEST_' + service_name + '}' + "\n";
//部署指令
if (is_deploy) {
deploy_str += " " + `- docker service update --image ${envObj.registry_url}/${registry_group}/${project_name}/${image_name}:${version} ${deploy_name}` + "\n"
}
// 这里要写dockerfile
fs.writeFileSync(`${project_dir}/${dockerfile_name}`, typeObj.docker_file);
......@@ -171,6 +187,8 @@ const buildJava = async (projectObj, envObj, typeObj, configList, branch, versio
}
await replaceFileByMap(dockerfile_map, `${project_dir}/${dockerfile_name}`);
}
console.log("部署脚本");
console.log(deploy_str);
// 在这里保存数据正好
var log_data = {
......@@ -203,7 +221,9 @@ const buildJava = async (projectObj, envObj, typeObj, configList, branch, versio
"{docker_push_str}": _.trimEnd(docker_push_str, "\n"),
"{build_str_java}": build_script,
"{success_str}": success_str,
"{fail_str}": fail_str
"{fail_str}": fail_str,
"{deploy_str}": _.trimEnd(deploy_str, "\n"),
"{tag}":envObj.name,
};
await replaceFileByMap(gitlab_ci_map, `${project_dir}/.gitlab-ci.yml`);
// 提供gitlab-ci
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment