Search in sources :

Example 1 with INTERRUPTED

use of org.jboss.pnc.buildagent.api.Status.INTERRUPTED 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;
}
Also used : FileTransfer(org.jboss.pnc.termdbuilddriver.transfer.FileTransfer) ScheduledFuture(java.util.concurrent.ScheduledFuture) BuildDriverException(org.jboss.pnc.spi.builddriver.exception.BuildDriverException) RunningBuild(org.jboss.pnc.spi.builddriver.RunningBuild) LoggerFactory(org.slf4j.LoggerFactory) CompletableFuture(java.util.concurrent.CompletableFuture) ClientFileTransfer(org.jboss.pnc.termdbuilddriver.transfer.ClientFileTransfer) AtomicReference(java.util.concurrent.atomic.AtomicReference) Inject(javax.inject.Inject) SYSTEM_ERROR(org.jboss.pnc.buildagent.api.Status.SYSTEM_ERROR) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) ExecutorService(java.util.concurrent.ExecutorService) INTERRUPTED(org.jboss.pnc.buildagent.api.Status.INTERRUPTED) Logger(org.slf4j.Logger) CompletedBuild(org.jboss.pnc.spi.builddriver.CompletedBuild) FAILED(org.jboss.pnc.buildagent.api.Status.FAILED) BuildStatus(org.jboss.pnc.enums.BuildStatus) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) COMPLETED(org.jboss.pnc.buildagent.api.Status.COMPLETED) RunningEnvironment(org.jboss.pnc.spi.environment.RunningEnvironment) CompletionStage(java.util.concurrent.CompletionStage) Paths(java.nio.file.Paths) MDCExecutors(org.jboss.pnc.common.concurrent.MDCExecutors) DebugData(org.jboss.pnc.spi.builddriver.DebugData) Optional(java.util.Optional) Status(org.jboss.pnc.buildagent.api.Status) TermdBuildDriverModuleConfig(org.jboss.pnc.common.json.moduleconfig.TermdBuildDriverModuleConfig) ApplicationScoped(javax.enterprise.context.ApplicationScoped) SystemConfig(org.jboss.pnc.common.json.moduleconfig.SystemConfig) NamedThreadFactory(org.jboss.pnc.common.concurrent.NamedThreadFactory) BuildDriver(org.jboss.pnc.spi.builddriver.BuildDriver) BuildExecutionSession(org.jboss.pnc.spi.executor.BuildExecutionSession) BuildStatus(org.jboss.pnc.enums.BuildStatus) Status(org.jboss.pnc.buildagent.api.Status) DebugData(org.jboss.pnc.spi.builddriver.DebugData) ClientFileTransfer(org.jboss.pnc.termdbuilddriver.transfer.ClientFileTransfer) FileTransfer(org.jboss.pnc.termdbuilddriver.transfer.FileTransfer) ClientFileTransfer(org.jboss.pnc.termdbuilddriver.transfer.ClientFileTransfer) BuildDriverException(org.jboss.pnc.spi.builddriver.exception.BuildDriverException)

Aggregations

Paths (java.nio.file.Paths)1 Optional (java.util.Optional)1 CompletableFuture (java.util.concurrent.CompletableFuture)1 CompletionStage (java.util.concurrent.CompletionStage)1 ExecutorService (java.util.concurrent.ExecutorService)1 ScheduledExecutorService (java.util.concurrent.ScheduledExecutorService)1 ScheduledFuture (java.util.concurrent.ScheduledFuture)1 TimeUnit (java.util.concurrent.TimeUnit)1 AtomicReference (java.util.concurrent.atomic.AtomicReference)1 Consumer (java.util.function.Consumer)1 ApplicationScoped (javax.enterprise.context.ApplicationScoped)1 Inject (javax.inject.Inject)1 Status (org.jboss.pnc.buildagent.api.Status)1 COMPLETED (org.jboss.pnc.buildagent.api.Status.COMPLETED)1 FAILED (org.jboss.pnc.buildagent.api.Status.FAILED)1 INTERRUPTED (org.jboss.pnc.buildagent.api.Status.INTERRUPTED)1 SYSTEM_ERROR (org.jboss.pnc.buildagent.api.Status.SYSTEM_ERROR)1 MDCExecutors (org.jboss.pnc.common.concurrent.MDCExecutors)1 NamedThreadFactory (org.jboss.pnc.common.concurrent.NamedThreadFactory)1 SystemConfig (org.jboss.pnc.common.json.moduleconfig.SystemConfig)1