代码优化

pull/214/head
dqjdda 2019-11-25 10:28:29 +08:00
parent 468a092d21
commit 2853f394e7
15 changed files with 143 additions and 124 deletions

View File

@ -3,8 +3,11 @@ package me.zhengjie.modules.mnt.domain;
import lombok.Data;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
/**
* @author zhanghouying
@ -19,8 +22,8 @@ public class App implements Serializable {
*
*/
@Id
@Column(name = "id")
private String id;
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
*
@ -64,6 +67,9 @@ public class App implements Serializable {
@Column(name = "deploy_script")
private String deployScript;
@CreationTimestamp
private Timestamp createTime;
public void copy(App source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}

View File

@ -5,6 +5,7 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Set;
/**
* @author zhanghouying
@ -19,20 +20,22 @@ public class Deploy implements Serializable {
*
*/
@Id
@Column(name = "id")
private String id;
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
*
*/
@Column(name = "app_id")
private String appId;
@ManyToOne
@JoinColumn(name = "app_id")
private App app;
/**
* IP
*
*/
@Column(name = "ip")
private String ip;
@ManyToMany
@JoinTable(name = "mnt_deploy_server", joinColumns = {@JoinColumn(name = "deploy_id",referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn(name = "server_id",referencedColumnName = "id")})
private Set<ServerDeploy> deploys;
public void copy(Deploy source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));

View File

@ -50,7 +50,7 @@ public class DeployHistory implements Serializable {
*
*/
@Column(name = "deploy_id",nullable = false)
private String deployId;
private Long deployId;
public void copy(DeployHistory source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));

View File

@ -8,5 +8,5 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
* @author zhanghouying
* @date 2019-08-24
*/
public interface AppRepository extends JpaRepository<App, String>, JpaSpecificationExecutor<App> {
public interface AppRepository extends JpaRepository<App, Long>, JpaSpecificationExecutor<App> {
}

View File

@ -8,5 +8,5 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
* @author zhanghouying
* @date 2019-08-24
*/
public interface DeployRepository extends JpaRepository<Deploy, String>, JpaSpecificationExecutor {
public interface DeployRepository extends JpaRepository<Deploy, Long>, JpaSpecificationExecutor<Deploy> {
}

View File

@ -59,7 +59,7 @@ public class AppController {
@ApiOperation(value = "删除App")
@DeleteMapping(value = "/{id}")
@PreAuthorize("@el.check('app:del')")
public ResponseEntity delete(@PathVariable String id){
public ResponseEntity delete(@PathVariable Long id){
appService.delete(id);
return new ResponseEntity(HttpStatus.OK);
}

View File

@ -66,7 +66,7 @@ public class DeployController {
@ApiOperation(value = "删除Deploy")
@DeleteMapping(value = "/{id}")
@PreAuthorize("@el.check('deploy:del')")
public ResponseEntity delete(@PathVariable String id){
public ResponseEntity delete(@PathVariable Long id){
deployService.delete(id);
return new ResponseEntity(HttpStatus.OK);
}
@ -76,7 +76,7 @@ public class DeployController {
@PostMapping(value = "/upload")
@PreAuthorize("@el.check('deploy:edit')")
public ResponseEntity upload(@RequestBody MultipartFile file, HttpServletRequest request, HttpServletResponse response)throws Exception{
String id = request.getParameter("id");
Long id = Long.valueOf(request.getParameter("id"));
String fileName = "";
if(file != null){
fileName = file.getOriginalFilename();

View File

@ -31,7 +31,7 @@ public interface AppService {
* @param id
* @return
*/
AppDTO findById(String id);
AppDTO findById(Long id);
/**
* create
@ -50,5 +50,5 @@ public interface AppService {
* delete
* @param id
*/
void delete(String id);
void delete(Long id);
}

View File

@ -32,7 +32,7 @@ public interface DeployService {
* @param id
* @return
*/
DeployDTO findById(String id);
DeployDTO findById(Long id);
/**
* create
@ -54,7 +54,7 @@ public interface DeployService {
* @CacheEvict(allEntries = true)
* @param id
*/
void delete(String id);
void delete(Long id);
/**
*
@ -62,7 +62,7 @@ public interface DeployService {
* @param appId
* @return
*/
public String deploy(String fileSavePath, String appId);
public String deploy(String fileSavePath, Long appId);
/**
*

View File

@ -3,6 +3,7 @@ package me.zhengjie.modules.mnt.service.dto;
import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
/**
@ -52,4 +53,6 @@ public class AppDTO implements Serializable {
*/
private String deployScript;
private Timestamp createTime;
}

View File

@ -3,6 +3,9 @@ package me.zhengjie.modules.mnt.service.dto;
import lombok.Data;
import me.zhengjie.annotation.Query;
import java.sql.Timestamp;
import java.util.List;
/**
* @author zhanghouying
* @date 2019-08-24
@ -15,4 +18,7 @@ public class AppQueryCriteria{
*/
@Query(type = Query.Type.INNER_LIKE)
private String name;
@Query(type = Query.Type.BETWEEN)
private List<Timestamp> createTime;
}

View File

@ -2,6 +2,7 @@ package me.zhengjie.modules.mnt.service.dto;
import lombok.Data;
import java.io.Serializable;
import java.util.Set;
/**
@ -16,16 +17,12 @@ public class DeployDTO implements Serializable {
*/
private String id;
/**
*
*/
private String appId;
private AppDTO app;
/**
* IP
*
*/
private String ip;
private Set<ServerDeployDTO> deploys;
/**
*

View File

@ -39,5 +39,5 @@ public class DeployHistoryDTO implements Serializable {
/**
*
*/
private String deployId;
private Long deployId;
}

View File

@ -1,6 +1,5 @@
package me.zhengjie.modules.mnt.service.impl;
import cn.hutool.core.util.IdUtil;
import me.zhengjie.modules.mnt.domain.App;
import me.zhengjie.modules.mnt.repository.AppRepository;
import me.zhengjie.modules.mnt.service.AppService;
@ -15,7 +14,6 @@ import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.Optional;
/**
@ -47,7 +45,7 @@ public class AppServiceImpl implements AppService {
}
@Override
public AppDTO findById(String id) {
public AppDTO findById(Long id) {
Optional<App> app = appRepository.findById(id);
ValidationUtil.isNull(app,"App","id",id);
return appMapper.toDto(app.get());
@ -56,7 +54,6 @@ public class AppServiceImpl implements AppService {
@Override
@Transactional(rollbackFor = Exception.class)
public AppDTO create(App resources) {
resources.setId(IdUtil.fastUUID());
return appMapper.toDto(appRepository.save(resources));
}
@ -72,7 +69,7 @@ public class AppServiceImpl implements AppService {
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(String id) {
public void delete(Long id) {
appRepository.deleteById(id);
}
}

View File

@ -5,8 +5,10 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import lombok.extern.slf4j.Slf4j;
import me.zhengjie.exception.BadRequestException;
import me.zhengjie.modules.mnt.domain.App;
import me.zhengjie.modules.mnt.domain.Deploy;
import me.zhengjie.modules.mnt.domain.DeployHistory;
import me.zhengjie.modules.mnt.domain.ServerDeploy;
import me.zhengjie.modules.mnt.repository.DeployRepository;
import me.zhengjie.modules.mnt.service.*;
import me.zhengjie.modules.mnt.service.dto.*;
@ -32,6 +34,7 @@ import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.Set;
/**
* @author zhanghouying
@ -74,7 +77,7 @@ public class DeployServiceImpl implements DeployService {
}
@Override
public DeployDTO findById(String id) {
public DeployDTO findById(Long id) {
Optional<Deploy> Deploy = deployRepository.findById(id);
ValidationUtil.isNull(Deploy, "Deploy", "id", id);
return deployMapper.toDto(Deploy.get());
@ -83,7 +86,6 @@ public class DeployServiceImpl implements DeployService {
@Override
@Transactional(rollbackFor = Exception.class)
public DeployDTO create(Deploy resources) {
resources.setId(IdUtil.simpleUUID());
return deployMapper.toDto(deployRepository.save(resources));
}
@ -99,12 +101,12 @@ public class DeployServiceImpl implements DeployService {
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(String id) {
public void delete(Long id) {
deployRepository.deleteById(id);
}
@Override
public String deploy(String fileSavePath, String id) {
public String deploy(String fileSavePath, Long id) {
return deployApp(fileSavePath, id);
}
@ -113,14 +115,14 @@ public class DeployServiceImpl implements DeployService {
* @param id
* @return
*/
private String deployApp(String fileSavePath, String id) {
private String deployApp(String fileSavePath, Long id) {
DeployDTO deploy = findById(id);
if (deploy == null) {
sendMsg("部署信息不存在", MsgType.ERROR);
throw new BadRequestException("部署信息不存在");
}
AppDTO app = appService.findById(deploy.getAppId());
AppDTO app = deploy.getApp();
if (app == null) {
sendMsg("包对应应用信息不存在", MsgType.ERROR);
throw new BadRequestException("包对应应用信息不存在");
@ -130,42 +132,44 @@ public class DeployServiceImpl implements DeployService {
String uploadPath = app.getUploadPath();
StringBuilder sb = new StringBuilder();
String msg = "";
String ip = deploy.getIp();
ExecuteShellUtil executeShellUtil = getExecuteShellUtil(ip);
//判断是否第一次部署
boolean flag = checkFile(executeShellUtil, app);
//第一步要确认服务器上有这个目录
executeShellUtil.execute("mkdir -p " + uploadPath);
//上传文件
msg = String.format("登陆到服务器:%s", ip);
ScpClientUtil scpClientUtil = getScpClientUtil(ip);
log.info(msg);
sendMsg(msg, MsgType.INFO);
msg = String.format("上传文件到服务器:%s<br>目录:%s下", ip, uploadPath);
sendMsg(msg, MsgType.INFO);
scpClientUtil.putFile(fileSavePath, uploadPath);
if (flag) {
sendMsg("停止原来应用", MsgType.INFO);
//停止应用
stopApp(port, executeShellUtil);
sendMsg("备份原来应用", MsgType.INFO);
//备份应用
backupApp(executeShellUtil, ip, app.getDeployPath(), app.getName(), app.getBackupPath(), id);
Set<ServerDeployDTO> deploys = deploy.getDeploys();
for (ServerDeployDTO deployDTO : deploys) {
String ip = deployDTO.getIp();
ExecuteShellUtil executeShellUtil = getExecuteShellUtil(ip);
//判断是否第一次部署
boolean flag = checkFile(executeShellUtil, app);
//第一步要确认服务器上有这个目录
executeShellUtil.execute("mkdir -p " + uploadPath);
//上传文件
msg = String.format("登陆到服务器:%s", ip);
ScpClientUtil scpClientUtil = getScpClientUtil(ip);
log.info(msg);
sendMsg(msg, MsgType.INFO);
msg = String.format("上传文件到服务器:%s<br>目录:%s下", ip, uploadPath);
sendMsg(msg, MsgType.INFO);
scpClientUtil.putFile(fileSavePath, uploadPath);
if (flag) {
sendMsg("停止原来应用", MsgType.INFO);
//停止应用
stopApp(port, executeShellUtil);
sendMsg("备份原来应用", MsgType.INFO);
//备份应用
backupApp(executeShellUtil, ip, app.getDeployPath(), app.getName(), app.getBackupPath(), id);
}
sendMsg("部署应用", MsgType.INFO);
//部署文件,并启动应用
String deployScript = app.getDeployScript();
executeShellUtil.execute(deployScript);
sendMsg("启动应用", MsgType.INFO);
String startScript = app.getStartScript();
executeShellUtil.execute(startScript);
//只有过5秒才能知道到底是不是启动成功了。
sleep(5);
boolean result = checkIsRunningStatus(port, executeShellUtil);
sb.append("服务器:").append(deployDTO.getName()).append("<br>应用:").append(app.getName());
sendResultMsg(result, sb);
}
sendMsg("部署应用", MsgType.INFO);
//部署文件,并启动应用
String deployScript = app.getDeployScript();
executeShellUtil.execute(deployScript);
sendMsg("启动应用", MsgType.INFO);
String startScript = app.getStartScript();
executeShellUtil.execute(startScript);
//只有过5秒才能知道到底是不是启动成功了。
sleep(5);
boolean result = checkIsRunningStatus(port, executeShellUtil);
sb.append("服务器:").append(ip).append("<br>应用:").append(app.getName());
sendResultMsg(result, sb);
return "部署结束";
}
@ -177,7 +181,7 @@ public class DeployServiceImpl implements DeployService {
}
}
private void backupApp(ExecuteShellUtil executeShellUtil, String ip, String fileSavePath, String appName, String backupPath, String id) {
private void backupApp(ExecuteShellUtil executeShellUtil, String ip, String fileSavePath, String appName, String backupPath, Long id) {
String deployDate = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN);
StringBuilder sb = new StringBuilder();
if (!backupPath.endsWith(FILE_SEPARATOR)) {
@ -241,21 +245,22 @@ public class DeployServiceImpl implements DeployService {
@Override
public String serverStatus(Deploy resources) {
String ip = resources.getIp();
String appId = resources.getAppId();
AppDTO app = appService.findById(appId);
StringBuffer sb = new StringBuffer();
ExecuteShellUtil executeShellUtil = getExecuteShellUtil(ip);
sb.append("服务器:").append(ip).append("<br>应用:").append(app.getName());
boolean result = checkIsRunningStatus(app.getPort(), executeShellUtil);
if (result) {
sb.append("<br>正在运行");
sendMsg(sb.toString(), MsgType.INFO);
} else {
sb.append("<br>已停止!");
sendMsg(sb.toString(), MsgType.ERROR);
Set<ServerDeploy> serverDeploys = resources.getDeploys();
App app = resources.getApp();
for (ServerDeploy serverDeploy : serverDeploys) {
StringBuilder sb = new StringBuilder();
ExecuteShellUtil executeShellUtil = getExecuteShellUtil(serverDeploy.getIp());
sb.append("服务器:").append(serverDeploy.getName()).append("<br>应用:").append(app.getName());
boolean result = checkIsRunningStatus(app.getPort(), executeShellUtil);
if (result) {
sb.append("<br>正在运行");
sendMsg(sb.toString(), MsgType.INFO);
} else {
sb.append("<br>已停止!");
sendMsg(sb.toString(), MsgType.ERROR);
}
log.info(sb.toString());
}
log.info(sb.toString());
return "执行完毕";
}
@ -277,21 +282,22 @@ public class DeployServiceImpl implements DeployService {
*/
@Override
public String startServer(Deploy resources) {
String ip = resources.getIp();
String appId = resources.getAppId();
AppDTO app = appService.findById(appId);
StringBuilder sb = new StringBuilder();
ExecuteShellUtil executeShellUtil = getExecuteShellUtil(ip);
//为了防止重复启动,这里先停止应用
stopApp(app.getPort(), executeShellUtil);
sb.append("服务器:").append(ip).append("<br>应用:").append(app.getName());
sendMsg("下发启动命令", MsgType.INFO);
executeShellUtil.execute(app.getStartScript());
//停止3秒防止应用没有启动完成
sleep(3);
boolean result = checkIsRunningStatus(app.getPort(), executeShellUtil);
sendResultMsg(result, sb);
log.info(sb.toString());
Set<ServerDeploy> deploys = resources.getDeploys();
App app = resources.getApp();
for (ServerDeploy deploy : deploys) {
StringBuilder sb = new StringBuilder();
ExecuteShellUtil executeShellUtil = getExecuteShellUtil(deploy.getIp());
//为了防止重复启动,这里先停止应用
stopApp(app.getPort(), executeShellUtil);
sb.append("服务器:").append(deploy.getName()).append("<br>应用:").append(app.getName());
sendMsg("下发启动命令", MsgType.INFO);
executeShellUtil.execute(app.getStartScript());
//停止3秒防止应用没有启动完成
sleep(3);
boolean result = checkIsRunningStatus(app.getPort(), executeShellUtil);
sendResultMsg(result, sb);
log.info(sb.toString());
}
return "执行完毕";
}
@ -302,34 +308,35 @@ public class DeployServiceImpl implements DeployService {
*/
@Override
public String stopServer(Deploy resources) {
String ip = resources.getIp();
String appId = resources.getAppId();
AppDTO app = appService.findById(appId);
StringBuffer sb = new StringBuffer();
ExecuteShellUtil executeShellUtil = getExecuteShellUtil(ip);
sb.append("服务器:").append(ip).append("<br>应用:").append(app.getName());
sendMsg("下发停止命令", MsgType.INFO);
//停止应用
stopApp(app.getPort(), executeShellUtil);
sleep(1);
boolean result = checkIsRunningStatus(app.getPort(), executeShellUtil);
if (result) {
sb.append("<br>关闭失败!");
sendMsg(sb.toString(), MsgType.ERROR);
} else {
sb.append("<br>关闭成功!");
sendMsg(sb.toString(), MsgType.INFO);
Set<ServerDeploy> deploys = resources.getDeploys();
App app = resources.getApp();
for (ServerDeploy deploy : deploys) {
StringBuffer sb = new StringBuffer();
ExecuteShellUtil executeShellUtil = getExecuteShellUtil(deploy.getIp());
sb.append("服务器:").append(deploy.getName()).append("<br>应用:").append(app.getName());
sendMsg("下发停止命令", MsgType.INFO);
//停止应用
stopApp(app.getPort(), executeShellUtil);
sleep(1);
boolean result = checkIsRunningStatus(app.getPort(), executeShellUtil);
if (result) {
sb.append("<br>关闭失败!");
sendMsg(sb.toString(), MsgType.ERROR);
} else {
sb.append("<br>关闭成功!");
sendMsg(sb.toString(), MsgType.INFO);
}
log.info(sb.toString());
}
log.info(sb.toString());
return "执行完毕";
}
@Override
public String serverReduction(DeployHistory resources) {
String deployId = resources.getDeployId();
Long deployId = resources.getDeployId();
Deploy deployInfo = deployRepository.findById(deployId).get();
String deployDate = resources.getDeployDate();
AppDTO app = appService.findById(deployInfo.getAppId());
App app = deployInfo.getApp();
if (app == null) {
sendMsg("应用信息不存在:" + resources.getAppName(), MsgType.ERROR);
throw new BadRequestException("应用信息不存在:" + resources.getAppName());