Authored by qinchao

docker发布

... ... @@ -8,6 +8,10 @@ import lombok.Data;
*/
@Data
public class DockerJenkinsReq {
//发布或者回滚的参数
private String projectIds;
// jenkins
private String projectName;
private String projectGitGroup;
... ...
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;
... ...
... ... @@ -76,7 +76,10 @@ public class DockerProjectServiceImpl implements DockerProjectService {
FastJenkinsUtils fastJenkinsUtils=new FastJenkinsUtils();
String jobName=dockerJenkinsReq.getProjectJobType();
fastJenkinsUtils.createJob(jobName,params);
int buildNumber=fastJenkinsUtils.createJob(jobName,params);
if(buildNumber<=0){
return "";
}
}catch (Exception e){
logger.error("jenkinsBuild error",e);
return "";
... ...