From 394315f7f0b498698be924a8bce8f287bac574a3 Mon Sep 17 00:00:00 2001 From: asp_ly Date: Sun, 29 Dec 2024 00:14:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=94=9F=E6=88=90=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E6=9C=8D=E5=8A=A1=E4=BB=A3=E7=A0=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/deploy/entity/JenkinsJob.java | 8 +-- .../impl/JenkinsServiceIntegration.java | 10 +-- .../service/impl/JenkinsJobServiceImpl.java | 61 ++++++++++++------- 3 files changed, 47 insertions(+), 32 deletions(-) diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/JenkinsJob.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/JenkinsJob.java index 6f7c5319..268379c7 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/JenkinsJob.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/JenkinsJob.java @@ -27,16 +27,16 @@ public class JenkinsJob extends Entity { @Column(name = "job_url", nullable = false) private String jobUrl; - @Column(name = "next_build_number", nullable = false) + @Column(name = "next_build_number") private Integer nextBuildNumber; - @Column(name = "last_build_number", nullable = false) + @Column(name = "last_build_number") private Integer lastBuildNumber; - @Column(name = "last_build_status", nullable = false) + @Column(name = "last_build_status") private String lastBuildStatus; - @Column(name = "health_report_score", nullable = false) + @Column(name = "health_report_score") private Integer healthReportScore; @Column(name = "last_build_time") 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 372bfb8e..bb4f9763 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 @@ -269,7 +269,7 @@ public class JenkinsServiceIntegration implements IJenkinsServiceIntegration { } catch (Exception e) { log.error("Failed to call Jenkins API: path={}, error={}, responseType={}", path, e.getMessage(), responseType.getSimpleName(), e); - throw new RuntimeException("调用Jenkins API��败: " + path, e); + throw new RuntimeException("调用Jenkins API失败: " + path, e); } } @@ -314,9 +314,9 @@ public class JenkinsServiceIntegration implements IJenkinsServiceIntegration { * @return 任务列表 */ public List listJobs(ExternalSystem externalSystem, String viewName) { - // 只查询必要的字段 + // 只查询必要的字段,确保包含lastBuild的timestamp字段 String treeQuery = "jobs[name,url,description,buildable,nextBuildNumber," + - "lastBuild[number],color]"; + "lastBuild[number,timestamp,result],color]"; List jobs = callJenkinsApi( externalSystem, @@ -326,19 +326,15 @@ public class JenkinsServiceIntegration implements IJenkinsServiceIntegration { JenkinsJobResponse.class ); - // 过滤和清洗数据 String baseUrl = StringUtils.removeEnd(externalSystem.getUrl(), "/"); return jobs.stream() .peek(job -> { - // 清理描述中的多余空格 if (job.getDescription() != null) { job.setDescription(job.getDescription().trim()); } - // 转换URL为相对路径 if (job.getUrl() != null) { job.setUrl(job.getUrl().replace(baseUrl, "")); } - // 设置默认值 if (job.getBuildable() == null) { job.setBuildable(false); } diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/JenkinsJobServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/JenkinsJobServiceImpl.java index 38b1f5c6..eace3421 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/JenkinsJobServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/JenkinsJobServiceImpl.java @@ -24,6 +24,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.OptionalDouble; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; /** * Jenkins任务 Service实现 @@ -92,42 +98,43 @@ public class JenkinsJobServiceImpl extends BaseServiceImpl jobResponses = jenkinsServiceIntegration.listJobs(externalSystem, view.getViewName()); if (jobResponses.isEmpty()) { log.info("No jobs found in Jenkins view: {}", view.getViewName()); return 0; } + // 2. 查询现有任务 + List existingJobs = jenkinsJobRepository.findByExternalSystemIdAndViewId( + externalSystem.getId(), + view.getId() + ); + Map jobMap = existingJobs.stream() + .collect(Collectors.toMap(JenkinsJob::getJobName, Function.identity())); + // 3. 转换并保存/更新任务数据 List jenkinsJobs = new ArrayList<>(); for (JenkinsJobResponse jobResponse : jobResponses) { - // 查找是否存在相同的任务 - Optional existingJob = jenkinsJobRepository.findByExternalSystemIdAndViewIdAndJobName(externalSystem.getId(), view.getId(), jobResponse.getName()); - - JenkinsJob jenkinsJob; - if (existingJob.isPresent()) { - // 更新已存在的任务 - jenkinsJob = existingJob.get(); - updateJobFromResponse(jenkinsJob, jobResponse); - log.debug("Updating existing Jenkins job: {}", jenkinsJob.getJobName()); - } else { - // 创建新的任务 - jenkinsJob = new JenkinsJob(); - jenkinsJob.setExternalSystemId(externalSystem.getId()); - jenkinsJob.setViewId(view.getId()); - jenkinsJob.setJobName(jobResponse.getName()); - updateJobFromResponse(jenkinsJob, jobResponse); - log.debug("Creating new Jenkins job: {}", jenkinsJob.getJobName()); - } + JenkinsJob jenkinsJob = jobMap.getOrDefault(jobResponse.getName(), new JenkinsJob()); + + // 设置基本信息 + jenkinsJob.setExternalSystemId(externalSystem.getId()); + jenkinsJob.setViewId(view.getId()); + jenkinsJob.setJobName(jobResponse.getName()); + + // 更新任务信息 + updateJobFromResponse(jenkinsJob, jobResponse); + + // 添加到待保存列表 jenkinsJobs.add(jenkinsJob); + log.debug("{} Jenkins job: {}", jenkinsJob.getId() == null ? "Creating new" : "Updating existing", jenkinsJob.getJobName()); } // 4. 批量保存或更新 jenkinsJobRepository.saveAll(jenkinsJobs); log.info("Successfully synchronized {} Jenkins jobs for view: {}", jenkinsJobs.size(), view.getViewName()); - return jenkinsJobs.size(); } @@ -143,8 +150,20 @@ public class JenkinsJobServiceImpl extends BaseServiceImpl