Authored by qinchao

docker支持多集群发布

... ... @@ -63,13 +63,17 @@ public class DockerBuildCtrl {
model.addAttribute("releaseWorkJob_id", workJobId);
}
}
model.addAttribute("clusters", JSON.toJSONString(ProjectEnvironment.getClusterMap()));
model.addAttribute("environments", ProjectEnvironment.getDockerEnvironments());
model.addAttribute("projectTypes", ProjectEnvironment.getDockerProjectTypeMap());
return new ModelAndView("project/docker_project");
}
@RequestMapping("/toBuildView")
public ModelAndView toBuildView(Model model,String project_id, String project_name, String environment_name, String operate_name, String branch_name, String rollbackImageStore,String workid_name, String buildIds,String failMsg, HttpSession session) {
public ModelAndView toBuildView(Model model,String project_id, String project_name,
String environment_name,String clusters_name,String clusters_text,
String operate_name, String branch_name, String rollbackImageStore,
String workid_name, String buildIds,String failMsg, HttpSession session) {
List<Map<String,String>> buildInfoList=new ArrayList<>();
Map mapIds = new HashMap<>();
mapIds.put("ids",project_id);
... ... @@ -99,6 +103,8 @@ public class DockerBuildCtrl {
model.addAttribute("environment_name", environment_name);
model.addAttribute("clusters_name", clusters_name);
model.addAttribute("clusters_text", clusters_text);
model.addAttribute("operate_name", operate_name);
model.addAttribute("branch_name", branch_name);
model.addAttribute("workid_name", workid_name);
... ... @@ -160,13 +166,16 @@ public class DockerBuildCtrl {
*/
@RequestMapping(value = "/mirrorAndDeploy")
@ResponseBody
public BaseResponse mirrorAndDeploy(String project_id, String project_name, String environment_name, String operate_name, String branch_name, String rollbackfile_name,String workid_name, Model model, HttpSession session) {
public BaseResponse mirrorAndDeploy(String project_id, String project_name,
String environment_name,String clusters_name, String operate_name, String branch_name,
String rollbackfile_name,String workid_name, Model model, HttpSession session) {
DockerJenkinsReq dockerJenkinsReq=new DockerJenkinsReq();
User user = (User) session.getAttribute("user");
dockerJenkinsReq.setUserName(user.getName());
dockerJenkinsReq.setUserMail(user.getEmail());
dockerJenkinsReq.setProjectIds(project_id);
dockerJenkinsReq.setNodeEnv(environment_name);
dockerJenkinsReq.setClusterId(clusters_name);
dockerJenkinsReq.setBranch(branch_name);
dockerJenkinsReq.setReleaseWorkId(workid_name);
if("deploy".equalsIgnoreCase(operate_name)){
... ... @@ -202,19 +211,21 @@ public class DockerBuildCtrl {
/**
* qq发布
*/
@RequestMapping(value = "/deployMirror")
@ResponseBody
public BaseResponse deployMirror(DockerJenkinsReq dockerJenkinsReq) {
return httpRestClient.defaultPost("/dockerProject/deployMirror",dockerJenkinsReq,BaseResponse.class);
}
/**
* qq发布
*/
@RequestMapping(value = "/queryDockerServerStatus")
@ResponseBody
public BaseResponse queryDockerServerStatus(DockerJenkinsReq dockerJenkinsReq) {
return httpRestClient.defaultPost("/dockerProject/queryDockerServerStatus",dockerJenkinsReq,BaseResponse.class);
BaseResponse rtn= httpRestClient.defaultPost("/dockerProject/queryDockerServerStatus",dockerJenkinsReq,BaseResponse.class);
if(rtn!=null&&200==rtn.getCode()){
Map<String,Object> map= (Map<String,Object>)rtn.getData();
Map<String,String> tmpMap = (Map<String,String>)map.get("resultMap");
Map<String,String> clusterMap=ProjectEnvironment.getClusterMap();
StringBuilder sb=new StringBuilder();
for(String key:tmpMap.keySet()){
sb.append(clusterMap.get(key)).append(":").append(tmpMap.get(key)).append(";");
}
map.put("resultMessage",sb.toString());
}
return rtn;
}
... ...
... ... @@ -80,9 +80,9 @@
<h5>发布进程信息</h5>
</div>
<div class="widget-content nopadding">
<div class="widget-title" style="height: 53px;">
<div class="widget-title" style="height: 103px;">
<div>
<div class="form-inline" role="form" id="inBoxQueryDiv"
<div class="form-inline" role="form"
style=" margin-top: 12px;margin-left: 25px;float: left;">
<div class="input-group" style="float: left;">
<span class="input-group-addon">操作:</span>
... ... @@ -95,6 +95,18 @@
readonly="readonly" value="${environment_name}"/>
</div>
<div class="input-group" style="float: left;">
<span class="input-group-addon">集群:</span>
<input type="text" id="clusters_text" name="clusters_text" class="form-control" style="width:250px;"
readonly="readonly" value="${clusters_text}"/>
<input type="hidden" id="clusters_name" name="clusters_name" value="${clusters_name}"/>
</div>
</div>
</div>
<div>
<div class="form-inline" role="form"
style=" margin-top: 12px;margin-left: 25px;float: left;">
<div class="input-group" style="float: left;">
<span class="input-group-addon">分支:</span>
<input type="text" id="branch_name" name="branch_name" class="form-control"
readonly="readonly" value="${branch_name}"/>
... ... @@ -106,14 +118,15 @@
</div>
<div class="input-group" style="float: left;">
<span class="input-group-addon">工单</span>
<span class="input-group-addon">工单:</span>
<input type="text" id="workid_name" name="workid_name" class="form-control"
readonly="readonly" value="${workid_name}"/>
</div>
</div>
</div>
</div>
<div class="widget-title" style="height: 40px;display:none;" id="testingdiv">
<div>
<div class="form-inline" role="form">
... ... @@ -291,11 +304,13 @@
writeToText(textareaId,"data is "+data);
}
}else{
if(data.data!=null&&((data.data).toUpperCase()=="NORMAL")){
console.log("data.data is ");
console.log(data.data);
if(data.data!=null&&data.data.result==true){
clearInterval(intervalIndex);
writeToText(textareaId,"查询服务启动完成..........over!");
}else{
writeToText(textareaId,"............查询次数............"+count+"......当前状态---->"+data.data);
writeToText(textareaId,"............查询次数............"+count+"......当前状态---->"+data.data.resultMessage);
}
}
count += 1;
... ... @@ -320,11 +335,12 @@
console.log("dockerProject is "+dockerProject);
var frontParam={};
frontParam.serviceName=dockerProject.dockerProjectName;
frontParam.clusterId=$("#clusters_name").val();
if($("#environment_name").val().toUpperCase().indexOf("GRAY")>=0){
frontParam.clusterId=dockerProject.dockerGrayClusterId;
//frontParam.clusterId=dockerProject.dockerGrayClusterId;
frontParam.namespace =dockerProject.dockerGrayNameSpace;
}else{
frontParam.clusterId=dockerProject.dockerOnlineClusterId;
//frontParam.clusterId=dockerProject.dockerOnlineClusterId;
frontParam.namespace =dockerProject.dockerOnlineNameSpace;
}
return frontParam;
... ...
... ... @@ -42,13 +42,13 @@
<div class="form-group">
<label class="col-sm-1 control-label">操作选择</label>
<div class="col-sm-8" style="display: inline">
<div class="rdio rdio-default">
<div class="col-sm-8" style="display: inline">
<div class="rdio rdio-default" style="display: inline">
<input type="radio" name="operate" id="operatedeploy" value="Deploy" checked="checked" onclick="operateChange()"/>
<label for="operatedeploy">发布</label>
</div>
<div class="rdio rdio-default">
<div class="rdio rdio-default" style="display:inline;margin-left:30px;">
<input type="radio" name="operate" value="Rollback" id="operateback" onclick="operateChange()"/>
<label for="operateback">回滚</label>
</div>
... ... @@ -61,7 +61,7 @@
<div class="col-sm-8">
<c:forEach items="${environments }" var="envi" varStatus="enviStatus">
<div class="rdio rdio-default">
<input type="radio" name="environments" id="${envi }" value="${envi }"
<input type="radio" name="environments" id="${envi }" value="${envi }" onclick="blurEnv()"
<c:choose>
<c:when test="${releaseWorkJob_environment!=null}">
<c:set var="envi_comm">${envi},</c:set>
... ... @@ -74,6 +74,7 @@
/>
<label for="${envi }">${envi }</label>
</div>
<div id="div_cluster_${envi}" style="margin-left:50px;"></div>
</c:forEach>
</div>
</div>
... ... @@ -177,6 +178,13 @@
<br>
<div class="input-group">
<span class="input-group-addon">发布集群</span>
<input type="hidden" name="clusters_name" >
<input type="text" name="clusters_text" class="form-control" readonly="readonly">
</div>
<br>
<div class="input-group">
<span class="input-group-addon">工程名称</span>
<input type="hidden" name="project_id" class="form-control" readonly="readonly">
<input type="text" name="project_name" class="form-control" readonly="readonly">
... ... @@ -232,6 +240,7 @@
</html>
<script type="text/javascript">
var global_all_clusters=${clusters};
jQuery(document).ready(function () {
getProjects();
});
... ... @@ -277,13 +286,21 @@
for (var i = 0; i < obj.length; i++) {
var projectId = obj[i].id;
var name = obj[i].projectName;
var cluster_online = obj[i].dockerOnlineClusterId;
if(!cluster_online){
cluster_online="";
}
var cluster_gray = obj[i].dockerGrayClusterId;
if(!cluster_gray){
cluster_gray="";
}
var checkstr="";
if(default_releaseWorkJob_project!=null&&default_releaseWorkJob_project.indexOf(name+",")>=0){
checkstr = " checked ";
}
order1HTML += "<div class='ckbox ckbox-primary' style='display: inline'>";
order1HTML += " <input name='project1' type='checkbox' " + checkstr ;
order1HTML += " id='" + name + "' value='" + projectId + "'/>";
order1HTML += " <input name='project1' onclick='resetCls_deploy()' type='checkbox' " + checkstr ;
order1HTML += " cluster_online='"+cluster_online+"' cluster_gray='"+cluster_gray+"' id='" + name + "' value='" + projectId + "'/>";
order1HTML += "<label for='" + name + "' style='width: 200px'>" + name + "</label></div>";
if (order1num % 4 == 0) {
order1HTML += "</br>";
... ... @@ -326,6 +343,125 @@
}
});
}
function blurEnv() {
var environment = $("input[name='environments']:checked").val();
if(environment=="yoho-online"){
$("#div_cluster_yoho-gray [name='dockerGrayClusterId']").removeAttr("checked");
}else{
$("#div_cluster_yoho-online [name='dockerOnlineClusterId']").removeAttr("checked");
//选中第一个
$("#div_cluster_yoho-gray [name='dockerGrayClusterId']").eq(0).attr("checked",'true');
}
}
function resetCls_deploy(){
resetCls("project1");
}
function resetCls(checkbox_projectName){
var cluster_online=new Array();
var cluster_gray=new Array();
var index=0;
$('input[name="'+checkbox_projectName+'"]:checked').each(function () {
if(index==0){
if($(this).attr("cluster_online")){
cluster_online=$(this).attr("cluster_online").split(",");
}
if($(this).attr("cluster_gray")){
cluster_gray=$(this).attr("cluster_gray").split(",");
}
}else{
//多选,取交集
if(cluster_online.length>0){
cluster_online=intersectArray(cluster_online,$(this).attr("cluster_online").split(","));
}
if(cluster_gray.length>0){
cluster_gray=intersectArray(cluster_gray,$(this).attr("cluster_gray").split(","));
}
}
index++;
});
var environment = $("input[name='environments']:checked").val();
var htmlContent="";
for(var i=0;i<cluster_online.length;i++){
var key=cluster_online[i];
var checkedFlag="";
if(i>=0&&environment=="yoho-online"){
checkedFlag=" checked ";
}
htmlContent += '<div class="ckbox ckbox-primary" style="display: inline">'
+' <input type="checkbox" id="dockerOnlineClusterId_'+key+'" name="dockerOnlineClusterId" '
+checkedFlag
+' value="'+key+'"/>'
+' <label for="dockerOnlineClusterId_' + key + '">'+global_all_clusters[key]+'</label>&nbsp;&nbsp;&nbsp;</div>';
}
$("#div_cluster_yoho-online").html(htmlContent);
//重置变量
htmlContent="";
for(var i=0;i<cluster_gray.length;i++){
var key=cluster_gray[i];
var checkedFlag="";
if(i==0&&environment=="yoho-gray"){
checkedFlag=" checked ";
}
htmlContent += '<div class="ckbox ckbox-primary" style="display: inline">'
+' <input type="checkbox" id="dockerGrayClusterId_'+key+'" name="dockerGrayClusterId" '
+checkedFlag
+' value="'+key+'"/>'
+' <label for="dockerGrayClusterId_'+key+'">'+global_all_clusters[key]+'</label>&nbsp;&nbsp;&nbsp;</div>';
}
$("#div_cluster_yoho-gray").html(htmlContent);
//console.log(cluster_online);
//console.log(cluster_gray);
}
function intersectArray(a, b){
return Array.intersect(a, b);
}
Array.prototype.indexOf = Array.prototype.indexOf || function (searchElement, fromIndex) {
var index = -1;
fromIndex = fromIndex * 1 || 0;
for (var k = 0, length = this.length; k < length; k++) {
if (k >= fromIndex && this[k] === searchElement) {
index = k;
break;
}
}
return index;
};
Array.prototype.filter = Array.prototype.filter || function (fn, context) {
var arr = [];
if (typeof fn === "function") {
for (var k = 0, length = this.length; k < length; k++) {
fn.call(context, this[k], k, this) && arr.push(this[k]);
}
}
return arr;
};
// 数组去重
Array.prototype.unique = function() {
var n = {}, r = [];
for (var i = 0; i < this.length; i++) {
if (!n[this[i]]) {
n[this[i]] = true;
r.push(this[i]);
}
}
return r;
};
Array.intersect = function(arr1, arr2) {
if(Object.prototype.toString.call(arr1) === "[object Array]" && Object.prototype.toString.call(arr2) === "[object Array]") {
return arr1.filter(function(v){
return arr2.indexOf(v)!==-1
})
}
};
function getRollbackList(){
var projectId = $("input[name='project']:checked").val();
... ... @@ -380,10 +516,24 @@
$("input[name='workid']").val("release0");
}
//确认提交
//打开提交的确认界面
function comfirmSubmit() {
var operate = $("input[name='operate']:checked").val();
var environment = $("input[name='environments']:checked").val();
//获取集群
var clustersName=new Array();
var clustersText=new Array();
if("yoho-online"==environment){
$('input[name="dockerOnlineClusterId"]:checked').each(function () {
clustersName.push($(this).val());//向数组中添加元素
clustersText.push($(this).next().text());
});
}else{
$('input[name="dockerGrayClusterId"]:checked').each(function () {
clustersName.push($(this).val());//向数组中添加元素
clustersText.push($(this).next().text());
});
}
var projects = new Array();
var projectNames = new Array();
if ("Deploy" == operate) {//发布
... ... @@ -397,6 +547,11 @@
return;
}
if (clustersName.length == 0) {
alert("请选择发布集群");
return;
}
var branch = $("input[name='branch']").val();
if (branch == "") {
alert("请填写分支名称");
... ... @@ -412,6 +567,8 @@
$("input[name='project_id']").val(projects);
$("input[name='project_name']").val(projectNames);
$("input[name='environment_name']").val(environment);
$("input[name='clusters_name']").val(clustersName);
$("input[name='clusters_text']").val(clustersText);
$("input[name='branch_name']").val(branch);
$("input[name='workid_name']").val(workid);
$('#confirmSubmitDivId').modal('show');
... ... @@ -498,7 +655,8 @@
param.environment_name=$("input[name='environment_name']").val();
param.branch_name=$("input[name='branch_name']").val();
param.workid_name=$("input[name='workid_name']").val();
param.clusters_name=$("input[name='clusters_name']").val();
param.clusters_text=$("input[name='clusters_text']").val();
$.ajax({
url: contextPath + "dockerBuild/mirrorAndDeploy",
type: "post",
... ...