diff --git a/backend/pom.xml b/backend/pom.xml index e68b5775..146d5960 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -68,7 +68,6 @@ com.mysql mysql-connector-j - runtime @@ -220,11 +219,11 @@ flowable-bpmn-layout ${flowable.version} - - - - - + + + + + @@ -241,6 +240,11 @@ freemarker 2.3.32 + + com.zaxxer + HikariCP + 5.0.1 + diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/DeployLogApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/DeployLogApiController.java new file mode 100644 index 00000000..2fe84ad4 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/DeployLogApiController.java @@ -0,0 +1,29 @@ +package com.qqchen.deploy.backend.deploy.api; + +import com.qqchen.deploy.backend.framework.controller.BaseController; +import com.qqchen.deploy.backend.deploy.entity.DeployLog; +import com.qqchen.deploy.backend.deploy.dto.DeployLogDTO; +import com.qqchen.deploy.backend.deploy.query.DeployLogQuery; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import jakarta.servlet.http.HttpServletResponse; + +import java.util.List; + +/** + * 部署日志 Controller + */ +@Slf4j +@RestController +@RequestMapping("/api/v1/deploy-log") +@Tag(name = "部署日志管理", description = "部署日志管理相关接口") +public class DeployLogApiController extends BaseController { + + @Override + protected void exportData(HttpServletResponse response, List data) { + // TODO: 实现导出逻辑 + log.info("导出部署日志数据,数据量:{}", data.size()); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/converter/DeployLogConverter.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/converter/DeployLogConverter.java new file mode 100644 index 00000000..631198dd --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/converter/DeployLogConverter.java @@ -0,0 +1,13 @@ +package com.qqchen.deploy.backend.deploy.converter; + +import com.qqchen.deploy.backend.framework.converter.BaseConverter; +import com.qqchen.deploy.backend.deploy.entity.DeployLog; +import com.qqchen.deploy.backend.deploy.dto.DeployLogDTO; +import org.mapstruct.Mapper; + +/** + * 部署日志 Converter + */ +@Mapper(config = BaseConverter.class) +public interface DeployLogConverter extends BaseConverter { +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/DeployAppConfigDTO.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/DeployAppConfigDTO.java index a538b33c..90b70499 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/DeployAppConfigDTO.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/DeployAppConfigDTO.java @@ -5,13 +5,14 @@ import com.qqchen.deploy.backend.deploy.enums.BuildTypeEnum; import com.qqchen.deploy.backend.deploy.enums.DevelopmentLanguageTypeEnum; import com.qqchen.deploy.backend.framework.dto.BaseDTO; import com.qqchen.deploy.backend.workflow.dto.WorkflowDefinitionDTO; -import com.qqchen.deploy.backend.workflow.entity.WorkflowDefinition; +import com.qqchen.deploy.backend.workflow.enums.WorkflowInstanceStatusEnums; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; +import java.time.LocalDateTime; + /** * 应用配置DTO */ @@ -33,6 +34,15 @@ public class DeployAppConfigDTO extends BaseDTO { @Schema(description = "已发布的流程定义") private WorkflowDefinitionDTO publishedWorkflowDefinition; + @Schema(description = "最后一次部署状态") + private WorkflowInstanceStatusEnums lastBuildStatus; + + @Schema(description = "最后一次部署开始时间") + private LocalDateTime lastBuildStartTime; + + @Schema(description = "最后一次部署结束时间") + private LocalDateTime LastBuildEndTime; + @Schema(description = "表单配置") private JsonNode formVariablesSchema; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/DeployLogDTO.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/DeployLogDTO.java new file mode 100644 index 00000000..025014a6 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/DeployLogDTO.java @@ -0,0 +1,49 @@ +package com.qqchen.deploy.backend.deploy.dto; + +import com.fasterxml.jackson.databind.JsonNode; +import com.qqchen.deploy.backend.deploy.enums.DeployStatusEnum; +import com.qqchen.deploy.backend.framework.dto.BaseDTO; +import com.vladmihalcea.hibernate.type.json.JsonType; +import jakarta.persistence.Column; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.hibernate.annotations.Type; + +import java.time.LocalDateTime; + +/** + * 部署日志 DTO + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DeployLogDTO extends BaseDTO { + + /** + * 环境ID + */ + private Long workflowInstanceId; + + /** + * 环境ID + */ + private Long environmentId; + + /** + * 应用ID + */ + private Long applicationId; + + /** + * 部署版本号 + */ + private String deployVersion; + + private JsonNode variables; + + private JsonNode formVariables; + + /** + * 部署参数(JSON) + */ + private JsonNode deployVariables; +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/DeployLog.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/DeployLog.java new file mode 100644 index 00000000..9c1756f5 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/DeployLog.java @@ -0,0 +1,59 @@ +package com.qqchen.deploy.backend.deploy.entity; + +import com.fasterxml.jackson.databind.JsonNode; +import com.qqchen.deploy.backend.deploy.enums.DeployStatusEnum; +import com.qqchen.deploy.backend.framework.domain.Entity; +import com.vladmihalcea.hibernate.type.json.JsonType; +import jakarta.persistence.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.hibernate.annotations.Type; + +import java.time.LocalDateTime; + +/** + * 部署日志实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@jakarta.persistence.Entity +@Table(name = "deploy_log") +public class DeployLog extends Entity { + + + /** + * 环境ID + */ + @Column(name = "workflow_instance_id", nullable = false) + private Long workflowInstanceId; + + /** + * 环境ID + */ + @Column(name = "environment_id", nullable = false) + private Long environmentId; + + /** + * 应用ID + */ + @Column(name = "application_id", nullable = false) + private Long applicationId; + + /** + * 部署版本号 + */ + @Column(name = "deploy_version", nullable = false) + private String deployVersion; + + @Type(JsonType.class) + @Column(name = "form_variables", columnDefinition = "text", nullable = false) + private JsonNode formVariables; + + /** + * 部署参数(JSON) + */ + @Type(JsonType.class) + @Column(name = "deploy_variables", columnDefinition = "text", nullable = false) + private JsonNode deployVariables; + +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/enums/DeployStatusEnum.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/enums/DeployStatusEnum.java new file mode 100644 index 00000000..195f0f6d --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/enums/DeployStatusEnum.java @@ -0,0 +1,11 @@ +package com.qqchen.deploy.backend.deploy.enums; + +public enum DeployStatusEnum { + + PENDING, + DEPLOYING, + FAILURE, + + SUCCESS + +} diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/integration/IJenkinsServiceIntegration.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/integration/IJenkinsServiceIntegration.java index 81d533ba..4e5c5559 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/integration/IJenkinsServiceIntegration.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/integration/IJenkinsServiceIntegration.java @@ -32,7 +32,7 @@ public interface IJenkinsServiceIntegration extends IExternalSystemIntegration { * * @return 构建队列ID */ - String buildWithParameters(); + String buildWithParameters(ExternalSystem externalSystem, String jobName); /** * 获取队列中的构建信息 @@ -45,11 +45,11 @@ public interface IJenkinsServiceIntegration extends IExternalSystemIntegration { /** * 获取构建状态 * - * @param jobName 任务名称 + * @param jobName 任务名称 * @param buildNumber 构建编号 * @return 构建状态 */ - JenkinsBuildStatus getBuildStatus(String jobName, Integer buildNumber); + JenkinsBuildStatus getBuildStatus(ExternalSystem externalSystem, String jobName, Integer buildNumber); /** * 查询所有视图 @@ -63,7 +63,7 @@ public interface IJenkinsServiceIntegration extends IExternalSystemIntegration { * 查询视图下的所有任务 * * @param externalSystem Jenkins系统配置 - * @param viewName 视图名称 + * @param viewName 视图名称 * @return 任务列表 */ List listJobs(ExternalSystem externalSystem, String viewName); @@ -74,7 +74,7 @@ public interface IJenkinsServiceIntegration extends IExternalSystemIntegration { * 查询任务的构建信息 * * @param externalSystem Jenkins系统配置 - * @param jobName 任务名称 + * @param jobName 任务名称 * @return 构建信息列表 */ List listBuilds(ExternalSystem externalSystem, String jobName); diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/integration/impl/JenkinsServiceIntegration.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/integration/impl/JenkinsServiceIntegration.java index aa4aef11..991e10ca 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/integration/impl/JenkinsServiceIntegration.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/integration/impl/JenkinsServiceIntegration.java @@ -115,14 +115,13 @@ public class JenkinsServiceIntegration implements IJenkinsServiceIntegration { } @Override - public String buildWithParameters() { + public String buildWithParameters(ExternalSystem externalSystem, String jobName) { JenkinsCrumbIssuerResponse jenkinsCrumbIssue = getJenkinsCrumbIssue(); - ExternalSystem externalSystem = systemRepository.findById(1L).orElseThrow(() -> new RuntimeException("没有找到三方系统")); HttpHeaders headers = createHeaders(externalSystem); headers.set("Jenkins-Crumb", jenkinsCrumbIssue.getCrumb()); headers.set("Cookie", jenkinsCrumbIssue.getCookie()); HttpEntity entity = new HttpEntity<>(headers); - String url = externalSystem.getUrl() + String.format("/job/%s/buildWithParameters", "scp-meta"); + String url = externalSystem.getUrl() + String.format("/job/%s/buildWithParameters", jobName); ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class); // 2. 从Location头获取队列ID String location = response.getHeaders().getFirst("Location"); @@ -164,12 +163,9 @@ public class JenkinsServiceIntegration implements IJenkinsServiceIntegration { @Override - public JenkinsBuildStatus getBuildStatus(String jobName, Integer buildNumber) { + public JenkinsBuildStatus getBuildStatus(ExternalSystem externalSystem, String jobName, Integer buildNumber) { try { - ExternalSystem externalSystem = systemRepository.findById(1L).orElseThrow(() -> new RuntimeException("没有找到三方系统")); - String url = String.format("%s/job/%s/%d/api/json", externalSystem.getUrl().trim(), jobName, buildNumber); - ResponseEntity> response = restTemplate.exchange( url, HttpMethod.GET, diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/query/DeployLogQuery.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/query/DeployLogQuery.java new file mode 100644 index 00000000..7c0d9b9c --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/query/DeployLogQuery.java @@ -0,0 +1,18 @@ +package com.qqchen.deploy.backend.deploy.query; + +import com.qqchen.deploy.backend.framework.annotation.QueryField; +import com.qqchen.deploy.backend.framework.enums.QueryType; +import com.qqchen.deploy.backend.framework.query.BaseQuery; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.time.LocalDateTime; + +/** + * 部署日志查询对象 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DeployLogQuery extends BaseQuery { + + +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IDeployLogRepository.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IDeployLogRepository.java new file mode 100644 index 00000000..dd072f86 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IDeployLogRepository.java @@ -0,0 +1,14 @@ +package com.qqchen.deploy.backend.deploy.repository; + +import com.qqchen.deploy.backend.framework.repository.IBaseRepository; +import com.qqchen.deploy.backend.deploy.entity.DeployLog; +import org.springframework.stereotype.Repository; + +/** + * 部署日志 Repository + */ +@Repository +public interface IDeployLogRepository extends IBaseRepository { + DeployLog findTop1ByApplicationIdOrderByCreateTimeDesc(Long id); + +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IDeployLogService.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IDeployLogService.java new file mode 100644 index 00000000..1d0b5fa2 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IDeployLogService.java @@ -0,0 +1,12 @@ +package com.qqchen.deploy.backend.deploy.service; + +import com.qqchen.deploy.backend.framework.service.IBaseService; +import com.qqchen.deploy.backend.deploy.entity.DeployLog; +import com.qqchen.deploy.backend.deploy.dto.DeployLogDTO; +import com.qqchen.deploy.backend.deploy.query.DeployLogQuery; + +/** + * 部署日志 Service接口 + */ +public interface IDeployLogService extends IBaseService { +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/DeployAppConfigServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/DeployAppConfigServiceImpl.java index 754e5625..7bd7f4c1 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/DeployAppConfigServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/DeployAppConfigServiceImpl.java @@ -1,23 +1,33 @@ package com.qqchen.deploy.backend.deploy.service.impl; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import com.qqchen.deploy.backend.deploy.converter.ApplicationConverter; +import com.qqchen.deploy.backend.deploy.converter.DeployLogConverter; import com.qqchen.deploy.backend.deploy.dto.BuildConfigDefinedDTO; import com.qqchen.deploy.backend.deploy.dto.DeployAppBuildDTO; import com.qqchen.deploy.backend.deploy.dto.DeployAppConfigDTO; +import com.qqchen.deploy.backend.deploy.dto.DeployLogDTO; import com.qqchen.deploy.backend.deploy.entity.Application; import com.qqchen.deploy.backend.deploy.entity.DeployAppConfig; +import com.qqchen.deploy.backend.deploy.entity.DeployLog; import com.qqchen.deploy.backend.deploy.entity.Environment; import com.qqchen.deploy.backend.deploy.enums.BuildTypeEnum; import com.qqchen.deploy.backend.deploy.enums.DevelopmentLanguageTypeEnum; import com.qqchen.deploy.backend.deploy.query.DeployAppConfigQuery; import com.qqchen.deploy.backend.deploy.repository.IApplicationRepository; +import com.qqchen.deploy.backend.deploy.repository.IDeployLogRepository; import com.qqchen.deploy.backend.deploy.repository.IEnvironmentRepository; import com.qqchen.deploy.backend.deploy.service.IDeployAppConfigService; +import com.qqchen.deploy.backend.deploy.service.IDeployLogService; import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl; import com.qqchen.deploy.backend.workflow.converter.WorkflowDefinitionConverter; +import com.qqchen.deploy.backend.workflow.dto.WorkflowInstanceDTO; import com.qqchen.deploy.backend.workflow.dto.WorkflowInstanceStartRequest; import com.qqchen.deploy.backend.workflow.entity.WorkflowDefinition; +import com.qqchen.deploy.backend.workflow.entity.WorkflowInstance; import com.qqchen.deploy.backend.workflow.repository.IWorkflowDefinitionRepository; +import com.qqchen.deploy.backend.workflow.repository.IWorkflowInstanceRepository; import com.qqchen.deploy.backend.workflow.service.IWorkflowInstanceService; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; @@ -58,15 +68,42 @@ public class DeployAppConfigServiceImpl extends BaseServiceImpl page(DeployAppConfigQuery query) { Page page = super.page(query); List result = page.getContent().stream().peek(deployAppConfig -> { Optional optionalApplication = applicationRepository.findById(deployAppConfig.getApplicationId()); - optionalApplication.ifPresent(application -> deployAppConfig.setApplication(applicationConverter.toDto(application))); + if (optionalApplication.isPresent()) { + Application application = optionalApplication.get(); + deployAppConfig.setApplication(applicationConverter.toDto(application)); + DeployLog lastDeployLog = deployLogRepository.findTop1ByApplicationIdOrderByCreateTimeDesc(application.getId()); + Optional optionalWorkflowInstance = workflowInstanceRepository.findById(lastDeployLog.getWorkflowInstanceId()); + if (optionalWorkflowInstance.isPresent()) { + WorkflowInstance workflowInstance = optionalWorkflowInstance.get(); + deployAppConfig.setLastBuildStatus(workflowInstance.getStatus()); + deployAppConfig.setLastBuildStartTime(workflowInstance.getStartTime()); + deployAppConfig.setLastBuildEndTime(workflowInstance.getEndTime()); + } + } Optional optionalWorkflowDefinition = workflowDefinitionRepository.findById(deployAppConfig.getWorkflowDefinitionId()); optionalWorkflowDefinition.ifPresent(workflowDefinition -> deployAppConfig.setPublishedWorkflowDefinition(workflowDefinitionConverter.toDto(workflowDefinition))); + + }).collect(toList()); return new PageImpl<>(result, page.getPageable(), page.getTotalElements()); } @@ -107,11 +144,26 @@ public class DeployAppConfigServiceImpl extends BaseServiceImpl new RuntimeException("Workflow definition not found: " + dto.getWorkflowDefinitionId())); Environment environment = environmentRepository.findById(dto.getEnvironmentId()).orElseThrow(() -> new RuntimeException("Environment not found: " + dto.getEnvironmentId())); Application application = applicationRepository.findById(dto.getApplicationId()).orElseThrow(() -> new RuntimeException("Application not found: " + dto.getApplicationId())); - WorkflowInstanceStartRequest request = new WorkflowInstanceStartRequest(); request.setProcessKey(workflowDefinition.getKey()); request.setBusinessKey(environment.getEnvCode() + "_" + application.getAppCode() + "_" + System.currentTimeMillis() / 1000); - workflowInstanceService.startWorkflow(request); + request.setVariables(objectMapper.convertValue(dto.getBuildVariables(), new TypeReference<>() { + })); + + WorkflowInstanceDTO workflowInstanceDTO = workflowInstanceService.startWorkflow(request); + buildAndSaveDeployLog(dto, environment, application, workflowInstanceDTO); + } + + private void buildAndSaveDeployLog(DeployAppBuildDTO deployAppBuild, Environment environment, Application application, WorkflowInstanceDTO workflowInstance) { + DeployLogDTO deployLog = new DeployLogDTO(); + deployLog.setEnvironmentId(environment.getId()); + deployLog.setApplicationId(application.getId()); + deployLog.setWorkflowInstanceId(workflowInstance.getId()); + deployLog.setVariables(deployAppBuild.getBuildVariables()); + deployLog.setDeployVersion(application.getAppCode() + "_" + System.currentTimeMillis() / 1000); + deployLog.setDeployVariables(deployAppBuild.getBuildVariables()); + deployLog.setFormVariables(deployAppBuild.getFormVariables()); + deployLogService.create(deployLog); } @Override diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/DeployLogServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/DeployLogServiceImpl.java new file mode 100644 index 00000000..d0180477 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/DeployLogServiceImpl.java @@ -0,0 +1,17 @@ +package com.qqchen.deploy.backend.deploy.service.impl; + +import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl; +import com.qqchen.deploy.backend.deploy.entity.DeployLog; +import com.qqchen.deploy.backend.deploy.dto.DeployLogDTO; +import com.qqchen.deploy.backend.deploy.query.DeployLogQuery; +import com.qqchen.deploy.backend.deploy.service.IDeployLogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 部署日志 Service实现 + */ +@Slf4j +@Service +public class DeployLogServiceImpl extends BaseServiceImpl implements IDeployLogService { +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/JenkinsBuildServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/JenkinsBuildServiceImpl.java index be7ed460..f05de9fb 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/JenkinsBuildServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/JenkinsBuildServiceImpl.java @@ -176,7 +176,7 @@ public class JenkinsBuildServiceImpl extends BaseServiceImpl * panelVariables: 节点配置,一次配置长期有效 * localVariables: 运行时变量,每次执行都会变化 - * fromVariables: 表单输入,每次执行需要用户填写 */ @Slf4j public abstract class BaseNodeDelegate implements JavaDelegate { @@ -39,8 +39,6 @@ public abstract class BaseNodeDelegate implements JavaDelegate { // 字段注入,由Flowable自动设置 protected Expression panelVariables; - protected Expression localVariables; - @Override public void execute(DelegateExecution execution) { try { @@ -55,13 +53,7 @@ public abstract class BaseNodeDelegate implements JavaDelegate { } // 获取并转换Local变量 - L localVars = null; - if (localVariables != null) { - String localVarsJson = localVariables.getValue(execution).toString(); - JsonNode localVarsNode = objectMapper.readTree(localVarsJson); - localVars = objectMapper.treeToValue(localVarsNode, getLocalVariablesClass()); - } - + L localVars = objectMapper.convertValue(execution.getVariables(), getLocalVariablesClass()); // 执行具体的任务逻辑 executeInternal(execution, panelVars, localVars); diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/DeployNodeDelegate.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/DeployNodeDelegate.java index 04a2382d..3ca90dfe 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/DeployNodeDelegate.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/DeployNodeDelegate.java @@ -1,8 +1,13 @@ package com.qqchen.deploy.backend.workflow.delegate; +import com.qqchen.deploy.backend.deploy.entity.ExternalSystem; +import com.qqchen.deploy.backend.deploy.entity.JenkinsJob; import com.qqchen.deploy.backend.deploy.enums.JenkinsBuildStatus; +import com.qqchen.deploy.backend.deploy.integration.IExternalSystemIntegration; import com.qqchen.deploy.backend.deploy.integration.IJenkinsServiceIntegration; import com.qqchen.deploy.backend.deploy.integration.response.JenkinsQueueBuildInfoResponse; +import com.qqchen.deploy.backend.deploy.repository.IExternalSystemRepository; +import com.qqchen.deploy.backend.deploy.repository.IJenkinsJobRepository; import com.qqchen.deploy.backend.workflow.constants.WorkFlowConstants; import com.qqchen.deploy.backend.workflow.dto.definition.node.localVariables.DeployNodeLocalVariables; import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.DeployNodePanelVariables; @@ -36,6 +41,12 @@ public class DeployNodeDelegate extends BaseNodeDelegate getPanelVariablesClass() { return DeployNodePanelVariables.class; @@ -48,10 +59,12 @@ public class DeployNodeDelegate extends BaseNodeDelegate new RuntimeException("ExternalSystem not found!!!")); + JenkinsJob jenkinsJob = jenkinsJobRepository.findById(localVariables.getJobId()).orElseThrow(() -> new RuntimeException("Jenkins job not found!!!")); + String queueId = jenkinsServiceIntegration.buildWithParameters(externalSystem, jenkinsJob.getJobName()); JenkinsQueueBuildInfoResponse buildInfo = waitForBuildToStart(queueId); // 3. 轮询构建状态 - pollBuildStatus("scp-meta", buildInfo.getBuildNumber()); + pollBuildStatus(externalSystem, jenkinsJob.getJobName(), buildInfo.getBuildNumber()); } private JenkinsQueueBuildInfoResponse waitForBuildToStart(String queueId) { @@ -77,7 +90,7 @@ public class DeployNodeDelegate extends BaseNodeDelegate variables; } diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/localVariables/DeployNodeLocalVariables.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/localVariables/DeployNodeLocalVariables.java index 5dcbefd2..9fd7bdb9 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/localVariables/DeployNodeLocalVariables.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/localVariables/DeployNodeLocalVariables.java @@ -14,7 +14,7 @@ public class DeployNodeLocalVariables extends BaseNodeLocalVariables { description = "三方Jenkins系统", required = true ) - private String externalSystemId; + private Long externalSystemId; @SchemaProperty( @@ -23,7 +23,7 @@ public class DeployNodeLocalVariables extends BaseNodeLocalVariables { required = true, order = 3 ) - private String viewId; + private Long viewId; @SchemaProperty( @@ -32,6 +32,6 @@ public class DeployNodeLocalVariables extends BaseNodeLocalVariables { required = true, order = 4 ) - private String jobId; + private Long jobId; } diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/impl/WorkflowInstanceServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/impl/WorkflowInstanceServiceImpl.java index f2bf39b7..eba63071 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/impl/WorkflowInstanceServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/impl/WorkflowInstanceServiceImpl.java @@ -178,7 +178,9 @@ public class WorkflowInstanceServiceImpl extends BaseServiceImpl new RuntimeException("Workflow definition process key not found: " + request.getProcessKey())); ProcessInstance processInstance = runtimeService.createProcessInstanceBuilder() .processDefinitionKey(request.getProcessKey()) + .variables(request.getVariables()) .businessKey(request.getBusinessKey()) + .variables(request.getVariables()) .startAsync(); // 异步启动,会自动执行 shell 任务 // .start(); return createWorkflowInstance(workflowDefinition.getId(), request.getBusinessKey(), processInstance); diff --git a/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql b/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql index 2b2a1469..29b71892 100644 --- a/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql +++ b/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql @@ -647,3 +647,26 @@ CREATE TABLE deploy_project_group_environment REFERENCES deploy_environment (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='项目组环境关联表'; + +CREATE TABLE deploy_log +( + -- 基础字段 + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + -- 业务字段 + workflow_instance_id BIGINT NULL COMMENT '工作流实例ID', + environment_id BIGINT NOT NULL COMMENT '环境ID', + application_id BIGINT NOT NULL COMMENT '应用ID', + deploy_version VARCHAR(100) NOT NULL COMMENT '部署版本号', + form_variables TEXT NULL COMMENT '部署参数(JSON)', + deploy_variables TEXT NULL COMMENT '部署参数(JSON)', + + create_by VARCHAR(100) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + update_by VARCHAR(100) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 1 COMMENT '版本号', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除:0-未删除,1-已删除' +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_unicode_ci COMMENT ='部署日志表'; +