refactor(devops): 重构流水线相关代码
- 重命名 DevopsPipelineController 为 DevopsPipelineInstanceController - 新增 DevopsPipelineTemplateController - 修改流水线实例和模板相关的数据结构 - 优化流水线启动和重启逻辑 - 调整前端 API 路径
This commit is contained in:
@@ -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%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 })
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -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
|
|
||||||
+4
-5
@@ -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("查询流水线明细")
|
||||||
+34
@@ -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()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+4
@@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+4
@@ -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;
|
||||||
/**
|
/**
|
||||||
* 节点名称
|
* 节点名称
|
||||||
|
|||||||
+3
@@ -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("创建时间")
|
||||||
|
|||||||
+2
@@ -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;
|
||||||
|
|||||||
+2
-3
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
+22
@@ -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;
|
||||||
|
}
|
||||||
-4
@@ -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
|
||||||
|
|||||||
+4
-3
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+23
@@ -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;
|
||||||
|
}
|
||||||
+4
-4
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-4
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-4
@@ -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
-15
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-14
@@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-11
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-3
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-1
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+21
-9
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user