use of org.jboss.pnc.buildagent.api.Status in project pnc by project-ncl.
the class TermdBuildDriver method startProjectBuild.
public RunningBuild startProjectBuild(BuildExecutionSession buildExecutionSession, RunningEnvironment runningEnvironment, Consumer<CompletedBuild> onComplete, Consumer<Throwable> onError, Optional<Consumer<Status>> onStatusUpdate) throws BuildDriverException {
logger.info("[{}] Starting build for Build Execution Session {}", runningEnvironment.getId(), buildExecutionSession.getId());
TermdRunningBuild termdRunningBuild = new TermdRunningBuild(runningEnvironment, buildExecutionSession.getBuildExecutionConfiguration(), onComplete, onError);
DebugData debugData = runningEnvironment.getDebugData();
String buildScript = prepareBuildScript(termdRunningBuild, debugData);
if (!termdRunningBuild.isCanceled()) {
String terminalUrl = getBuildAgentUrl(runningEnvironment);
final RemoteInvocation remoteInvocation = new RemoteInvocation(clientFactory, terminalUrl, onStatusUpdate, httpCallbackMode, buildExecutionSession.getId(), buildExecutionSession.getAccessToken());
buildExecutionSession.setBuildStatusUpdateConsumer(remoteInvocation.getClientStatusUpdateConsumer());
FileTransfer fileTransfer = new ClientFileTransfer(remoteInvocation.getBuildAgentClient(), MAX_LOG_SIZE);
fileTransferReadTimeout.ifPresent(fileTransfer::setReadTimeout);
CompletableFuture<Void> prepareBuildFuture = CompletableFuture.supplyAsync(() -> {
logger.debug("Uploading build script to build environment ...");
return uploadTask(termdRunningBuild.getRunningEnvironment(), buildScript, fileTransfer);
}, executor).thenApplyAsync(scriptPath -> {
logger.debug("Setting the script path ...");
remoteInvocation.setScriptPath(scriptPath);
return null;
}, executor).thenRunAsync(() -> {
logger.debug("Invoking remote script ...");
invokeRemoteScript(remoteInvocation);
}, executor);
CompletableFuture<RemoteInvocationCompletion> buildLivenessFuture = prepareBuildFuture.thenComposeAsync(nul -> {
logger.debug("Starting liveness monitor ...");
return monitorBuildLiveness(remoteInvocation);
}, executor);
CompletableFuture<RemoteInvocationCompletion> buildCompletionFuture = prepareBuildFuture.thenComposeAsync(nul -> {
logger.debug("Waiting fo remote script to complete...");
return remoteInvocation.getCompletionNotifier();
}, executor);
CompletableFuture<RemoteInvocationCompletion> optionallyEnableDebug = buildCompletionFuture.thenApplyAsync(remoteInvocationCompletion -> {
Status status = remoteInvocationCompletion.getStatus();
if (status.isFinal()) {
logger.debug("Script completionNotifier completed with status {}.", status);
if ((status == FAILED || status == SYSTEM_ERROR) && debugData.isEnableDebugOnFailure()) {
debugData.setDebugEnabled(true);
remoteInvocation.enableSsh();
}
}
return remoteInvocationCompletion;
}, executor);
CompletableFuture<Object> buildFuture = CompletableFuture.anyOf(buildLivenessFuture, optionallyEnableDebug);
buildFuture.handle((result, exception) -> {
RemoteInvocationCompletion completion;
if (result != null) {
// both of combined futures return the same type
RemoteInvocationCompletion remoteInvocationCompletion = (RemoteInvocationCompletion) result;
if (remoteInvocationCompletion.getException() != null) {
logger.warn("Completing build execution.", remoteInvocationCompletion.getException());
} else {
logger.debug("Completing build execution. Status: {};", remoteInvocationCompletion.getStatus());
}
completion = remoteInvocationCompletion;
} else if (exception != null && exception.getCause() instanceof java.util.concurrent.CancellationException) {
// canceled in non build operation (completableFuture cancel), non graceful completion
logger.warn("Completing build execution. Cancelled;");
completion = new RemoteInvocationCompletion(INTERRUPTED, Optional.empty());
} else {
logger.warn("Completing build execution. System error.", exception);
completion = new RemoteInvocationCompletion(new BuildDriverException("System error.", exception));
}
termdRunningBuild.setCancelHook(null);
remoteInvocation.close();
complete(termdRunningBuild, completion, fileTransfer);
return null;
});
termdRunningBuild.setCancelHook(() -> {
// try to cancel remote execution
remoteInvocation.cancel();
ScheduledFuture<?> forceCancel_ = scheduledExecutorService.schedule(() -> {
logger.debug("Force cancelling build ...");
prepareBuildFuture.cancel(true);
}, internalCancelTimeoutMillis, TimeUnit.MILLISECONDS);
remoteInvocation.addPreClose(() -> forceCancel_.cancel(false));
});
} else {
logger.debug("Skipping script uploading (cancel flag) ...");
}
return termdRunningBuild;
}
Aggregations