|
|
package com.monitor.other.worksystem.ctrl;
|
|
|
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.contants.AlarmGroupContants;
|
|
|
import com.model.DockerJenkinsRecord;
|
|
|
import com.model.DockerProjectModel;
|
...
|
...
|
@@ -28,6 +30,7 @@ import org.springframework.web.bind.annotation.RequestParam; |
|
|
import org.springframework.web.bind.annotation.ResponseBody;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.concurrent.CompletableFuture;
|
...
|
...
|
@@ -86,18 +89,42 @@ public class DockerProjectCtrl { |
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 查询docker项目
|
|
|
*/
|
|
|
@RequestMapping("/getDockerProjectMapByIds")
|
|
|
@ResponseBody
|
|
|
public BaseResponse<Map<Integer,DockerProjectModel>> getDockerProjectMapByIds(String ids) {
|
|
|
List<Integer> idList=new ArrayList<>();
|
|
|
for(String id:ids.split(",")){
|
|
|
if(StringUtils.isNotBlank(id)){
|
|
|
idList.add(Integer.parseInt(id.trim()));
|
|
|
}
|
|
|
}
|
|
|
List<DockerProjectModel> models= dockerProjectService.selectByIdList(idList);
|
|
|
Map<Integer,DockerProjectModel> map=new HashMap<>();
|
|
|
if(models!=null&&models.size()>0){
|
|
|
for(DockerProjectModel model:models){
|
|
|
map.put(model.getId(),model);
|
|
|
}
|
|
|
}
|
|
|
BaseResponse rtn= new BaseResponse<>();
|
|
|
rtn.setData(JSON.toJSONString(map));
|
|
|
return rtn;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 发布工单_jenkins:发起镜像制作
|
|
|
*/
|
|
|
@RequestMapping("/createMirror")
|
|
|
@ResponseBody
|
|
|
public BaseResponse createMirror(@RequestBody DockerJenkinsReq dockerJenkinsReq) {
|
|
|
String id=dockerProjectService.jenkinsBuild(dockerJenkinsReq);
|
|
|
String buildId=dockerProjectService.jenkinsBuild(dockerJenkinsReq);
|
|
|
BaseResponse rnt=new BaseResponse();
|
|
|
if(id==null||id.length()<=0){
|
|
|
if(StringUtils.isBlank(buildId)){
|
|
|
rnt.setCode(201);
|
|
|
rnt.setMessage("请求镜像失败,返回jobId = " +id);
|
|
|
rnt.setMessage("请求镜像失败,返回jobId = " +buildId);
|
|
|
}else{
|
|
|
rnt.setData(id);
|
|
|
rnt.setData(buildId);
|
|
|
}
|
|
|
return rnt;
|
|
|
}
|
...
|
...
|
@@ -105,6 +132,63 @@ public class DockerProjectCtrl { |
|
|
/**
|
|
|
* 发布工单_jenkins:自动发布的项目
|
|
|
*/
|
|
|
@RequestMapping("/mirrorAndDeploy")
|
|
|
@ResponseBody
|
|
|
public BaseResponse mirrorAndDeploy(@RequestBody DockerJenkinsReq dockerJenkinsReq) {
|
|
|
BaseResponse rtn=new BaseResponse<>();
|
|
|
String ids=dockerJenkinsReq.getProjectIds();
|
|
|
StringBuilder buildIdSb=new StringBuilder();
|
|
|
StringBuilder failSb=new StringBuilder();
|
|
|
for(String id:ids.split(",")){
|
|
|
if(StringUtils.isNotBlank(id)){
|
|
|
DockerProjectModel model=dockerProjectMapper.selectById(Integer.parseInt(id));
|
|
|
if(model!=null){
|
|
|
dockerJenkinsReq.setProjectName(model.getProjectName());
|
|
|
dockerJenkinsReq.setProjectJobType(model.getProjectJobType());
|
|
|
dockerJenkinsReq.setProjectGitGroup(model.getProjectGitGroup());
|
|
|
dockerJenkinsReq.setDeployName(model.getDockerProjectName());
|
|
|
dockerJenkinsReq.setUserMail(dockerJenkinsReq.getUserMail());
|
|
|
dockerJenkinsReq.setBranch(dockerJenkinsReq.getBranch());
|
|
|
dockerJenkinsReq.setNodeEnv(dockerJenkinsReq.getNodeEnv());
|
|
|
dockerJenkinsReq.setProjectPort(model.getPort());
|
|
|
if(dockerJenkinsReq.getNodeEnv().toUpperCase().indexOf("GRAY")>=0){
|
|
|
dockerJenkinsReq.setImageSource(model.getDockerGrayImageStore());
|
|
|
dockerJenkinsReq.setClusterId(model.getDockerGrayClusterId());
|
|
|
dockerJenkinsReq.setNamespace(model.getDockerGrayNameSpace());
|
|
|
}else{
|
|
|
dockerJenkinsReq.setImageSource(model.getDockerOnlineImageStore());
|
|
|
dockerJenkinsReq.setClusterId(model.getDockerOnlineClusterId());
|
|
|
dockerJenkinsReq.setNamespace(model.getDockerOnlineNameSpace());
|
|
|
}
|
|
|
dockerJenkinsReq.setServiceName(model.getDockerProjectName());
|
|
|
|
|
|
log.info("mirrorAndDeploy run {} ",dockerJenkinsReq);
|
|
|
String mobile_yunwei="";
|
|
|
String buildId=dockerProjectService.jenkinsBuild(dockerJenkinsReq);
|
|
|
if(StringUtils.isBlank(buildId)){
|
|
|
rtn.setCode(2000);
|
|
|
rtn.setMessage(model.getDockerProjectName()+"请求镜像制作失败,发布任务终止!");
|
|
|
rtn.setData(buildIdSb.toString());
|
|
|
return rtn;
|
|
|
}else{
|
|
|
startRunAsyDockerJob(buildId,dockerJenkinsReq,mobile_yunwei);
|
|
|
|
|
|
if(buildIdSb.length()>0){
|
|
|
buildIdSb.append(",");
|
|
|
}
|
|
|
buildIdSb.append(id+"-"+buildId);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
rtn.setData(buildIdSb.toString());
|
|
|
rtn.setMessage(failSb.toString());
|
|
|
return rtn;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 发布工单_jenkins:自动发布的项目
|
|
|
*/
|
|
|
@RequestMapping("/gitWebHook")
|
|
|
@ResponseBody
|
|
|
public BaseResponse gitWebHook(@RequestBody WebHooksReleaseBO webHooksReleaseBO) {
|
...
|
...
|
@@ -114,134 +198,153 @@ public class DockerProjectCtrl { |
|
|
return rtn;
|
|
|
}
|
|
|
String mobile_yunwei = getUsersInfoUtil.getMobileByAlarmGroup(AlarmGroupContants.GROUP_NAME_DOCKER);
|
|
|
//log.info("gitWebHook begin");
|
|
|
|
|
|
if (!isRealChange(webHooksReleaseBO)) {
|
|
|
log.info("gitWebHook webHooksReleaseBOl 未通过校验!");
|
|
|
return rtn;
|
|
|
}
|
|
|
DockerProjectModel model=dockerProjectMapper.selectByProjectName(webHooksReleaseBO.getProjectName());
|
|
|
//log.info("gitWebHook model {} ",model);
|
|
|
if (isRealChange(webHooksReleaseBO)&&model!=null) {
|
|
|
//异步
|
|
|
log.info("gitWebHook isRealChange is true ");
|
|
|
CompletableFuture.runAsync(new Runnable() {
|
|
|
@Override
|
|
|
public void run() {
|
|
|
//Docker-Deploy-GitHook
|
|
|
DockerJenkinsReq dockerJenkinsReq=new DockerJenkinsReq();
|
|
|
dockerJenkinsReq.setProjectName(model.getProjectName());
|
|
|
dockerJenkinsReq.setProjectJobType(model.getProjectJobType());
|
|
|
dockerJenkinsReq.setProjectGitGroup(model.getProjectGitGroup());
|
|
|
dockerJenkinsReq.setDeployName(model.getDockerProjectName());
|
|
|
dockerJenkinsReq.setBranch("master");
|
|
|
dockerJenkinsReq.setUserMail(webHooksReleaseBO.getUser_email());
|
|
|
dockerJenkinsReq.setImageSource(model.getDockerOnlineImageStore());
|
|
|
dockerJenkinsReq.setNodeEnv("yoho-online");
|
|
|
dockerJenkinsReq.setProjectPort(model.getPort());
|
|
|
dockerJenkinsReq.setClusterId(model.getDockerOnlineClusterId());
|
|
|
if(model==null){
|
|
|
log.info("gitWebHook docker project model 未找到!");
|
|
|
return rtn;
|
|
|
}
|
|
|
//Docker-Deploy-GitHook
|
|
|
DockerJenkinsReq dockerJenkinsReq=new DockerJenkinsReq();
|
|
|
dockerJenkinsReq.setProjectName(model.getProjectName());
|
|
|
dockerJenkinsReq.setProjectJobType(model.getProjectJobType());
|
|
|
dockerJenkinsReq.setProjectGitGroup(model.getProjectGitGroup());
|
|
|
dockerJenkinsReq.setDeployName(model.getDockerProjectName());
|
|
|
dockerJenkinsReq.setUserMail(webHooksReleaseBO.getUser_email());
|
|
|
dockerJenkinsReq.setBranch("master");
|
|
|
dockerJenkinsReq.setNodeEnv("yoho-online");
|
|
|
dockerJenkinsReq.setProjectPort(model.getPort());
|
|
|
dockerJenkinsReq.setImageSource(model.getDockerOnlineImageStore());
|
|
|
dockerJenkinsReq.setClusterId(model.getDockerOnlineClusterId());
|
|
|
dockerJenkinsReq.setNamespace(model.getDockerOnlineNameSpace());
|
|
|
dockerJenkinsReq.setServiceName(model.getDockerProjectName());
|
|
|
|
|
|
//开始创建镜像
|
|
|
log.info("gitWebHook run {} ",dockerJenkinsReq);
|
|
|
String buildId=dockerProjectService.jenkinsBuild(dockerJenkinsReq);
|
|
|
if(StringUtils.isBlank(buildId)){
|
|
|
rtn.setCode(201);
|
|
|
rtn.setMessage("请求镜像失败,返回jobId = " +buildId);
|
|
|
}else{
|
|
|
startRunAsyDockerJob(buildId,dockerJenkinsReq,mobile_yunwei);
|
|
|
}
|
|
|
|
|
|
//开始创建镜像
|
|
|
log.info("gitWebHook run {} ",dockerJenkinsReq);
|
|
|
String buildId=dockerProjectService.jenkinsBuild(dockerJenkinsReq);
|
|
|
return rtn;
|
|
|
}
|
|
|
|
|
|
//等待镜像创建完成:查询状态
|
|
|
try {
|
|
|
Thread.sleep(2*60*1000);//等待2分钟再查询
|
|
|
} catch (InterruptedException e) {
|
|
|
log.error("gitWebHook thread sleep error",e);
|
|
|
}
|
|
|
/**
|
|
|
* 发起异步调用
|
|
|
*/
|
|
|
private void startRunAsyDockerJob(String buildId,DockerJenkinsReq dockerJenkinsReq,String mobile_yunwei){
|
|
|
CompletableFuture.runAsync(new Runnable() {
|
|
|
@Override
|
|
|
public void run() {
|
|
|
//等待镜像创建完成:查询状态
|
|
|
try {
|
|
|
Thread.sleep(2*60*1000);//等待2分钟再查询
|
|
|
} catch (InterruptedException e) {
|
|
|
log.error("gitWebHook thread sleep error",e);
|
|
|
}
|
|
|
|
|
|
//查询镜像
|
|
|
boolean okFlag=false;
|
|
|
String alarmMsg="镜像制作失败";
|
|
|
String alarmTypeSuccess="service_exception";//"docker_auto_success";
|
|
|
String alarmTypeFail="service_exception";//"docker_auto_error";
|
|
|
for(int i=0;i<20;i++){
|
|
|
DockerJenkinsRecord record=dockerProjectService.queryJenkinsById(buildId);
|
|
|
if(record==null){
|
|
|
//发送短信
|
|
|
alarmMsg="获取镜像状态信息为空,镜像buildId is"+buildId;
|
|
|
break ;
|
|
|
}
|
|
|
String status=record.getJenkinsBuildStatus();
|
|
|
if (StringUtils.isBlank(status)){
|
|
|
//继续查询
|
|
|
try {
|
|
|
Thread.sleep(1*60*1000);//等待1分钟再查询
|
|
|
} catch (InterruptedException e) {
|
|
|
log.error("gitWebHook thread sleep error",e);
|
|
|
}
|
|
|
continue;
|
|
|
//查询镜像
|
|
|
boolean okFlag=false;
|
|
|
String alarmMsg="镜像制作失败";
|
|
|
String alarmTypeSuccess="service_exception";//"docker_auto_success";
|
|
|
String alarmTypeFail="service_exception";//"docker_auto_error";
|
|
|
for(int i=0;i<40;i++){
|
|
|
DockerJenkinsRecord record=dockerProjectService.queryJenkinsById(buildId);
|
|
|
if(record==null){
|
|
|
//发送短信
|
|
|
alarmMsg="获取镜像状态信息为空,镜像buildId is"+buildId;
|
|
|
break ;
|
|
|
}
|
|
|
String status=record.getJenkinsBuildStatus();
|
|
|
if (StringUtils.isBlank(status)){
|
|
|
//继续查询
|
|
|
try {
|
|
|
Thread.sleep(1*30*1000);//等待30秒再查询
|
|
|
} catch (InterruptedException e) {
|
|
|
log.error("gitWebHook thread sleep error",e);
|
|
|
}
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
if ("SUCCESS".equalsIgnoreCase(status.trim())){
|
|
|
//成功
|
|
|
okFlag=true;
|
|
|
break;
|
|
|
}else{
|
|
|
okFlag=false;
|
|
|
alarmMsg="镜像制作失败,镜像状态为 "+status+",镜像buildId is"+buildId;
|
|
|
break;
|
|
|
}
|
|
|
if ("SUCCESS".equalsIgnoreCase(status.trim())){
|
|
|
//成功
|
|
|
okFlag=true;
|
|
|
break;
|
|
|
}else{
|
|
|
okFlag=false;
|
|
|
alarmMsg="镜像制作失败,镜像状态为 "+status+",镜像buildId is"+buildId;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//镜像制作失败
|
|
|
if(!okFlag){
|
|
|
//sendMsg
|
|
|
alarmMsg=("["+model.getProjectName()+"]"+alarmMsg);
|
|
|
//镜像制作失败
|
|
|
if(!okFlag){
|
|
|
//sendMsg
|
|
|
alarmMsg=("["+dockerJenkinsReq.getProjectName()+"]"+alarmMsg);
|
|
|
if(StringUtils.isNotBlank(mobile_yunwei)){
|
|
|
alarmMsgService.sendSms(alarmTypeFail, alarmMsg , mobile_yunwei);
|
|
|
return;
|
|
|
}
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//调用发布
|
|
|
dockerJenkinsReq.setClusterId(model.getDockerOnlineClusterId());
|
|
|
dockerJenkinsReq.setNamespace(model.getDockerOnlineNameSpace());
|
|
|
dockerJenkinsReq.setServiceName(model.getDockerProjectName());
|
|
|
BaseResponse deployResp=deployMirror(dockerJenkinsReq);
|
|
|
if(deployResp==null){
|
|
|
//发布失败
|
|
|
alarmMsg=("["+model.getProjectName()+"]调用腾讯云发布接口失败");
|
|
|
BaseResponse deployResp=deployMirror(dockerJenkinsReq);
|
|
|
if(deployResp==null){
|
|
|
//发布失败
|
|
|
alarmMsg=("["+dockerJenkinsReq.getProjectName()+"]调用腾讯云发布接口失败");
|
|
|
if(StringUtils.isNotBlank(mobile_yunwei)){
|
|
|
alarmMsgService.sendSms(alarmTypeFail,alarmMsg , mobile_yunwei);
|
|
|
return;
|
|
|
}
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if(deployResp.getCode()!=200){
|
|
|
//发布失败
|
|
|
alarmMsg=("["+model.getProjectName()+"]查询腾讯云发布状态接口失败");
|
|
|
if(deployResp.getCode()!=200){
|
|
|
//发布失败
|
|
|
alarmMsg=("["+dockerJenkinsReq.getProjectName()+"]查询腾讯云发布状态接口失败");
|
|
|
if(StringUtils.isNotBlank(mobile_yunwei)){
|
|
|
alarmMsgService.sendSms(alarmTypeFail,alarmMsg , mobile_yunwei);
|
|
|
return;
|
|
|
}else{
|
|
|
//发布成功
|
|
|
boolean projectStatus=false;
|
|
|
for(int i=0;i<60;i++){
|
|
|
BaseResponse deployStatusResp=queryDockerServerStatus(dockerJenkinsReq);
|
|
|
if(deployStatusResp!=null&&"NORMAL".equalsIgnoreCase((String)deployStatusResp.getData())){
|
|
|
//发布之后的状态成功
|
|
|
projectStatus=true;
|
|
|
alarmMsg=("["+model.getProjectName()+"]发布成功!");
|
|
|
}
|
|
|
return;
|
|
|
}else{
|
|
|
//发布成功
|
|
|
boolean projectStatus=false;
|
|
|
for(int i=0;i<60;i++){
|
|
|
BaseResponse deployStatusResp=queryDockerServerStatus(dockerJenkinsReq);
|
|
|
if(deployStatusResp!=null&&"NORMAL".equalsIgnoreCase((String)deployStatusResp.getData())){
|
|
|
//发布之后的状态成功
|
|
|
projectStatus=true;
|
|
|
alarmMsg=("["+dockerJenkinsReq.getProjectName()+"]发布成功!");
|
|
|
if(StringUtils.isNotBlank(mobile_yunwei)){
|
|
|
alarmMsgService.sendSms(alarmTypeSuccess,alarmMsg , mobile_yunwei);
|
|
|
break;
|
|
|
}else{
|
|
|
try {
|
|
|
Thread.sleep(1*20*1000);//等待20秒再查询
|
|
|
} catch (InterruptedException e) {
|
|
|
log.error("gitWebHook queryDockerServerStatus thread sleep error",e);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
}else{
|
|
|
try {
|
|
|
Thread.sleep(1*20*1000);//等待20秒再查询
|
|
|
} catch (InterruptedException e) {
|
|
|
log.error("gitWebHook queryDockerServerStatus thread sleep error",e);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if(!projectStatus){
|
|
|
alarmMsg=("["+model.getProjectName()+"]发布状态为非normal,请检查!");
|
|
|
if(!projectStatus){
|
|
|
alarmMsg=("["+dockerJenkinsReq.getProjectName()+"]发布状态为非normal,请检查!");
|
|
|
if(StringUtils.isNotBlank(mobile_yunwei)){
|
|
|
alarmMsgService.sendSms(alarmTypeFail,alarmMsg , mobile_yunwei);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
return rtn;
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
public Boolean isRealChange(WebHooksReleaseBO webHooksReleaseBO) {
|
|
|
private Boolean isRealChange(WebHooksReleaseBO webHooksReleaseBO) {
|
|
|
boolean object_kind_check = webHooksReleaseBO.getObject_kind().equals("push");
|
|
|
boolean ref_check = webHooksReleaseBO.getRef().equals("refs/heads/master");
|
|
|
boolean total_commits_count_check = webHooksReleaseBO.getTotal_commits_count() > 0;
|
...
|
...
|
|