增加构建通知
This commit is contained in:
parent
46fb8fb5de
commit
c88426c7ad
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断构建是否已结束
|
||||
*/
|
||||
|
||||
Loading…
Reference in New Issue
Block a user