in rest-api/src/jetbrains/buildServer/server/rest/request/BuildRequest.java [1077:1147]
private LinkedHashMap<Long, RuntimeException> cancelBuilds(@NotNull final List<BuildPromotion> builds,
@NotNull final BuildCancelRequest cancelRequest,
@Nullable final SUser currentUser) {
LinkedHashMap<Long, RuntimeException> errors = new LinkedHashMap<>();
if (cancelRequest.readdIntoQueue) {
if (currentUser == null) {
throw new BadRequestException("Cannot re-add build into queue when no current user is present. Please make sure the operation is performed under a regular user.");
}
}
final jetbrains.buildServer.serverSide.BuildQueueEx buildQueue = (BuildQueueEx)myBeanContext.getSingletonService(BuildQueue.class);
Set<String> queuedBuildIds = builds.stream().map(BuildPromotion::getQueuedBuild).filter(Objects::nonNull).map(QueuedBuild::getItemId).collect(Collectors.toSet());
if (!queuedBuildIds.isEmpty()) {
buildQueue.removeItems(queuedBuildIds, currentUser, cancelRequest.comment);
}
List<SRunningBuild> stoppedBuilds = new ArrayList<>();
RunningBuildsManager runningBuildsManager = myBeanContext.getSingletonService(RunningBuildsManager.class);
for (BuildPromotion build : builds) {
final SBuild sBuild = build.getAssociatedBuild();
if (sBuild == null) {
if (build.getQueuedBuild() != null) {
if (currentUser != null && !AuthUtil.hasPermissionToStopBuild(currentUser, build)) {
errors.put(build.getId(), new AuthorizationFailedException("You do not have enough permissions to cancel the build"));
} else {
errors.putIfAbsent(build.getId(), new OperationException("Failed to cancel queued build"));
}
}
continue;
}
if (sBuild.isFinished()) {
if (sBuild.getCanceledInfo() == null) {
errors.put(build.getId(), new BadRequestException("Cannot cancel finished build"));
}
continue;
}
SRunningBuild runningBuild = runningBuildsManager.findRunningBuildById(sBuild.getBuildId());
if (runningBuild == null) {
errors.put(build.getId(), new BadRequestException("Cannot cancel not running build"));
continue;
}
try {
if (cancelRequest.readdIntoQueue) {
stoppedBuilds.add(runningBuild);
}
final String comment = cancelRequest.comment == null ? "Canceled via REST API" : cancelRequest.comment;
if (!cancelRequest.readdIntoQueue && currentUser == null) {
((RunningBuildEx)runningBuild).stop(RunningBuildState.INTERRUPTED_BY_USER, null, comment, cancelRequest.readdIntoQueue);
} else {
runningBuild.stop(currentUser, comment);
}
} catch (RuntimeException e) {
errors.putIfAbsent(build.getId(), e);
}
}
if (cancelRequest.readdIntoQueue && !stoppedBuilds.isEmpty()) {
stoppedBuilds.forEach(build -> {
try {
restoreInQueue(build, currentUser);
} catch (RuntimeException e) {
errors.putIfAbsent(build.getBuildPromotion().getId(), e);
}
});
}
return errors;
}