增加构建通知

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) {
@ -595,7 +596,13 @@ public class JenkinsBuildServiceImpl extends BaseServiceImpl<JenkinsBuild, Jenki
JenkinsBuildNotification record = jenkinsBuildNotificationRepository.findByBuildIdAndTeamIdAndEnvironmentId(build.getId(), config.getTeamId(), config.getEnvironmentId())
.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) {
long minutesAgo = java.time.temporal.ChronoUnit.MINUTES.between(
build.getStarttime(),
@ -618,15 +625,19 @@ public class JenkinsBuildServiceImpl extends BaseServiceImpl<JenkinsBuild, Jenki
return;
}
// 3. 已有记录检查结束通知
// 4. 已有记录检查结束通知
if (!record.getBuildEndNotice()) {
if (isBuildFinished(build)) {
// 构建已完成发送结束通知
String status = build.getBuildStatus();
// 使用实时获取的状态判断是否已完成
if (isStatusFinished(latestStatus)) {
// 更新数据库中的构建状态
if (latestBuildInfo != null) {
updateBuildFromResponse(build, latestBuildInfo);
jenkinsBuildRepository.save(build);
}
// 通知成功失败取消
if ("SUCCESS".equals(status) || "FAILURE".equals(status) || "ABORTED".equals(status)) {
sendNotification(config, channel, job, build, status, externalSystem, application, environment);
// 发送结束通知
if ("SUCCESS".equals(latestStatus) || "FAILURE".equals(latestStatus) || "ABORTED".equals(latestStatus)) {
sendNotification(config, channel, job, build, latestStatus, externalSystem, application, environment);
}
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);
}
/**
* 判断构建是否已结束
*/