From a2ccd9012c71b9a71034096e0a72372bba5f49f5 Mon Sep 17 00:00:00 2001 From: dengqichen Date: Tue, 7 Jan 2025 13:36:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E5=A3=B0=E9=81=93=E6=92=92=E6=97=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IJenkinsServiceIntegration.java | 7 ++ .../impl/JenkinsServiceIntegration.java | 1 + .../service/impl/JenkinsBuildServiceImpl.java | 99 ++++++++++--------- 3 files changed, 61 insertions(+), 46 deletions(-) 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 4e5c5559..f0a56774 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 @@ -68,6 +68,13 @@ public interface IJenkinsServiceIntegration extends IExternalSystemIntegration { */ List listJobs(ExternalSystem externalSystem, String viewName); + /** + * 获取任务详情 + * + * @param externalSystem Jenkins系统配置 + * @param jobName 任务名称 + * @return 任务详情 + */ JenkinsJobResponse job(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 991e10ca..cce0bd42 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 @@ -30,6 +30,7 @@ import java.util.Base64; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.ArrayList; @Slf4j @Service 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 3a8de7d7..cf569545 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 @@ -3,22 +3,14 @@ package com.qqchen.deploy.backend.deploy.service.impl; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.qqchen.deploy.backend.deploy.dto.JenkinsSyncHistoryDTO; -import com.qqchen.deploy.backend.deploy.entity.ExternalSystem; -import com.qqchen.deploy.backend.deploy.entity.JenkinsBuild; -import com.qqchen.deploy.backend.deploy.entity.JenkinsJob; -import com.qqchen.deploy.backend.deploy.entity.JenkinsView; +import com.qqchen.deploy.backend.deploy.entity.*; import com.qqchen.deploy.backend.deploy.dto.JenkinsBuildDTO; -import com.qqchen.deploy.backend.deploy.entity.QJenkinsBuild; import com.qqchen.deploy.backend.deploy.enums.ExternalSystemSyncStatus; import com.qqchen.deploy.backend.deploy.enums.JenkinsSyncType; -import com.qqchen.deploy.backend.deploy.integration.response.JenkinsJobResponse; +import com.qqchen.deploy.backend.deploy.integration.response.*; import com.qqchen.deploy.backend.deploy.query.JenkinsBuildQuery; import com.qqchen.deploy.backend.deploy.integration.IJenkinsServiceIntegration; -import com.qqchen.deploy.backend.deploy.integration.response.JenkinsBuildResponse; -import com.qqchen.deploy.backend.deploy.repository.IExternalSystemRepository; -import com.qqchen.deploy.backend.deploy.repository.IJenkinsBuildRepository; -import com.qqchen.deploy.backend.deploy.repository.IJenkinsJobRepository; -import com.qqchen.deploy.backend.deploy.repository.IJenkinsViewRepository; +import com.qqchen.deploy.backend.deploy.repository.*; import com.qqchen.deploy.backend.deploy.service.IJenkinsBuildService; import com.qqchen.deploy.backend.deploy.service.IJenkinsSyncHistoryService; import com.qqchen.deploy.backend.deploy.service.sync.JenkinsSyncContext; @@ -29,24 +21,16 @@ import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -/** - * Jenkins构建信息 Service实现 - */ @Slf4j @Service public class JenkinsBuildServiceImpl extends BaseServiceImpl @@ -157,9 +141,23 @@ public class JenkinsBuildServiceImpl extends BaseServiceImpl jobResponses = jenkinsServiceIntegration.listJobs(externalSystem, view.getViewName()); + if (jobResponses.isEmpty()) { + log.info("No job information available for view: {}", view.getViewName()); + return 0; + } + + // 3. 创建任务名称到响应的映射 + Map jobResponseMap = jobResponses.stream() + .collect(Collectors.toMap(JenkinsJobResponse::getName, job -> job)); + + // 4. 同步每个任务的构建信息 return jobs.stream() - .map(job -> syncJob(externalSystem, job)) + .map(job -> { + JenkinsJobResponse jobResponse = jobResponseMap.get(job.getJobName()); + return syncJob(externalSystem, job, jobResponse); + }) .mapToInt(Integer::intValue) .sum(); } catch (Exception e) { @@ -169,30 +167,28 @@ public class JenkinsBuildServiceImpl extends BaseServiceImpl lastBuild = jenkinsBuildRepository.findTopByExternalSystemIdAndJobIdOrderByBuildNumberDesc( externalSystem.getId(), job.getId()); - // 3. 获取需要同步的构建信息 + // 2. 获取需要同步的构建信息 List newBuilds = getNewBuilds(externalSystem, job, jobResponse, lastBuild); if (newBuilds.isEmpty()) { log.info("No new builds to sync for job: {}", job.getJobName()); return 0; } - // 4. 保存新的构建信息 + // 3. 保存新的构建信息 saveNewBuilds(externalSystem, job, newBuilds); - // 5. 更新任务的最新构建信息 + // 4. 更新任务的最新构建信息 updateJobLastBuild(job, jobResponse); log.info("Successfully synchronized {} builds for job: {}", newBuilds.size(), job.getJobName()); @@ -208,28 +204,42 @@ public class JenkinsBuildServiceImpl extends BaseServiceImpl lastBuild) { - // 获取所有构建 - List allBuilds = jenkinsServiceIntegration.listBuilds( - externalSystem, job.getJobName()); - - if (allBuilds.isEmpty()) { - return allBuilds; + + // 1. 获取最新构建号(从jobResponse中获取,避免额外的API调用) + if (jobResponse.getLastBuild() == null) { + log.info("No builds found for job: {}", job.getJobName()); + return Collections.emptyList(); } + Integer latestBuildNumber = jobResponse.getLastBuild().getNumber(); - // 如果是首次同步,获取所有构建 + // 2. 确定同步范围 + Integer fromBuildNumber; if (lastBuild.isEmpty()) { + // 首次同步,从第一个构建开始 log.info("First time sync for job: {}, will sync all builds", job.getJobName()); - return allBuilds; + fromBuildNumber = 1; + } else { + // 增量同步,从上次同步的下一个构建开始 + fromBuildNumber = lastBuild.get().getBuildNumber() + 1; } - // 获取新的构建 - Integer lastBuildNumber = lastBuild.get().getBuildNumber(); - List newBuilds = allBuilds.stream() - .filter(build -> build.getNumber() > lastBuildNumber) + // 3. 如果没有新的构建,直接返回 + if (fromBuildNumber > latestBuildNumber) { + log.info("No new builds to sync for job: {} (last build: {}, latest build: {})", + job.getJobName(), lastBuild.map(JenkinsBuild::getBuildNumber).orElse(null), latestBuildNumber); + return Collections.emptyList(); + } + + // 4. 获取构建信息 + List builds = jenkinsServiceIntegration.listBuilds(externalSystem, job.getJobName()); + + // 5. 过滤出需要的构建 + List newBuilds = builds.stream() + .filter(build -> build.getNumber() >= fromBuildNumber && build.getNumber() <= latestBuildNumber) .collect(Collectors.toList()); - log.info("Found {} new builds for job: {} (last build number: {})", - newBuilds.size(), job.getJobName(), lastBuildNumber); + log.info("Found {} new builds for job: {} (from build: {}, to build: {})", + newBuilds.size(), job.getJobName(), fromBuildNumber, latestBuildNumber); return newBuilds; } @@ -277,9 +287,6 @@ public class JenkinsBuildServiceImpl extends BaseServiceImpl