diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/RepositorySyncHistory.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/RepositorySyncHistory.java index a4fc05de..ff3fa49d 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/RepositorySyncHistory.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/RepositorySyncHistory.java @@ -4,6 +4,8 @@ import com.qqchen.deploy.backend.deploy.enums.ExternalSystemSyncStatus; import com.qqchen.deploy.backend.deploy.enums.RepositorySyncType; import com.qqchen.deploy.backend.framework.domain.Entity; import jakarta.persistence.Column; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; import jakarta.persistence.Table; import lombok.Data; import lombok.EqualsAndHashCode; @@ -32,9 +34,11 @@ public class RepositorySyncHistory extends Entity { private String errorMessage; @Column(nullable = false) + @Enumerated(EnumType.STRING) private ExternalSystemSyncStatus status; @Column(nullable = false) + @Enumerated(EnumType.STRING) private RepositorySyncType syncType; @Column(nullable = false) diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/RepositoryBranchServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/RepositoryBranchServiceImpl.java index 16b8b97b..8204e9c0 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/RepositoryBranchServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/RepositoryBranchServiceImpl.java @@ -4,6 +4,8 @@ import com.qqchen.deploy.backend.deploy.entity.ExternalSystem; import com.qqchen.deploy.backend.deploy.entity.RepositoryProject; import com.qqchen.deploy.backend.deploy.entity.RepositoryBranch; import com.qqchen.deploy.backend.deploy.dto.RepositoryBranchDTO; +import com.qqchen.deploy.backend.deploy.enums.ExternalSystemSyncStatus; +import com.qqchen.deploy.backend.deploy.enums.RepositorySyncType; import com.qqchen.deploy.backend.deploy.integration.IGitServiceIntegration; import com.qqchen.deploy.backend.deploy.integration.response.GitBranchResponse; import com.qqchen.deploy.backend.deploy.query.RepositoryBranchQuery; @@ -14,6 +16,10 @@ import com.qqchen.deploy.backend.deploy.service.IRepositoryBranchService; import com.qqchen.deploy.backend.framework.enums.ResponseCode; import com.qqchen.deploy.backend.framework.exception.BusinessException; import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl; +import com.qqchen.deploy.backend.deploy.dto.RepositorySyncHistoryDTO; +import com.qqchen.deploy.backend.deploy.entity.RepositorySyncHistory; +import com.qqchen.deploy.backend.deploy.service.IRepositorySyncHistoryService; +import com.qqchen.deploy.backend.deploy.repository.IRepositorySyncHistoryRepository; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -44,44 +50,75 @@ public class RepositoryBranchServiceImpl extends BaseServiceImpl new BusinessException(ResponseCode.EXTERNAL_SYSTEM_NOT_FOUND)); - // 2. 获取所有项目 + // 3. 获取所有项目 List projects = repositoryProjectRepository.findByExternalSystemIdAndDeletedFalse(externalSystemId); if (projects.isEmpty()) { log.info("No projects found for external system: {}", externalSystem.getName()); + repositorySyncHistoryService.updateSyncHistory(syncHistory.getId(), ExternalSystemSyncStatus.SUCCESS, null); + return 0; + } + + // 4. 获取上次成功同步的历史记录 + RepositorySyncHistory lastSuccessSync = repositorySyncHistoryRepository + .findTopByExternalSystemIdAndSyncTypeAndStatusOrderByStartTimeDesc( + externalSystemId, RepositorySyncType.BRANCH, ExternalSystemSyncStatus.SUCCESS); + + // 5. 筛选需要同步的项目 + List projectsToSync = projects; + if (lastSuccessSync != null) { + projectsToSync = projects.stream() + .filter(project -> project.getLastActivityAt() == null || + project.getLastActivityAt().isAfter(lastSuccessSync.getEndTime())) + .collect(Collectors.toList()); + } + + if (projectsToSync.isEmpty()) { + log.info("No projects need to be synchronized for external system: {}", externalSystem.getName()); + repositorySyncHistoryService.updateSyncHistory(syncHistory.getId(), ExternalSystemSyncStatus.SUCCESS, null); return 0; } int totalSyncedBranches = 0; - // 3. 同步每个项目的分支 - for (RepositoryProject project : projects) { + // 6. 同步需要更新的项目的分支 + for (RepositoryProject project : projectsToSync) { try { - // 3.1 获取远程分支信息 + // 6.1 获取远程分支信息 List remoteBranches = gitServiceIntegration.branches(externalSystem, project.getProjectId()); if (remoteBranches.isEmpty()) { log.info("No branches found for project: {}", project.getName()); continue; } - // 3.2 获取本地已存在的分支 + // 6.2 获取本地已存在的分支 List existingBranches = repositoryBranchRepository.findByExternalSystemIdAndProjectIdAndDeletedFalse( externalSystemId, project.getId()); Map existingBranchMap = existingBranches.stream() .collect(Collectors.toMap(RepositoryBranch::getName, Function.identity())); - // 3.3 更新或创建分支 + // 6.3 更新或创建分支 List branchesToSave = remoteBranches.stream() .map(remoteBranch -> updateOrCreateBranch(externalSystemId, project.getId(), remoteBranch, existingBranchMap)) .collect(Collectors.toList()); - // 3.4 保存分支 + // 6.4 保存分支 repositoryBranchRepository.saveAll(branchesToSave); totalSyncedBranches += branchesToSave.size(); @@ -92,10 +129,15 @@ public class RepositoryBranchServiceImpl extends BaseServiceImpl