refactor(devops): 重构流水线相关代码

- 重命名 DevopsPipelineController 为 DevopsPipelineInstanceController
- 新增 DevopsPipelineTemplateController
- 修改流水线实例和模板相关的数据结构
- 优化流水线启动和重启逻辑
- 调整前端 API 路径
This commit is contained in:
2025-07-23 20:56:15 +08:00
parent 0965ef74b9
commit 091c056cd0
27 changed files with 316 additions and 311 deletions
@@ -2,11 +2,11 @@
<div class="sidebar-logo-container" :class="{'collapse':collapse}"> <div class="sidebar-logo-container" :class="{'collapse':collapse}">
<transition name="sidebarLogoFade"> <transition name="sidebarLogoFade">
<router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/"> <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
<img v-if="logo" :src="logo" class="sidebar-logo"> <img v-if="logo" :src="logo" class="sidebar-logo" alt="">
<h1 v-else class="sidebar-title">{{ title }} </h1> <h1 v-else class="sidebar-title">{{ title }} </h1>
</router-link> </router-link>
<router-link v-else key="expand" class="sidebar-logo-link" to="/"> <router-link v-else key="expand" class="sidebar-logo-link" to="/">
<img v-if="logo" :src="logo" class="sidebar-logo"> <img v-if="logo" :src="logo" class="sidebar-logo" alt="">
<h1 class="sidebar-title">{{ title }} </h1> <h1 class="sidebar-title">{{ title }} </h1>
</router-link> </router-link>
</transition> </transition>
@@ -25,7 +25,7 @@ export default {
}, },
data() { data() {
return { return {
title: 'CuteJava后台管理', title: 'CuteJava',
logo: Logo logo: Logo
} }
} }
@@ -76,7 +76,7 @@ export default {
&.collapse { &.collapse {
.sidebar-logo { .sidebar-logo {
margin-right: 0px; margin-right: 0;
border-radius: 50%; border-radius: 50%;
} }
} }
+1 -1
View File
@@ -9,7 +9,7 @@ const api = {
// Sql 监控 // Sql 监控
druidSqlApi: baseUrl + '/druid/index.html', druidSqlApi: baseUrl + '/druid/index.html',
// websocket // websocket
websocketApi: baseUrl + '/webSocket/{sid}', websocketApi: baseUrl + '/websocket/{sid}',
// swagger // swagger
swaggerApi: baseUrl + '/doc.html', swaggerApi: baseUrl + '/doc.html',
// 文件上传 // 文件上传
@@ -0,0 +1,82 @@
import Vue from 'vue'
/**
* 消息提示
*/
export default {
/**
* 确认消息对话框<br/>
* 提示用户确认其已经触发的动作, 并询问是否进行此操作时会用到此对话框
* @param questionText 提示语
* @param msgType 消息类型(w、i、e、s)
* @param confirmCallBack 确认回调
* @param cancelCallBack 取消回调
*/
FullConfirm(questionText, msgType, confirmCallBack, cancelCallBack) {
let currentType = 'info'
if (msgType === 's') {
currentType = 'success'
} else if (msgType === 'e') {
currentType = 'error'
} else if (msgType === 'i') {
currentType = 'info'
} else if (msgType === 'w') {
currentType = 'warning'
}
Vue.prototype.$confirm(questionText, '提示', {
confirmButtonText: '确定', cancelButtonText: '取消', type: currentType
}).then(() => {
if (confirmCallBack != null) {
confirmCallBack()
}
}).catch(() => {
if (cancelCallBack != null) {
cancelCallBack()
}
})
}, /**
* 数据删除确认对话框
* @param confirmCallBack 确认回调
* @param cancelCallBack 取消回调
*/
DeleteConfirm(confirmCallBack, cancelCallBack) {
this.FullConfirm('确定删除本条数据吗?', 'w', confirmCallBack, cancelCallBack)
}, /**
* 数据删除确认对话框(自定义提示内容)
* @param message 提示内容
* @param confirmCallBack 确认回调
* @param cancelCallBack 取消回调
*/
DeleteMessageConfirm(message, confirmCallBack, cancelCallBack) {
this.FullConfirm(message, 'w', confirmCallBack, cancelCallBack)
}, /**
* 数据输入对话框
* @param title 标题提示
* @param patternText 正则表达式
* @param errorMsg 校验失败消息内容
* @param confirmCallBack 校验通过回调
* @param cancelCallBack 取消回调
*/
TextInputConfirm(title, patternText, errorMsg, confirmCallBack, cancelCallBack) {
Vue.prototype.$prompt('', title, {
confirmButtonText: '确定', cancelButtonText: '取消', inputPattern: patternText, inputErrorMessage: errorMsg
}).then(({ value }) => {
if (confirmCallBack != null) {
confirmCallBack(value)
}
}).catch(() => {
if (cancelCallBack != null) {
cancelCallBack()
}
})
}, /**
* 确认内容消息框
* @param title 标题
* @param content 内容
*/
ShowConfirm(title, content) {
Vue.prototype.$alert(content, title, {
confirmButtonText: '关闭'
})
}
}
@@ -0,0 +1,26 @@
import Vue from 'vue'
/**
* 消息提示
*/
export default {
Info(content) {
Vue.prototype.$message({
message: content, type: 'info'
})
},
Success(content) {
Vue.prototype.$message({
message: content, type: 'success'
})
},
Warning(content) {
Vue.prototype.$message({
message: content, type: 'warning'
})
},
Error(content) {
Vue.prototype.$message({
message: content, type: 'error'
})
}
}
@@ -0,0 +1,20 @@
import Vue from 'vue'
/**
* 通知
*/
export default {
Info(content) {
Vue.prototype.$notify({ message: content, type: 'info' })
}, Success(content) {
Vue.prototype.$notify({ message: content, type: 'success' })
}, SuccessDuration(content, durationTime) {
Vue.prototype.$notify({ message: content, type: 'success', duration: durationTime })
}, Warning(content) {
Vue.prototype.$notify({ message: content, type: 'warning' })
}, Error(content) {
Vue.prototype.$notify({ message: content, type: 'error' })
}, ErrorDuration(content, durationTime) {
Vue.prototype.$notify({ message: content, type: 'error', duration: durationTime })
}
}
-183
View File
@@ -1,183 +0,0 @@
/**
* 消息提示工具
* @type {{success: MessageUtil.success, warning: MessageUtil.warning, error: MessageUtil.error, info: MessageUtil.info}}
*/
const MessageUtil = {
info: function(context, content) {
context.$message(content)
},
success: function(context, content) {
context.$message({
message: content,
type: 'success'
})
},
warning: function(context, content) {
context.$message({
message: content,
type: 'warning'
})
},
error: function(context, content) {
context.$message.error(content)
}
}
/**
* 通知工具类
* @type {{success: NotificationUtil.success, warning: NotificationUtil.warning, error: NotificationUtil.error, info: NotificationUtil.info}}
*/
const NotificationUtil = {
info: function(context, content) {
context.$notify({
message: content
})
},
success: function(context, content) {
context.$notify({
message: content,
type: 'success'
})
},
successDuration: function(context, content, durationTime) {
context.$notify({
message: content,
type: 'success',
duration: durationTime
})
},
warning: function(context, content) {
context.$notify({
message: content,
type: 'warning'
})
},
error: function(context, content) {
context.$notify({
message: content,
type: 'error'
})
},
errorDuration: function(context, content, durationTime) {
context.$notify({
message: content,
type: 'error',
duration: durationTime
})
}
}
const MessageBoxUtil = {
/**
* 确认消息对话框<br/>
* 提示用户确认其已经触发的动作, 并询问是否进行此操作时会用到此对话框
* @param context 上下文
* @param questionText 提示语
* @param msgType 消息类型(w、i、e、s)
* @param confirmCallBack 确认回调
* @param cancelCallBack 取消回调
*/
fullConfirm: function(context, questionText, msgType, confirmCallBack, cancelCallBack) {
let currentType = 'info'
if (msgType === 's') {
currentType = 'success'
} else if (msgType === 'e') {
currentType = 'error'
} else if (msgType === 'i') {
currentType = 'info'
} else if (msgType === 'w') {
currentType = 'warning'
}
context.$confirm(questionText, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: currentType
}).then(() => {
if (confirmCallBack != null) {
confirmCallBack()
}
}).catch(() => {
if (cancelCallBack != null) {
cancelCallBack()
}
})
},
/**
* 数据删除确认对话框
* @param context 上下文
* @param confirmCallBack 确认回调
* @param cancelCallBack 取消回调
*/
deleteConfirm: function(context, confirmCallBack, cancelCallBack) {
this.fullConfirm(context, '确定删除本条数据吗?', 'w', confirmCallBack, cancelCallBack)
},
/**
* 数据删除确认对话框(自定义提示内容)
* @param context 上下文
* @param message 提示内容
* @param confirmCallBack 确认回调
* @param cancelCallBack 取消回调
*/
deleteMessageConfirm: function(context, message, confirmCallBack, cancelCallBack) {
this.fullConfirm(context, message, 'w', confirmCallBack, cancelCallBack)
},
/**
* 数据输入对话框
* @param context 上下文
* @param title 标题提示
* @param patternText 正则表达式
* @param errorMsg 校验失败消息内容
* @param confirmCallBack 校验通过回调
* @param cancelCallBack 取消回调
*/
textInputConfirm: function(context, title, patternText, errorMsg, confirmCallBack, cancelCallBack) {
context.$prompt('', title, {
confirmButtonText: '确定',
cancelButtonText: '取消',
inputPattern: patternText,
inputErrorMessage: errorMsg
}).then(({ value }) => {
if (confirmCallBack != null) {
confirmCallBack(value)
}
}).catch(() => {
if (cancelCallBack != null) {
cancelCallBack()
}
})
},
/**
* 确认内容消息框
* @param context 上下文
* @param title 标题
* @param content 内容
*/
showConfirm: function(context, title, content) {
context.$alert(content, title, {
confirmButtonText: '关闭'
})
}
}
/**
* 全屏加载动画<br/>
* const loading = LoadingUtil.product()
* loading.close()
* @type {{product: (function(*): *)}}
*/
const LoadingUtil = {
product: function(context) {
return context.$loading({
lock: true,
text: '数据加载中',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
})
}
}
export {
MessageUtil,
MessageBoxUtil,
NotificationUtil,
LoadingUtil
}
-43
View File
@@ -1,43 +0,0 @@
/**
* 构造方法式
* @param context
* @param wsUri
* @constructor
*/
function MyWebSocket(context, wsUri) {
this.context = context
this.wsUri = wsUri
this.webSocket = null
/**
* 初始化WebSocket连接
* @param handleError -> function (e) { e是异常本身 }
* @param handleMessage -> function (e) { e.data是message }
*/
this.connect = function(handleError, handleMessage) {
this.webSocket = new WebSocket(this.wsUri)
// 连接发生错误
this.webSocket.onerror = handleError
// 收到消息
this.webSocket.onmessage = handleMessage
return this
}
/**
* 发送客户端数据
* @param data 客户端数据
*/
this.sendData = function(data) {
this.webSocket.send(JSON.stringify(data))
}
/**
* 用于关闭ws连接
*/
this.close = function() {
console.info('关闭连接')
if (this.webSocket.readyState === 1) {
this.sendData([{}])
this.webSocket.close()
}
}
}
export default MyWebSocket
@@ -1,6 +1,5 @@
package cn.odboy.devops.controller; package cn.odboy.devops.controller;
import cn.odboy.annotation.AnonymousGetMapping;
import cn.odboy.devops.dal.dataobject.PipelineInstanceTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceTb;
import cn.odboy.devops.dal.dataobject.PipelineTemplateTb; import cn.odboy.devops.dal.dataobject.PipelineTemplateTb;
import cn.odboy.devops.dal.model.DevOpsQueryLastPipelineDetailArgs; import cn.odboy.devops.dal.model.DevOpsQueryLastPipelineDetailArgs;
@@ -22,9 +21,9 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j @Slf4j
@RestController @RestController
@RequiredArgsConstructor @RequiredArgsConstructor
@RequestMapping("/api/devops/pipeline") @RequestMapping("/api/devops/pipelineInstance")
@Api(tags = "DevOps:流水线管理") @Api(tags = "DevOps:流水线实例管理")
public class DevopsPipelineController { public class DevopsPipelineInstanceController {
@Autowired @Autowired
private PipelineTemplateService pipelineTemplateService; private PipelineTemplateService pipelineTemplateService;
@Autowired @Autowired
@@ -67,7 +66,7 @@ public class DevopsPipelineController {
pipelineInstanceTb.setInstanceId(1947604330727079936L); pipelineInstanceTb.setInstanceId(1947604330727079936L);
String retryNodeCode = "node_build_java"; String retryNodeCode = "node_build_java";
pipelineInstanceService.restartPipeline(pipelineInstanceTb, retryNodeCode); pipelineInstanceService.restartPipeline(pipelineInstanceTb, retryNodeCode);
return ResponseEntity.ok("流水线重启成功"); return ResponseEntity.ok(pipelineInstanceService.restartPipeline(pipelineInstanceTb, retryNodeCode));
} }
@ApiOperation("查询流水线明细") @ApiOperation("查询流水线明细")
@@ -0,0 +1,34 @@
package cn.odboy.devops.controller;
import cn.odboy.base.CsArgs;
import cn.odboy.devops.service.PipelineTemplateService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/devops/pipelineTemplate")
@Api(tags = "DevOps:流水线模板管理")
public class DevopsPipelineTemplateController {
@Autowired
private PipelineTemplateService pipelineTemplateService;
@ApiOperation("根据id查询模板内容")
@PostMapping(value = "/getPipelineTemplate")
@PreAuthorize("@el.check()")
public ResponseEntity<?> getPipelineTemplate(@Validated @RequestBody CsArgs.FindByLongId args) {
return ResponseEntity.ok(pipelineTemplateService.getPipelineTemplateById(args.getId()));
}
}
@@ -1,11 +1,13 @@
package cn.odboy.devops.dal.dataobject; package cn.odboy.devops.dal.dataobject;
import cn.odboy.base.CsObject; import cn.odboy.base.CsObject;
import com.alibaba.fastjson2.annotation.JSONField;
import com.anwen.mongo.annotation.ID; import com.anwen.mongo.annotation.ID;
import com.anwen.mongo.annotation.collection.CollectionField; import com.anwen.mongo.annotation.collection.CollectionField;
import com.anwen.mongo.annotation.collection.CollectionName; import com.anwen.mongo.annotation.collection.CollectionName;
import com.anwen.mongo.enums.FieldFill; import com.anwen.mongo.enums.FieldFill;
import com.anwen.mongo.enums.IdTypeEnum; import com.anwen.mongo.enums.IdTypeEnum;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -27,11 +29,13 @@ public class PipelineInstanceNodeDetailTb extends CsObject {
* mongoid * mongoid
*/ */
@ID(type = IdTypeEnum.ASSIGN_ID) @ID(type = IdTypeEnum.ASSIGN_ID)
@JSONField(serializeUsing = ToStringSerializer.class)
private Long id; private Long id;
/** /**
* 流水线节点Id * 流水线节点Id
*/ */
@CollectionField("node_id") @CollectionField("node_id")
@JSONField(serializeUsing = ToStringSerializer.class)
private Long nodeId; private Long nodeId;
/** /**
@@ -3,11 +3,13 @@ package cn.odboy.devops.dal.dataobject;
import cn.odboy.base.CsObject; import cn.odboy.base.CsObject;
import cn.odboy.devops.constant.pipeline.PipelineStatusEnum; import cn.odboy.devops.constant.pipeline.PipelineStatusEnum;
import cn.odboy.devops.framework.pipeline.model.PipelineNodeOperateButtonVo; import cn.odboy.devops.framework.pipeline.model.PipelineNodeOperateButtonVo;
import com.alibaba.fastjson2.annotation.JSONField;
import com.anwen.mongo.annotation.ID; import com.anwen.mongo.annotation.ID;
import com.anwen.mongo.annotation.collection.CollectionField; import com.anwen.mongo.annotation.collection.CollectionField;
import com.anwen.mongo.annotation.collection.CollectionName; import com.anwen.mongo.annotation.collection.CollectionName;
import com.anwen.mongo.enums.FieldFill; import com.anwen.mongo.enums.FieldFill;
import com.anwen.mongo.enums.IdTypeEnum; import com.anwen.mongo.enums.IdTypeEnum;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -29,11 +31,13 @@ public class PipelineInstanceNodeTb extends CsObject {
* mongoid * mongoid
*/ */
@ID(type = IdTypeEnum.ASSIGN_ID) @ID(type = IdTypeEnum.ASSIGN_ID)
@JSONField(serializeUsing = ToStringSerializer.class)
private Long id; private Long id;
/** /**
* 流水线实例id * 流水线实例id
*/ */
@CollectionField("instance_id") @CollectionField("instance_id")
@JSONField(serializeUsing = ToStringSerializer.class)
private Long instanceId; private Long instanceId;
/** /**
* 节点名称 * 节点名称
@@ -1,10 +1,12 @@
package cn.odboy.devops.dal.dataobject; package cn.odboy.devops.dal.dataobject;
import cn.odboy.base.CsObject; import cn.odboy.base.CsObject;
import com.alibaba.fastjson2.annotation.JSONField;
import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Getter; import lombok.Getter;
@@ -27,6 +29,7 @@ import java.util.Date;
public class PipelineInstanceTb extends CsObject { public class PipelineInstanceTb extends CsObject {
@ApiModelProperty("流水线实例id") @ApiModelProperty("流水线实例id")
@TableId(value = "instance_id") @TableId(value = "instance_id")
@JSONField(serializeUsing = ToStringSerializer.class)
private Long instanceId; private Long instanceId;
@ApiModelProperty("创建时间") @ApiModelProperty("创建时间")
@@ -1,10 +1,12 @@
package cn.odboy.devops.dal.dataobject; package cn.odboy.devops.dal.dataobject;
import cn.odboy.base.CsBaseUserTimeLogicTb; import cn.odboy.base.CsBaseUserTimeLogicTb;
import com.alibaba.fastjson2.annotation.JSONField;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Getter; import lombok.Getter;
@@ -3,12 +3,11 @@ package cn.odboy.devops.dal.model;
import cn.odboy.base.CsObject; import cn.odboy.base.CsObject;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.NotBlank;
@Getter @Getter
@Setter @Setter
public class DevOpsQueryLastPipelineDetailArgs extends CsObject { public class DevOpsQueryLastPipelineDetailArgs extends CsObject {
@NotBlank(message = "流水线实例Id必填") @NotNull(message = "流水线实例Id必填")
private String instanceId; private String instanceId;
} }
@@ -0,0 +1,22 @@
package cn.odboy.devops.dal.model;
import cn.odboy.base.CsObject;
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class StartPipelineResultVo extends CsObject {
/**
* 流水线实例id
*/
@JSONField(serializeFeatures = JSONWriter.Feature.WriteLongAsString)
private Long instanceId;
/**
* 流水线模板内容
*/
private String templateContent;
}
@@ -9,10 +9,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import java.util.Date; import java.util.Date;
public abstract class AbstractPipelineNodeJobService { public abstract class AbstractPipelineNodeJobService {
// @Autowired
// private PipelineTemplateService pipelineTemplateService;
// @Autowired
// private PipelineInstanceService pipelineInstanceService;
@Autowired @Autowired
private PipelineInstanceNodeService pipelineInstanceNodeService; private PipelineInstanceNodeService pipelineInstanceNodeService;
@Autowired @Autowired
@@ -26,7 +26,7 @@ public class PipelineJobManage {
/** /**
* 启动 job * 启动 job
*/ */
public String startJob(PipelineInstanceTb pipelineInstance) { public PipelineInstanceTb startJob(PipelineInstanceTb pipelineInstance) {
// 流水线Id(雪花) // 流水线Id(雪花)
Long instanceId = IdUtil.getSnowflakeNextId(); Long instanceId = IdUtil.getSnowflakeNextId();
try { try {
@@ -52,7 +52,7 @@ public class PipelineJobManage {
log.error("创建定时任务失败", e); log.error("创建定时任务失败", e);
throw new BadRequestException("创建定时任务失败"); throw new BadRequestException("创建定时任务失败");
} }
return String.valueOf(instanceId); return pipelineInstance;
} }
/** /**
@@ -78,7 +78,7 @@ public class PipelineJobManage {
scheduler.interrupt(jobKey); scheduler.interrupt(jobKey);
} }
public void startJobByNodeCode(PipelineInstanceTb pipelineInstance, String retryNodeCode) { public PipelineInstanceTb startJobByNodeCode(PipelineInstanceTb pipelineInstance, String retryNodeCode) {
try { try {
Long instanceId = pipelineInstance.getInstanceId(); Long instanceId = pipelineInstance.getInstanceId();
String keyName = String.format(JOB_KEY, instanceId); String keyName = String.format(JOB_KEY, instanceId);
@@ -102,5 +102,6 @@ public class PipelineJobManage {
log.error("创建定时任务失败", e); log.error("创建定时任务失败", e);
throw new BadRequestException("创建定时任务失败"); throw new BadRequestException("创建定时任务失败");
} }
return pipelineInstance;
} }
} }
@@ -0,0 +1,23 @@
package cn.odboy.devops.framework.pipeline.model;
import cn.odboy.base.CsObject;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* 流水线实例Vo
*
* @author odboy
*/
@Getter
@Setter
public class PipelineInstanceVo extends CsObject {
private Long instanceId;
private String instanceName;
private String env;
private String contextName;
private String contextParams;
private List<PipelineNodeDataVo> nodes;
}
@@ -32,10 +32,10 @@ public class PipelineNodeBuildJavaJob extends AbstractPipelineNodeJobService imp
List<PipelineNodeTemplateVo> templateList = JSON.parseArray(jobDataMap.getString(PipelineConst.TEMPLATE), PipelineNodeTemplateVo.class); List<PipelineNodeTemplateVo> templateList = JSON.parseArray(jobDataMap.getString(PipelineConst.TEMPLATE), PipelineNodeTemplateVo.class);
PipelineNodeJobExecuteResult lastNodeResult = (PipelineNodeJobExecuteResult) jobDataMap.get(PipelineConst.LAST_NODE_RESULT); PipelineNodeJobExecuteResult lastNodeResult = (PipelineNodeJobExecuteResult) jobDataMap.get(PipelineConst.LAST_NODE_RESULT);
// 步骤执行 // 步骤执行
pipelineNodeBuildJavaBiz.initStart(pipelineInstanceNode, contextName, env, templateList, lastNodeResult); pipelineNodeBuildJavaBiz.buildJavaStart(pipelineInstanceNode, contextName, env, templateList, lastNodeResult);
pipelineNodeBuildJavaBiz.createReleaseBranch(pipelineInstanceNode, contextName, env, templateList, lastNodeResult); pipelineNodeBuildJavaBiz.startGitlabPipeline(pipelineInstanceNode, contextName, env, templateList, lastNodeResult);
pipelineNodeBuildJavaBiz.mergeMasterToRelease(pipelineInstanceNode, contextName, env, templateList, lastNodeResult); pipelineNodeBuildJavaBiz.uploadPackageToOss(pipelineInstanceNode, contextName, env, templateList, lastNodeResult);
pipelineNodeBuildJavaBiz.initFinish(pipelineInstanceNode, contextName, env, templateList, lastNodeResult); pipelineNodeBuildJavaBiz.buildJavaFinish(pipelineInstanceNode, contextName, env, templateList, lastNodeResult);
return PipelineNodeJobExecuteResult.success(); return PipelineNodeJobExecuteResult.success();
} }
} }
@@ -2,12 +2,14 @@ package cn.odboy.devops.job;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.constant.pipeline.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.dal.dataobject.PipelineTemplateTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
import cn.odboy.devops.framework.pipeline.model.PipelineNodeJobExecuteResult; import cn.odboy.devops.framework.pipeline.model.PipelineNodeJobExecuteResult;
import cn.odboy.devops.framework.pipeline.model.PipelineNodeTemplateVo; import cn.odboy.devops.framework.pipeline.model.PipelineNodeTemplateVo;
import cn.odboy.devops.job.biz.PipelineNodeBuildJavaBiz; import cn.odboy.devops.job.biz.PipelineNodeBuildJavaBiz;
import cn.odboy.devops.job.biz.PipelineNodeDeployJavaBiz; import cn.odboy.devops.job.biz.PipelineNodeDeployJavaBiz;
import cn.odboy.devops.service.PipelineTemplateService;
import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.exception.BadRequestException;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@@ -20,11 +22,15 @@ import java.util.List;
@Service(value = PipelineConst.EXECUTOR_PREFIX + "node_deploy_java") @Service(value = PipelineConst.EXECUTOR_PREFIX + "node_deploy_java")
public class PipelineNodeDeployJavaJob extends AbstractPipelineNodeJobService implements PipelineNodeJobExecutor { public class PipelineNodeDeployJavaJob extends AbstractPipelineNodeJobService implements PipelineNodeJobExecutor {
private final PipelineNodeDeployJavaBiz pipelineNodeDeployJavaBiz; private final PipelineNodeDeployJavaBiz pipelineNodeDeployJavaBiz;
private final PipelineTemplateService pipelineTemplateService;
@Override @Override
public PipelineNodeJobExecuteResult execute(JobDataMap jobDataMap) throws BadRequestException { public PipelineNodeJobExecuteResult execute(JobDataMap jobDataMap) throws BadRequestException {
// 参数列表 // 参数列表
long instanceId = jobDataMap.getLong(PipelineConst.INSTANCE_ID); long instanceId = jobDataMap.getLong(PipelineConst.INSTANCE_ID);
long templateId = jobDataMap.getLong(PipelineConst.TEMPLATE_ID);
PipelineTemplateTb pipelineTemplate = pipelineTemplateService.getPipelineTemplateById(templateId);
String templateType = pipelineTemplate.getType();
PipelineNodeTemplateVo currentNodeTemplate = (PipelineNodeTemplateVo) jobDataMap.get(PipelineConst.CURRENT_NODE_TEMPLATE); PipelineNodeTemplateVo currentNodeTemplate = (PipelineNodeTemplateVo) jobDataMap.get(PipelineConst.CURRENT_NODE_TEMPLATE);
PipelineInstanceNodeTb pipelineInstanceNode = getCurrentNodeInfo(instanceId, currentNodeTemplate.getCode()); PipelineInstanceNodeTb pipelineInstanceNode = getCurrentNodeInfo(instanceId, currentNodeTemplate.getCode());
String contextName = jobDataMap.getString(PipelineConst.CONTEXT_NAME); String contextName = jobDataMap.getString(PipelineConst.CONTEXT_NAME);
@@ -32,10 +38,9 @@ public class PipelineNodeDeployJavaJob extends AbstractPipelineNodeJobService im
List<PipelineNodeTemplateVo> templateList = JSON.parseArray(jobDataMap.getString(PipelineConst.TEMPLATE), PipelineNodeTemplateVo.class); List<PipelineNodeTemplateVo> templateList = JSON.parseArray(jobDataMap.getString(PipelineConst.TEMPLATE), PipelineNodeTemplateVo.class);
PipelineNodeJobExecuteResult lastNodeResult = (PipelineNodeJobExecuteResult) jobDataMap.get(PipelineConst.LAST_NODE_RESULT); PipelineNodeJobExecuteResult lastNodeResult = (PipelineNodeJobExecuteResult) jobDataMap.get(PipelineConst.LAST_NODE_RESULT);
// 步骤执行 // 步骤执行
pipelineNodeDeployJavaBiz.initStart(pipelineInstanceNode, contextName, env, templateList, lastNodeResult); pipelineNodeDeployJavaBiz.deployStart(pipelineInstanceNode, contextName, env, templateList, lastNodeResult);
pipelineNodeDeployJavaBiz.createReleaseBranch(pipelineInstanceNode, contextName, env, templateList, lastNodeResult); pipelineNodeDeployJavaBiz.deployJavaByWithContextName(pipelineInstanceNode, contextName, env, templateList, lastNodeResult, templateType);
pipelineNodeDeployJavaBiz.mergeMasterToRelease(pipelineInstanceNode, contextName, env, templateList, lastNodeResult); pipelineNodeDeployJavaBiz.deployFinish(pipelineInstanceNode, contextName, env, templateList, lastNodeResult);
pipelineNodeDeployJavaBiz.initFinish(pipelineInstanceNode, contextName, env, templateList, lastNodeResult);
return PipelineNodeJobExecuteResult.success(); return PipelineNodeJobExecuteResult.success();
} }
} }
@@ -32,10 +32,9 @@ public class PipelineNodeMergeBranchJob extends AbstractPipelineNodeJobService i
List<PipelineNodeTemplateVo> templateList = JSON.parseArray(jobDataMap.getString(PipelineConst.TEMPLATE), PipelineNodeTemplateVo.class); List<PipelineNodeTemplateVo> templateList = JSON.parseArray(jobDataMap.getString(PipelineConst.TEMPLATE), PipelineNodeTemplateVo.class);
PipelineNodeJobExecuteResult lastNodeResult = (PipelineNodeJobExecuteResult) jobDataMap.get(PipelineConst.LAST_NODE_RESULT); PipelineNodeJobExecuteResult lastNodeResult = (PipelineNodeJobExecuteResult) jobDataMap.get(PipelineConst.LAST_NODE_RESULT);
// 步骤执行 // 步骤执行
pipelineNodeMergeBranchBiz.initStart(pipelineInstanceNode, contextName, env, templateList, lastNodeResult); pipelineNodeMergeBranchBiz.mergeBranchStart(pipelineInstanceNode, contextName, env, templateList, lastNodeResult);
pipelineNodeMergeBranchBiz.createReleaseBranch(pipelineInstanceNode, contextName, env, templateList, lastNodeResult); pipelineNodeMergeBranchBiz.integrationAreaBranchMergeRelease(pipelineInstanceNode, contextName, env, templateList, lastNodeResult);
pipelineNodeMergeBranchBiz.mergeMasterToRelease(pipelineInstanceNode, contextName, env, templateList, lastNodeResult); pipelineNodeMergeBranchBiz.mergeBranchFinish(pipelineInstanceNode, contextName, env, templateList, lastNodeResult);
pipelineNodeMergeBranchBiz.initFinish(pipelineInstanceNode, contextName, env, templateList, lastNodeResult);
return PipelineNodeJobExecuteResult.success(); return PipelineNodeJobExecuteResult.success();
} }
} }
@@ -13,23 +13,21 @@ import java.util.List;
@Slf4j @Slf4j
@Service @Service
public class PipelineNodeBuildJavaBiz { public class PipelineNodeBuildJavaBiz {
@PipelineNodeStepLog("初始化开始")
public void initStart(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(5000);
}
@PipelineNodeStepLog("Master分支合并到Release分支") @PipelineNodeStepLog("构建开始")
public void mergeMasterToRelease(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void buildJavaStart(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(5000); ThreadUtil.safeSleep(2000);
} }
@PipelineNodeStepLog("构建中")
@PipelineNodeStepLog("新建Release分支") public void startGitlabPipeline(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) {
public void createReleaseBranch(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { ThreadUtil.safeSleep(2000);
ThreadUtil.safeSleep(5000);
} }
@PipelineNodeStepLog("上传包到OSS")
@PipelineNodeStepLog("初始化完成") public void uploadPackageToOss(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) {
public void initFinish(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { ThreadUtil.safeSleep(2000);
ThreadUtil.safeSleep(5000); }
@PipelineNodeStepLog("构建完成")
public void buildJavaFinish(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(2000);
} }
} }
@@ -13,23 +13,18 @@ import java.util.List;
@Slf4j @Slf4j
@Service @Service
public class PipelineNodeDeployJavaBiz { public class PipelineNodeDeployJavaBiz {
@PipelineNodeStepLog("初始化开始") @PipelineNodeStepLog("部署开始")
public void initStart(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void deployStart(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(5000); ThreadUtil.safeSleep(2000);
} }
@PipelineNodeStepLog("Master分支合并到Release分支") @PipelineNodeStepLog("部署中")
public void mergeMasterToRelease(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void deployJavaByWithContextName(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult, String templateType) {
ThreadUtil.safeSleep(5000); ThreadUtil.safeSleep(10000);
} }
@PipelineNodeStepLog("新建Release分支") @PipelineNodeStepLog("部署完成")
public void createReleaseBranch(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void deployFinish(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(5000); ThreadUtil.safeSleep(2000);
}
@PipelineNodeStepLog("初始化完成")
public void initFinish(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(5000);
} }
} }
@@ -13,23 +13,18 @@ import java.util.List;
@Slf4j @Slf4j
@Service @Service
public class PipelineNodeMergeBranchBiz { public class PipelineNodeMergeBranchBiz {
@PipelineNodeStepLog("初始化开始") @PipelineNodeStepLog("分支合并开始")
public void initStart(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void mergeBranchStart(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(5000); ThreadUtil.safeSleep(5000);
} }
@PipelineNodeStepLog("Master分支合并到Release分支") @PipelineNodeStepLog("集成区分支合并到release分支")
public void mergeMasterToRelease(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void integrationAreaBranchMergeRelease(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(5000); ThreadUtil.safeSleep(5000);
} }
@PipelineNodeStepLog("新建Release分支") @PipelineNodeStepLog("分支合并完成")
public void createReleaseBranch(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void mergeBranchFinish(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(5000);
}
@PipelineNodeStepLog("初始化完成")
public void initFinish(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(5000); ThreadUtil.safeSleep(5000);
} }
} }
@@ -1,6 +1,8 @@
package cn.odboy.devops.service; package cn.odboy.devops.service;
import cn.odboy.devops.dal.dataobject.PipelineInstanceTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceTb;
import cn.odboy.devops.dal.model.StartPipelineResultVo;
import cn.odboy.devops.framework.pipeline.model.PipelineInstanceVo;
import cn.odboy.devops.framework.pipeline.model.PipelineNodeDataVo; import cn.odboy.devops.framework.pipeline.model.PipelineNodeDataVo;
import java.util.List; import java.util.List;
@@ -14,7 +16,7 @@ import java.util.List;
* @since 2025-06-26 * @since 2025-06-26
*/ */
public interface PipelineInstanceService { public interface PipelineInstanceService {
String startPipeline(PipelineInstanceTb pipelineInstanceTb); StartPipelineResultVo startPipeline(PipelineInstanceTb pipelineInstanceTb);
void restartPipeline(PipelineInstanceTb pipelineInstanceTb, String retryNodeCode); StartPipelineResultVo restartPipeline(PipelineInstanceTb pipelineInstanceTb, String retryNodeCode);
List<PipelineNodeDataVo> queryLastPipelineDetail(String instanceId); PipelineInstanceVo queryLastPipelineDetail(String instanceId);
} }
@@ -2,6 +2,7 @@ package cn.odboy.devops.service;
import cn.odboy.devops.dal.dataobject.PipelineTemplateTb; import cn.odboy.devops.dal.dataobject.PipelineTemplateTb;
import cn.odboy.devops.dal.mysql.PipelineTemplateMapper; import cn.odboy.devops.dal.mysql.PipelineTemplateMapper;
import cn.odboy.framework.exception.BadRequestException;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -19,6 +20,15 @@ public class PipelineTemplateService {
private final PipelineTemplateMapper pipelineTemplateMapper; private final PipelineTemplateMapper pipelineTemplateMapper;
public PipelineTemplateTb getPipelineTemplateById(Long id) { public PipelineTemplateTb getPipelineTemplateById(Long id) {
return pipelineTemplateMapper.selectById(id); PipelineTemplateTb pipelineTemplateTb = pipelineTemplateMapper.selectById(id);
if (pipelineTemplateTb == null) {
throw new BadRequestException("模板不存在");
}
return pipelineTemplateTb;
}
public String getPipelineTemplateContentById(Long id) {
PipelineTemplateTb pipelineTemplateTb = getPipelineTemplateById(id);
return pipelineTemplateTb.getTemplate();
} }
} }
@@ -6,9 +6,11 @@ import cn.odboy.devops.constant.pipeline.PipelineStatusEnum;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeDetailTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeDetailTb;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.dal.dataobject.PipelineInstanceTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceTb;
import cn.odboy.devops.dal.model.StartPipelineResultVo;
import cn.odboy.devops.dal.mysql.PipelineInstanceMapper; import cn.odboy.devops.dal.mysql.PipelineInstanceMapper;
import cn.odboy.devops.dal.redis.PipelineInstanceDAO; import cn.odboy.devops.dal.redis.PipelineInstanceDAO;
import cn.odboy.devops.framework.pipeline.core.PipelineJobManage; import cn.odboy.devops.framework.pipeline.core.PipelineJobManage;
import cn.odboy.devops.framework.pipeline.model.PipelineInstanceVo;
import cn.odboy.devops.framework.pipeline.model.PipelineNodeDataVo; import cn.odboy.devops.framework.pipeline.model.PipelineNodeDataVo;
import cn.odboy.devops.service.PipelineInstanceNodeDetailService; import cn.odboy.devops.service.PipelineInstanceNodeDetailService;
import cn.odboy.devops.service.PipelineInstanceNodeService; import cn.odboy.devops.service.PipelineInstanceNodeService;
@@ -33,25 +35,29 @@ public class PipelineInstanceServiceImpl implements PipelineInstanceService {
private final PipelineInstanceNodeDetailService pipelineInstanceNodeDetailService; private final PipelineInstanceNodeDetailService pipelineInstanceNodeDetailService;
@Override @Override
public String startPipeline(PipelineInstanceTb pipelineInstanceTb) { public StartPipelineResultVo startPipeline(PipelineInstanceTb pipelineInstanceTb) {
if (pipelineInstanceDAO.lock(pipelineInstanceTb)) { if (pipelineInstanceDAO.lock(pipelineInstanceTb)) {
throw new BadRequestException("流水线运行中,无法重复执行"); throw new BadRequestException("流水线运行中,无法重复执行");
} }
return PipelineConst.INSTANCE_ID + pipelineJobManage.startJob(pipelineInstanceTb); PipelineInstanceTb record = pipelineJobManage.startJob(pipelineInstanceTb);
StartPipelineResultVo resultVo = new StartPipelineResultVo();
resultVo.setInstanceId(record.getInstanceId());
resultVo.setTemplateContent(record.getTemplateContent());
return resultVo;
} }
@Override @Override
public void restartPipeline(PipelineInstanceTb pipelineInstanceTb, String retryNodeCode) { public StartPipelineResultVo restartPipeline(PipelineInstanceTb pipelineInstanceTb, String retryNodeCode) {
if (pipelineInstanceTb.getInstanceId() == null) { if (pipelineInstanceTb.getInstanceId() == null) {
throw new BadRequestException("流水线实例Id必填"); throw new BadRequestException("流水线实例Id必填");
} }
if (pipelineInstanceDAO.lock(pipelineInstanceTb)) {
throw new BadRequestException("流水线运行中,无法重复执行");
}
PipelineInstanceTb currentInstance = pipelineInstanceMapper.selectById(pipelineInstanceTb.getInstanceId()); PipelineInstanceTb currentInstance = pipelineInstanceMapper.selectById(pipelineInstanceTb.getInstanceId());
if (currentInstance == null) { if (currentInstance == null) {
throw new BadRequestException("无效流水线,请刷新页面后再试"); throw new BadRequestException("无效流水线,请刷新页面后再试");
} }
if (pipelineInstanceDAO.lock(currentInstance)) {
throw new BadRequestException("流水线运行中,无法重复执行");
}
// pending、running、success、fail // pending、running、success、fail
List<String> canRestartStatus = new ArrayList<>() {{ List<String> canRestartStatus = new ArrayList<>() {{
add(PipelineStatusEnum.SUCCESS.getCode()); add(PipelineStatusEnum.SUCCESS.getCode());
@@ -62,11 +68,15 @@ public class PipelineInstanceServiceImpl implements PipelineInstanceService {
} }
log.info("解锁流水线, {}", JSON.toJSONString(currentInstance)); log.info("解锁流水线, {}", JSON.toJSONString(currentInstance));
pipelineInstanceDAO.unLock(currentInstance); pipelineInstanceDAO.unLock(currentInstance);
pipelineJobManage.startJobByNodeCode(currentInstance, retryNodeCode); PipelineInstanceTb record = pipelineJobManage.startJobByNodeCode(currentInstance, retryNodeCode);
StartPipelineResultVo resultVo = new StartPipelineResultVo();
resultVo.setInstanceId(record.getInstanceId());
resultVo.setTemplateContent(record.getTemplateContent());
return resultVo;
} }
@Override @Override
public List<PipelineNodeDataVo> queryLastPipelineDetail(String instanceIdStr) { public PipelineInstanceVo queryLastPipelineDetail(String instanceIdStr) {
String realInstanceIdStr = instanceIdStr.replace(PipelineConst.INSTANCE_ID, ""); String realInstanceIdStr = instanceIdStr.replace(PipelineConst.INSTANCE_ID, "");
Long instanceId = Long.valueOf(realInstanceIdStr); Long instanceId = Long.valueOf(realInstanceIdStr);
List<PipelineNodeDataVo> records = new ArrayList<>(); List<PipelineNodeDataVo> records = new ArrayList<>();
@@ -85,6 +95,8 @@ public class PipelineInstanceServiceImpl implements PipelineInstanceService {
dataVo.setCurrentNodeStatus(pipelineInstanceNodeDetail.getStepStatus()); dataVo.setCurrentNodeStatus(pipelineInstanceNodeDetail.getStepStatus());
records.add(dataVo); records.add(dataVo);
} }
return records; PipelineInstanceVo pipelineInstanceVo = BeanUtil.copyProperties(pipelineInstanceTb, PipelineInstanceVo.class);
pipelineInstanceVo.setNodes(records);
return pipelineInstanceVo;
} }
} }