Commit 2bb71eae authored by zhouzihao's avatar zhouzihao

dev-支持部署参数

parent cbc7e122
...@@ -128,6 +128,45 @@ const serve_url = "http://127.0.0.1:3000" //后端想的服务地址 ...@@ -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/ 项目部署在测试环境。地址:http://10.100.9.45/
......
...@@ -11,7 +11,13 @@ module.exports = { ...@@ -11,7 +11,13 @@ module.exports = {
var env_id = _.toInteger(body.env_id); var env_id = _.toInteger(body.env_id);
var branch = body.branch; var branch = body.branch;
var version = body.version; 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}"); res.end("{\"success\":true}");
} catch (error) { } catch (error) {
console.log(error); console.log(error);
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* 基础配置 * 基础配置
*/ */
const config = { const config = {
host: '10.16.11.106', host: '10.16.7.209',
port: 3000 port: 3000
} }
module.exports = config; module.exports = config;
\ No newline at end of file
...@@ -3,7 +3,7 @@ var _ = require('lodash'); ...@@ -3,7 +3,7 @@ var _ = require('lodash');
var databaseHelper = require("../tools/databaseHelper") var databaseHelper = require("../tools/databaseHelper")
var javaBuilder = require('./java'); 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'); var projectObj = await databaseHelper.findOne('project', p_id, 'p_id');
console.log(JSON.stringify(projectObj)); console.log(JSON.stringify(projectObj));
...@@ -36,7 +36,7 @@ const build = async (p_id, env_id, branch, version) => { ...@@ -36,7 +36,7 @@ const build = async (p_id, env_id, branch, version) => {
switch (_.lowerCase(typeObj.name)) { switch (_.lowerCase(typeObj.name)) {
case "java": 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; break;
default: default:
throw new Error("never used type!"); throw new Error("never used type!");
......
...@@ -18,7 +18,7 @@ var config = require("../config/common"); ...@@ -18,7 +18,7 @@ var config = require("../config/common");
* @param {*} branch 分支 * @param {*} branch 分支
* @param {*} version 版本号 * @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 //start to buid
// 获取项目源数据 // 获取项目源数据
var projectMetaData = JSON.parse(projectObj.meta_data); var projectMetaData = JSON.parse(projectObj.meta_data);
...@@ -117,6 +117,7 @@ const buildJava = async (projectObj, envObj, typeObj, configList, branch, versio ...@@ -117,6 +117,7 @@ const buildJava = async (projectObj, envObj, typeObj, configList, branch, versio
var docker_build_str = ""; var docker_build_str = "";
var docker_tag_str = ""; var docker_tag_str = "";
var docker_push_str = ""; var docker_push_str = "";
var deploy_str = "";
// todo 处理docker登录问题 // todo 处理docker登录问题
var username = _.get(envObj, 'registry_username'); var username = _.get(envObj, 'registry_username');
...@@ -133,6 +134,10 @@ const buildJava = async (projectObj, envObj, typeObj, configList, branch, versio ...@@ -133,6 +134,10 @@ const buildJava = async (projectObj, envObj, typeObj, configList, branch, versio
for (let v of module_list) { for (let v of module_list) {
let opt = ""; let opt = "";
var module_name = ""; var module_name = "";
//构建项目的服务名
var deploy_name = "";
if (_.isString(v)) { if (_.isString(v)) {
module_name = v; module_name = v;
opt = { filePath: project_dir + "/" + v + "/pom.xml" } opt = { filePath: project_dir + "/" + v + "/pom.xml" }
...@@ -142,6 +147,12 @@ const buildJava = async (projectObj, envObj, typeObj, configList, branch, versio ...@@ -142,6 +147,12 @@ const buildJava = async (projectObj, envObj, typeObj, configList, branch, versio
} else { } else {
throw new Error("错误的类型") 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); var pom_object = await pomParserPromise(opt);
// console.log(JSON.stringify(pom_object)); // console.log(JSON.stringify(pom_object));
// 这里默认情况下使用通配符 当配置时覆盖 // 这里默认情况下使用通配符 当配置时覆盖
...@@ -162,6 +173,11 @@ const buildJava = async (projectObj, envObj, typeObj, configList, branch, versio ...@@ -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_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_VERSION_' + service_name + '}' + "\n";
docker_push_str += " " + '- docker push ${IMAGE_LATEST_' + 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 // 这里要写dockerfile
fs.writeFileSync(`${project_dir}/${dockerfile_name}`, typeObj.docker_file); fs.writeFileSync(`${project_dir}/${dockerfile_name}`, typeObj.docker_file);
...@@ -171,6 +187,8 @@ const buildJava = async (projectObj, envObj, typeObj, configList, branch, versio ...@@ -171,6 +187,8 @@ const buildJava = async (projectObj, envObj, typeObj, configList, branch, versio
} }
await replaceFileByMap(dockerfile_map, `${project_dir}/${dockerfile_name}`); await replaceFileByMap(dockerfile_map, `${project_dir}/${dockerfile_name}`);
} }
console.log("部署脚本");
console.log(deploy_str);
// 在这里保存数据正好 // 在这里保存数据正好
var log_data = { var log_data = {
...@@ -203,7 +221,9 @@ const buildJava = async (projectObj, envObj, typeObj, configList, branch, versio ...@@ -203,7 +221,9 @@ const buildJava = async (projectObj, envObj, typeObj, configList, branch, versio
"{docker_push_str}": _.trimEnd(docker_push_str, "\n"), "{docker_push_str}": _.trimEnd(docker_push_str, "\n"),
"{build_str_java}": build_script, "{build_str_java}": build_script,
"{success_str}": success_str, "{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`); await replaceFileByMap(gitlab_ci_map, `${project_dir}/.gitlab-ci.yml`);
// 提供gitlab-ci // 提供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