增加构建通知

This commit is contained in:
dengqichen 2025-11-28 12:25:48 +08:00
parent 46fb8fb5de
commit c88426c7ad

View File

@ -587,6 +587,7 @@ public class JenkinsBuildServiceImpl extends BaseServiceImpl<JenkinsBuild, Jenki
/** /**
* 处理单个构建的通知 * 处理单个构建的通知
* <p>参考 longi-deployment 的实现每次都从 Jenkins API 实时获取最新状态
*/ */
private void processBuildNotification(TeamEnvironmentNotificationConfig config, NotificationChannel channel, JenkinsJob job, JenkinsBuild build, ExternalSystem externalSystem, Application application, Environment environment) { private void processBuildNotification(TeamEnvironmentNotificationConfig config, NotificationChannel channel, JenkinsJob job, JenkinsBuild build, ExternalSystem externalSystem, Application application, Environment environment) {
@ -595,7 +596,13 @@ public class JenkinsBuildServiceImpl extends BaseServiceImpl<JenkinsBuild, Jenki
JenkinsBuildNotification record = jenkinsBuildNotificationRepository.findByBuildIdAndTeamIdAndEnvironmentId(build.getId(), config.getTeamId(), config.getEnvironmentId()) JenkinsBuildNotification record = jenkinsBuildNotificationRepository.findByBuildIdAndTeamIdAndEnvironmentId(build.getId(), config.getTeamId(), config.getEnvironmentId())
.orElse(null); .orElse(null);
// 2. 新构建只处理6分钟内的新构建 // 2. Jenkins API 实时获取该构建的最新状态
JenkinsBuildResponse latestBuildInfo = fetchLatestBuildInfo(externalSystem, job, build.getBuildNumber());
String latestStatus = (latestBuildInfo != null && latestBuildInfo.getResult() != null)
? latestBuildInfo.getResult()
: "BUILDING";
// 3. 新构建只处理6分钟内的新构建
if (record == null) { if (record == null) {
long minutesAgo = java.time.temporal.ChronoUnit.MINUTES.between( long minutesAgo = java.time.temporal.ChronoUnit.MINUTES.between(
build.getStarttime(), build.getStarttime(),
@ -618,15 +625,19 @@ public class JenkinsBuildServiceImpl extends BaseServiceImpl<JenkinsBuild, Jenki
return; return;
} }
// 3. 已有记录检查结束通知 // 4. 已有记录检查结束通知
if (!record.getBuildEndNotice()) { if (!record.getBuildEndNotice()) {
if (isBuildFinished(build)) { // 使用实时获取的状态判断是否已完成
// 构建已完成发送结束通知 if (isStatusFinished(latestStatus)) {
String status = build.getBuildStatus(); // 更新数据库中的构建状态
if (latestBuildInfo != null) {
updateBuildFromResponse(build, latestBuildInfo);
jenkinsBuildRepository.save(build);
}
// 通知成功失败取消 // 发送结束通知
if ("SUCCESS".equals(status) || "FAILURE".equals(status) || "ABORTED".equals(status)) { if ("SUCCESS".equals(latestStatus) || "FAILURE".equals(latestStatus) || "ABORTED".equals(latestStatus)) {
sendNotification(config, channel, job, build, status, externalSystem, application, environment); sendNotification(config, channel, job, build, latestStatus, externalSystem, application, environment);
} }
record.setBuildEndNotice(true); record.setBuildEndNotice(true);
@ -654,6 +665,29 @@ public class JenkinsBuildServiceImpl extends BaseServiceImpl<JenkinsBuild, Jenki
} }
} }
/**
* Jenkins API 实时获取指定构建的最新信息
*/
private JenkinsBuildResponse fetchLatestBuildInfo(ExternalSystem externalSystem, JenkinsJob job, Integer buildNumber) {
try {
List<JenkinsBuildResponse> builds = jenkinsServiceIntegration.listBuilds(externalSystem, job.getJobName());
return builds.stream()
.filter(b -> b.getNumber().equals(buildNumber))
.findFirst()
.orElse(null);
} catch (Exception e) {
log.warn("从Jenkins获取构建信息失败: job={}, buildNumber={}, error={}", job.getJobName(), buildNumber, e.getMessage());
return null;
}
}
/**
* 判断状态是否为已完成
*/
private boolean isStatusFinished(String status) {
return "SUCCESS".equals(status) || "FAILURE".equals(status) || "ABORTED".equals(status);
}
/** /**
* 判断构建是否已结束 * 判断构建是否已结束
*/ */