diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/enums/JenkinsBuildStatus.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/enums/JenkinsBuildStatus.java index da75517b..6c6f484b 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/enums/JenkinsBuildStatus.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/enums/JenkinsBuildStatus.java @@ -2,7 +2,9 @@ package com.qqchen.deploy.backend.deploy.enums; // Jenkins构建状态枚举 public enum JenkinsBuildStatus { + SUCCESS, // 构建成功 + FAILURE, // 构建失败 IN_PROGRESS,// 构建中 ABORTED, // 构建被取消 diff --git a/backend/src/main/java/com/qqchen/deploy/backend/framework/utils/DateUtils.java b/backend/src/main/java/com/qqchen/deploy/backend/framework/utils/DateUtils.java index 9d921e1a..b80fd496 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/framework/utils/DateUtils.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/framework/utils/DateUtils.java @@ -21,4 +21,28 @@ public class DateUtils { public static LocalDateTime toLocalDateTime(long millis) { return LocalDateTime.ofInstant(Instant.ofEpochMilli(millis), ZoneId.systemDefault()); } + + /** + * Format a duration in milliseconds to HH:mm:ss (zero-padded). + * Example: 159000 -> 00:02:39 + */ + public static String formatDurationHMS(long millis) { + if (millis < 0) millis = 0; + long totalSeconds = millis / 1000L; + long hours = totalSeconds / 3600L; + long minutes = (totalSeconds % 3600L) / 60L; + long seconds = totalSeconds % 60L; + return String.format("%02d:%02d:%02d", hours, minutes, seconds); + } + + /** + * Format a duration in seconds to HH:mm:ss (zero-padded). + */ + public static String formatDurationHMSBySeconds(long seconds) { + if (seconds < 0) seconds = 0; + long hours = seconds / 3600L; + long minutes = (seconds % 3600L) / 60L; + long sec = seconds % 60L; + return String.format("%02d:%02d:%02d", hours, minutes, sec); + } } diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/JenkinsBuildDelegate.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/JenkinsBuildDelegate.java index f2f659da..d8fcd0b2 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/JenkinsBuildDelegate.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/JenkinsBuildDelegate.java @@ -1,30 +1,24 @@ 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.IJenkinsServiceIntegration; import com.qqchen.deploy.backend.deploy.integration.response.JenkinsConsoleOutputResponse; import com.qqchen.deploy.backend.deploy.integration.response.JenkinsBuildResponse; 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.inputmapping.JenkinsBuildInputMapping; import com.qqchen.deploy.backend.workflow.dto.outputs.JenkinsBuildOutputs; -import com.qqchen.deploy.backend.workflow.entity.WorkflowNodeInstance; import com.qqchen.deploy.backend.workflow.enums.LogLevel; import com.qqchen.deploy.backend.workflow.enums.LogSource; -import com.qqchen.deploy.backend.workflow.enums.NodeExecutionStatusEnum; -import com.qqchen.deploy.backend.workflow.service.IWorkflowNodeInstanceService; import com.qqchen.deploy.backend.workflow.service.IWorkflowNodeLogService; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.BpmnError; import org.flowable.engine.delegate.DelegateExecution; import org.springframework.stereotype.Component; - +import com.qqchen.deploy.backend.framework.utils.DateUtils; + import java.util.HashMap; import java.util.Map; @@ -90,29 +84,13 @@ public class JenkinsBuildDelegate extends BaseNodeDelegate { + log.info("Jenkins build succeeded: job={}, buildNumber={}", jobName, buildNumber); + logInfo(String.format("✅ Jenkins 构建成功: buildNumber=%d", buildNumber)); + } + case FAILURE -> { + log.info("Jenkins build failed: job={}, buildNumber={}", jobName, buildNumber); + logInfo(String.format("❌ Jenkins 构建失败: buildNumber=%d", buildNumber)); + } + case ABORTED -> { + log.info("Jenkins build aborted: job={}, buildNumber={}", jobName, buildNumber); + logInfo(String.format("⏹ Jenkins 构建被取消: buildNumber=%d", buildNumber)); + } + case NOT_FOUND -> { + log.warn("Jenkins build not found: job={}, buildNumber={}", jobName, buildNumber); + logInfo(String.format("⚠ Jenkins 构建记录不存在: buildNumber=%d", buildNumber)); + } + } + } + + /** + * 将服务层返回的构建详情填充到输出对象 + */ + private void fillOutputsFrom(JenkinsQueueBuildInfoResponse buildInfo, JenkinsBuildResponse buildDetails, JenkinsBuildStatus buildStatus, JenkinsBuildOutputs output) { + // Jenkins 基本信息 + output.setBuildStatus(buildStatus); + output.setBuildNumber(buildInfo.getBuildNumber()); + output.setBuildUrl(buildInfo.getBuildUrl()); + + // 构建时长(毫秒与秒) + long durationMs = buildDetails.getDuration() != null ? Math.max(0L, buildDetails.getDuration()) : 0L; + int durationSeconds = (int) Math.min(Integer.MAX_VALUE, durationMs / 1000L); + output.setBuildDuration(durationSeconds); + output.setBuildDurationMillis(durationMs); + output.setBuildDurationFormatted(DateUtils.formatDurationHMS(durationMs)); + + // 结束时间(服务层已计算) + output.setBuildEndTimeMillis(buildDetails.getEndTimeMillis()); + output.setBuildEndTime(buildDetails.getEndTime()); + + // Git 提交ID(服务层已兜底) + output.setGitCommitId(buildDetails.getGitCommitId() != null ? buildDetails.getGitCommitId() : ""); + + // 制品URL(服务层已拼接) + output.setArtifactUrl(buildDetails.getArtifactUrl() != null ? buildDetails.getArtifactUrl() : ""); + } } diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/outputs/JenkinsBuildOutputs.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/outputs/JenkinsBuildOutputs.java index 69196c1f..75a46f0c 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/outputs/JenkinsBuildOutputs.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/outputs/JenkinsBuildOutputs.java @@ -1,6 +1,6 @@ package com.qqchen.deploy.backend.workflow.dto.outputs; -import lombok.Builder; +import com.qqchen.deploy.backend.deploy.enums.JenkinsBuildStatus; import lombok.Data; import lombok.EqualsAndHashCode; @@ -22,7 +22,7 @@ public class JenkinsBuildOutputs extends BaseNodeOutputs { /** * 构建状态 */ - private String buildStatus; + private JenkinsBuildStatus buildStatus; /** * 构建URL @@ -44,8 +44,18 @@ public class JenkinsBuildOutputs extends BaseNodeOutputs { */ private Integer buildDuration; - private Long deployEndTimeMillis; + /** + * 构建时长(毫秒) + */ + private Long buildDurationMillis; - private String deployEndTime; + /** + * 构建时长(格式:HH:mm:ss),例如 00:02:39 + */ + private String buildDurationFormatted; + + private Long buildEndTimeMillis; + + private String buildEndTime; }