大声道撒旦

This commit is contained in:
dengqichen 2024-12-30 13:42:56 +08:00
parent b1bfd0540f
commit 298866cf00
6 changed files with 101 additions and 19 deletions

View File

@ -18,10 +18,16 @@ public class JenkinsInstanceDTO extends BaseDTO {
private int totalViews;
private LocalDateTime lastSyncViewsTime;
private int totalJobs;
private LocalDateTime lastSyncJobsTime;
private int totalBuilds;
private LocalDateTime lastSyncBuildsTime;
private List<JenkinsViewDTO> jenkinsViewList;
private List<JenkinsJobDTO> jenkinsJobList;

View File

@ -68,6 +68,8 @@ public interface IJenkinsServiceIntegration extends IExternalSystemIntegration {
*/
List<JenkinsJobResponse> listJobs(ExternalSystem externalSystem, String viewName);
JenkinsJobResponse job(ExternalSystem externalSystem, String jobName);
/**
* 查询任务的构建信息
*

View File

@ -1,13 +1,11 @@
package com.qqchen.deploy.backend.deploy.integration.impl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.qqchen.deploy.backend.deploy.entity.ExternalSystem;
import com.qqchen.deploy.backend.deploy.enums.JenkinsBuildStatus;
import com.qqchen.deploy.backend.deploy.integration.IJenkinsServiceIntegration;
import com.qqchen.deploy.backend.deploy.integration.response.JenkinsBuildInfoResponse;
import com.qqchen.deploy.backend.deploy.integration.response.JenkinsBuildResponse;
import com.qqchen.deploy.backend.deploy.integration.response.JenkinsJobResponse;
import com.qqchen.deploy.backend.deploy.integration.response.JenkinsQueueBuildInfoResponse;
@ -28,9 +26,6 @@ import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import org.apache.commons.lang3.StringUtils;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Base64;
import java.util.Collections;
import java.util.List;
@ -345,6 +340,48 @@ public class JenkinsServiceIntegration implements IJenkinsServiceIntegration {
.toList();
}
@Override
public JenkinsJobResponse job(ExternalSystem externalSystem, String jobName) {
try {
// 1. 构建请求URL
String url = UriComponentsBuilder.fromHttpUrl(externalSystem.getUrl())
.path("/job/")
.path(jobName)
.path("/api/json")
.queryParam("tree", "name,url,description,buildable,nextBuildNumber,lastBuild[number,timestamp,result],color,healthReport[score,description]")
.build()
.toUriString();
// 2. 发送请求
HttpEntity<String> entity = new HttpEntity<>(createHeaders(externalSystem));
ResponseEntity<String> response = restTemplate.exchange(
url,
HttpMethod.GET,
entity,
String.class
);
// 3. 解析响应
if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) {
ObjectMapper mapper = new ObjectMapper();
JenkinsJobResponse jobResponse = mapper.readValue(response.getBody(), JenkinsJobResponse.class);
// 4. 清理URL移除基础URL部分
if (jobResponse.getUrl() != null) {
String baseUrl = StringUtils.removeEnd(externalSystem.getUrl(), "/");
jobResponse.setUrl(jobResponse.getUrl().replace(baseUrl, ""));
}
return jobResponse;
}
return null;
} catch (Exception e) {
log.error("Failed to get Jenkins job: jobName={}, error={}", jobName, e.getMessage(), e);
throw new RuntimeException("获取Jenkins任务失败: " + jobName, e);
}
}
/**
* 查询任务的构建信息
*

View File

@ -2,6 +2,8 @@ package com.qqchen.deploy.backend.deploy.repository;
import com.qqchen.deploy.backend.framework.repository.IBaseRepository;
import com.qqchen.deploy.backend.deploy.entity.JenkinsSyncHistory;
import com.qqchen.deploy.backend.deploy.enums.ExternalSystemSyncStatus;
import com.qqchen.deploy.backend.deploy.enums.JenkinsSyncType;
import org.springframework.stereotype.Repository;
/**
@ -10,4 +12,18 @@ import org.springframework.stereotype.Repository;
@Repository
public interface IJenkinsSyncHistoryRepository extends IBaseRepository<JenkinsSyncHistory, Long> {
JenkinsSyncHistory findByNumber(String number);
/**
* 查找最后一次成功同步记录
*
* @param externalSystemId 外部系统ID
* @param syncType 同步类型
* @param status 同步状态
* @return 同步历史记录
*/
JenkinsSyncHistory findTopByExternalSystemIdAndSyncTypeAndStatusOrderByStartTimeDesc(
Long externalSystemId,
JenkinsSyncType syncType,
ExternalSystemSyncStatus status
);
}

View File

@ -11,6 +11,7 @@ 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.query.JenkinsBuildQuery;
import com.qqchen.deploy.backend.deploy.integration.IJenkinsServiceIntegration;
import com.qqchen.deploy.backend.deploy.integration.response.JenkinsBuildResponse;
@ -151,6 +152,7 @@ public class JenkinsBuildServiceImpl extends BaseServiceImpl<JenkinsBuild, Jenki
@Override
@Transactional(rollbackFor = Exception.class)
public Integer syncBuilds(ExternalSystem externalSystem, JenkinsJob job) {
JenkinsJobResponse queryJob = jenkinsServiceIntegration.job(externalSystem, job.getJobName());
List<JenkinsBuildResponse> buildResponses = jenkinsServiceIntegration.listBuilds(externalSystem, job.getJobName());
if (buildResponses.isEmpty()) {
log.info("No builds found for job: {}", job.getJobName());

View File

@ -9,6 +9,11 @@ import com.qqchen.deploy.backend.deploy.service.IJenkinsManagerService;
import com.qqchen.deploy.backend.deploy.service.IJenkinsViewService;
import com.qqchen.deploy.backend.deploy.service.IJenkinsJobService;
import com.qqchen.deploy.backend.deploy.service.IJenkinsBuildService;
import com.qqchen.deploy.backend.deploy.service.IJenkinsSyncHistoryService;
import com.qqchen.deploy.backend.deploy.entity.JenkinsSyncHistory;
import com.qqchen.deploy.backend.deploy.enums.ExternalSystemSyncStatus;
import com.qqchen.deploy.backend.deploy.enums.JenkinsSyncType;
import com.qqchen.deploy.backend.deploy.repository.IJenkinsSyncHistoryRepository;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -31,23 +36,18 @@ public class JenkinsManagerServiceImpl implements IJenkinsManagerService {
@Resource
private IJenkinsBuildService jenkinsBuildService;
@Resource
private IJenkinsSyncHistoryRepository jenkinsSyncHistoryRepository;
@Override
@Transactional(rollbackFor = Exception.class)
public void syncAll(Long externalSystemId) {
// 1. 同步视图
Integer viewCount = jenkinsViewService.syncViews(externalSystemId);
log.info("Synchronized {} views", viewCount);
// 2. 同步任务
Integer jobCount = jenkinsJobService.syncJobs(externalSystemId);
log.info("Synchronized {} jobs", jobCount);
// 3. 同步构建信息
Integer buildCount = jenkinsBuildService.syncAllBuilds(externalSystemId);
log.info("Synchronized {} builds", buildCount);
log.info("Successfully synchronized {} views, {} jobs, and {} builds",
viewCount, jobCount, buildCount);
// 同步视图
syncViews(externalSystemId);
// 同步任务
syncJobs(externalSystemId);
// 同步构建信息
syncBuilds(externalSystemId);
}
@Override
@ -93,6 +93,25 @@ public class JenkinsManagerServiceImpl implements IJenkinsManagerService {
Long totalBuilds = jenkinsBuildService.countByExternalSystemId(externalSystemId);
instanceDTO.setTotalBuilds(totalBuilds.intValue());
// 5. 获取最后同步时间
JenkinsSyncHistory lastViewSync = jenkinsSyncHistoryRepository.findTopByExternalSystemIdAndSyncTypeAndStatusOrderByStartTimeDesc(
externalSystemId, JenkinsSyncType.VIEW, ExternalSystemSyncStatus.SUCCESS);
if (lastViewSync != null) {
instanceDTO.setLastSyncViewsTime(lastViewSync.getEndTime());
}
JenkinsSyncHistory lastJobSync = jenkinsSyncHistoryRepository.findTopByExternalSystemIdAndSyncTypeAndStatusOrderByStartTimeDesc(
externalSystemId, JenkinsSyncType.JOB, ExternalSystemSyncStatus.SUCCESS);
if (lastJobSync != null) {
instanceDTO.setLastSyncJobsTime(lastJobSync.getEndTime());
}
JenkinsSyncHistory lastBuildSync = jenkinsSyncHistoryRepository.findTopByExternalSystemIdAndSyncTypeAndStatusOrderByStartTimeDesc(
externalSystemId, JenkinsSyncType.BUILD, ExternalSystemSyncStatus.SUCCESS);
if (lastBuildSync != null) {
instanceDTO.setLastSyncBuildsTime(lastBuildSync.getEndTime());
}
return instanceDTO;
}
}