Search in sources :

Example 1 with DebugData

use of org.jboss.pnc.spi.builddriver.DebugData in project pnc by project-ncl.

the class DefaultBuildExecutionSession method getBuildResult.

private BuildResult getBuildResult() {
    EnvironmentDriverResult environmentDriverResult = null;
    DebugData debugData = getRunningEnvironment() != null ? getRunningEnvironment().getDebugData() : null;
    if (debugData != null && debugData.isDebugEnabled()) {
        environmentDriverResult = new EnvironmentDriverResult(CompletionStatus.SUCCESS, "", Optional.of(debugData.getSshCredentials()));
    }
    CompletionStatus completionStatus = CompletionStatus.SUCCESS;
    if (executorException == null) {
        if (failedReasonStatus != null) {
            switch(failedReasonStatus) {
                case BUILD_ENV_SETUP_COMPLETE_WITH_ERROR:
                case SYSTEM_ERROR:
                    completionStatus = CompletionStatus.SYSTEM_ERROR;
                    break;
                case COLLECTING_RESULTS_FROM_REPOSITORY_MANAGER_COMPLETED_WITH_ERROR:
                case BUILD_COMPLETED_WITH_ERROR:
                    completionStatus = CompletionStatus.FAILED;
                    break;
                case CANCELLED:
                    completionStatus = CompletionStatus.CANCELLED;
                    break;
                case DONE_WITH_ERRORS:
                    executorException = new ExecutorException("DONE_WITH_ERRORS cannot be set as failed reason.");
                    break;
            }
        }
    }
    ProcessException processException = null;
    if (executorException != null) {
        processException = new ProcessException(executorException);
        completionStatus = CompletionStatus.SYSTEM_ERROR;
    }
    log.debug("Returning result of task {}.", getId());
    return new BuildResult(completionStatus, Optional.ofNullable(processException), "", Optional.ofNullable(buildExecutionConfiguration), Optional.ofNullable(buildDriverResult), Optional.ofNullable(repositoryManagerResult), Optional.ofNullable(environmentDriverResult), Optional.empty());
}
Also used : ProcessException(org.jboss.pnc.spi.coordinator.ProcessException) BuildResult(org.jboss.pnc.spi.BuildResult) ExecutorException(org.jboss.pnc.spi.executor.exceptions.ExecutorException) DebugData(org.jboss.pnc.spi.builddriver.DebugData) EnvironmentDriverResult(org.jboss.pnc.spi.environment.EnvironmentDriverResult) CompletionStatus(org.jboss.pnc.spi.coordinator.CompletionStatus)

Example 2 with DebugData

use of org.jboss.pnc.spi.builddriver.DebugData in project pnc by project-ncl.

the class DefaultBuildExecutor method startBuilding.

@Override
public BuildExecutionSession startBuilding(BuildExecutionConfiguration buildExecutionConfiguration, Consumer<BuildExecutionStatusChangedEvent> onBuildExecutionStatusChangedEvent, String accessToken) throws ExecutorException {
    DefaultBuildExecutionSession buildExecutionSession = new DefaultBuildExecutionSession(buildExecutionConfiguration, onBuildExecutionStatusChangedEvent);
    String executionConfigurationId = buildExecutionConfiguration.getId();
    DefaultBuildExecutionSession existing = runningExecutions.putIfAbsent(executionConfigurationId, buildExecutionSession);
    if (existing != null) {
        throw new AlreadyRunningException("Build execution with id: " + executionConfigurationId + " is already running.");
    }
    buildExecutionSession.setStartTime(new Date());
    userLog.info("Starting build execution...");
    buildExecutionSession.setStatus(BuildExecutionStatus.NEW);
    buildExecutionSession.setAccessToken(accessToken);
    DebugData debugData = new DebugData(buildExecutionConfiguration.isPodKeptOnFailure());
    CompletableFuture.supplyAsync(() -> configureRepository(buildExecutionSession), executor).thenComposeAsync(repositoryConfiguration -> setUpEnvironment(buildExecutionSession, repositoryConfiguration, debugData), executor).thenComposeAsync(nul -> runTheBuild(buildExecutionSession), executor).thenApplyAsync(completedBuild -> {
        buildExecutionSession.setCancelHook(null);
        return optionallyEnableSsh(buildExecutionSession, completedBuild);
    }, executor).thenApplyAsync(completedBuild -> retrieveBuildDriverResults(buildExecutionSession, completedBuild), executor).thenApplyAsync(nul -> retrieveRepositoryManagerResults(buildExecutionSession), executor).handleAsync((nul, e) -> {
        // make sure there are no references left
        buildExecutionSession.setCancelHook(null);
        return completeExecution(buildExecutionSession, e);
    }, executor);
    // TODO re-connect running instances in case of crash
    return buildExecutionSession;
}
Also used : AlreadyRunningException(org.jboss.pnc.spi.executor.exceptions.AlreadyRunningException) RunningBuild(org.jboss.pnc.spi.builddriver.RunningBuild) Date(java.util.Date) LoggerFactory(org.slf4j.LoggerFactory) RepositoryManagerFactory(org.jboss.pnc.executor.servicefactories.RepositoryManagerFactory) StringUtils(org.jboss.pnc.common.util.StringUtils) PreDestroy(javax.annotation.PreDestroy) RepositoryManager(org.jboss.pnc.spi.repositorymanager.RepositoryManager) KeycloakServiceClient(org.jboss.pnc.auth.KeycloakServiceClient) DestroyableEnvironment(org.jboss.pnc.spi.environment.DestroyableEnvironment) BuildExecutionConfiguration(org.jboss.pnc.spi.executor.BuildExecutionConfiguration) URI(java.net.URI) EnvironmentDriver(org.jboss.pnc.spi.environment.EnvironmentDriver) BuildDriverFactory(org.jboss.pnc.executor.servicefactories.BuildDriverFactory) RepositoryManagerException(org.jboss.pnc.spi.repositorymanager.RepositoryManagerException) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) CompletedBuild(org.jboss.pnc.spi.builddriver.CompletedBuild) BuildStatus(org.jboss.pnc.enums.BuildStatus) BuildDriverResult(org.jboss.pnc.spi.builddriver.BuildDriverResult) PncConfigProvider(org.jboss.pnc.common.json.moduleprovider.PncConfigProvider) RunningEnvironment(org.jboss.pnc.spi.environment.RunningEnvironment) RepositorySession(org.jboss.pnc.spi.repositorymanager.model.RepositorySession) BuildExecution(org.jboss.pnc.spi.repositorymanager.BuildExecution) MDCExecutors(org.jboss.pnc.common.concurrent.MDCExecutors) DebugData(org.jboss.pnc.spi.builddriver.DebugData) Optional(java.util.Optional) 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) BuildProcessException(org.jboss.pnc.executor.exceptions.BuildProcessException) CompletableFuture(java.util.concurrent.CompletableFuture) ConcurrentMap(java.util.concurrent.ConcurrentMap) Inject(javax.inject.Inject) ConfigurationParseException(org.jboss.pnc.common.json.ConfigurationParseException) RepositoryType(org.jboss.pnc.enums.RepositoryType) BuildExecutionStatusChangedEvent(org.jboss.pnc.spi.events.BuildExecutionStatusChangedEvent) ExecutorException(org.jboss.pnc.spi.executor.exceptions.ExecutorException) BuildType(org.jboss.pnc.enums.BuildType) ExecutorService(java.util.concurrent.ExecutorService) Logger(org.slf4j.Logger) Configuration(org.jboss.pnc.common.Configuration) ProcessStageUtils(org.jboss.pnc.common.util.ProcessStageUtils) BuildExecutor(org.jboss.pnc.spi.executor.BuildExecutor) Consumer(java.util.function.Consumer) StartedEnvironment(org.jboss.pnc.spi.environment.StartedEnvironment) AlreadyRunningException(org.jboss.pnc.spi.executor.exceptions.AlreadyRunningException) RepositoryManagerResult(org.jboss.pnc.spi.repositorymanager.RepositoryManagerResult) BuildExecutionStatus(org.jboss.pnc.enums.BuildExecutionStatus) EnvironmentDriverFactory(org.jboss.pnc.executor.servicefactories.EnvironmentDriverFactory) BuildExecutionSession(org.jboss.pnc.spi.executor.BuildExecutionSession) DebugData(org.jboss.pnc.spi.builddriver.DebugData) Date(java.util.Date)

Example 3 with DebugData

use of org.jboss.pnc.spi.builddriver.DebugData in project pnc by project-ncl.

the class OpenshiftStartedEnvironment method monitorInitialization.

/**
 * retries is decremented in retryPod in case of pod failing to start
 *
 * @param onComplete
 * @param onError
 * @param retries
 */
private void monitorInitialization(Consumer<RunningEnvironment> onComplete, Consumer<Exception> onError, int retries) {
    cancelHook = () -> onComplete.accept(null);
    CompletableFuture<Void> podFuture = creatingPod.thenComposeAsync(nul -> {
        CancellableCompletableFuture<Void> monitor = pollingMonitor.monitor(this::isPodRunning, pollingMonitorCheckInterval, pollingMonitorTimeout, TimeUnit.SECONDS);
        addFuture(monitor);
        return monitor;
    }, executor);
    CompletableFuture<Void> serviceFuture = creatingService.thenComposeAsync(nul -> {
        CancellableCompletableFuture<Void> monitor = pollingMonitor.monitor(this::isServiceRunning, pollingMonitorCheckInterval, pollingMonitorTimeout, TimeUnit.SECONDS);
        addFuture(monitor);
        return monitor;
    }, executor);
    CompletableFuture<Void> routeFuture;
    if (creatingRoute.isPresent()) {
        routeFuture = creatingRoute.get().thenComposeAsync(nul -> {
            CancellableCompletableFuture<Void> monitor = pollingMonitor.monitor(this::isRouteRunning, pollingMonitorCheckInterval, pollingMonitorTimeout, TimeUnit.SECONDS);
            addFuture(monitor);
            return monitor;
        }, executor);
    } else {
        routeFuture = CompletableFuture.completedFuture(null);
    }
    CompletableFuture<Void> openshiftDefinitionsError = new CompletableFuture<>();
    openshiftDefinitions.exceptionally(t -> {
        openshiftDefinitionsError.completeExceptionally(t);
        return null;
    });
    CancellableCompletableFuture<Void> isBuildAgentUpFuture = pollingMonitor.monitor(this::isInternalServletAvailable, pollingMonitorCheckInterval, pollingMonitorTimeout, TimeUnit.SECONDS);
    addFuture(isBuildAgentUpFuture);
    CompletableFuture<RunningEnvironment> runningEnvironmentFuture = CompletableFutureUtils.allOfOrException(podFuture, serviceFuture, routeFuture).thenComposeAsync(nul -> isBuildAgentUpFuture, executor).thenApplyAsync(nul -> RunningEnvironment.createInstance(pod.getMetadata().getName(), Integer.parseInt(environmentConfiguration.getContainerPort()), route.getSpec().getHost(), getPublicEndpointUrl(), getInternalEndpointUrl(), repositorySession, Paths.get(environmentConfiguration.getWorkingDirectory()), this::destroyEnvironment, debugData), executor);
    CompletableFuture.anyOf(runningEnvironmentFuture, openshiftDefinitionsError).handleAsync((runningEnvironment, throwable) -> {
        if (throwable != null) {
            logger.info("Error while trying to create an OpenShift environment... ", throwable);
            cancelAndClearMonitors();
            // no more retries, execute the onError consumer
            if (retries == 0) {
                logger.info("No more retries left, giving up!");
                onError.accept(new Exception(getPrettierErrorMessageFromThrowable(throwable, true), throwable));
            } else {
                PodFailedStartException podFailedStartExc = null;
                if (throwable instanceof PodFailedStartException) {
                    podFailedStartExc = (PodFailedStartException) throwable;
                } else if (throwable.getCause() instanceof PodFailedStartException) {
                    podFailedStartExc = (PodFailedStartException) throwable.getCause();
                }
                if (podFailedStartExc != null && !Arrays.asList(POD_RETRYABLE_STATUSES).contains(podFailedStartExc.getPodStatus())) {
                    logger.info("The detected pod error status '{}' is not considered among the ones to be retried, giving up!", podFailedStartExc.getPodStatus());
                    // the status is not to be retried
                    onError.accept(new Exception(getPrettierErrorMessageFromThrowable(throwable, false), throwable));
                } else {
                    if (!cancelRequested) {
                        logger.warn("Creating build environment failed with error '{}'! Retrying ({} retries left)...", throwable, retries);
                        retryEnvironment(onComplete, onError, retries);
                    } else {
                        logger.info("Build was cancelled, not retrying environment!");
                    }
                }
            }
        } else {
            logger.info("Environment successfully initialized. Pod [{}]; Service [{}].", pod.getMetadata().getName(), service.getMetadata().getName());
            // openshiftDefinitionsError
            onComplete.accept((RunningEnvironment) runningEnvironment);
        // completes only with error
        }
        gaugeMetric.ifPresent(g -> g.incrementMetric(METRICS_POD_STARTED_SUCCESS_KEY));
        return null;
    }, executor);
}
Also used : HttpURLConnection(java.net.HttpURLConnection) ConcurrentSet(org.jboss.util.collection.ConcurrentSet) Arrays(java.util.Arrays) URL(java.net.URL) LoggerFactory(org.slf4j.LoggerFactory) TimeoutException(java.util.concurrent.TimeoutException) GaugeMetric(org.jboss.pnc.pncmetrics.GaugeMetric) DefaultOpenShiftClient(io.fabric8.openshift.client.DefaultOpenShiftClient) MDCUtils(org.jboss.pnc.common.logging.MDCUtils) StringUtils(org.jboss.pnc.common.util.StringUtils) Route(io.fabric8.openshift.api.model.Route) OpenshiftBuildAgentConfig(org.jboss.pnc.common.json.moduleconfig.OpenshiftBuildAgentConfig) Map(java.util.Map) KubernetesClientException(io.fabric8.kubernetes.client.KubernetesClientException) BuildConfigurationParameterKeys(org.jboss.pnc.api.constants.BuildConfigurationParameterKeys) OpenshiftEnvironmentDriverModuleConfig(org.jboss.pnc.common.json.moduleconfig.OpenshiftEnvironmentDriverModuleConfig) JsonStringEncoder(com.fasterxml.jackson.core.io.JsonStringEncoder) MetricsConfiguration(org.jboss.pnc.pncmetrics.MetricsConfiguration) Instant(java.time.Instant) HasMetadata(io.fabric8.kubernetes.api.model.HasMetadata) Config(io.fabric8.kubernetes.client.Config) RunningEnvironment(org.jboss.pnc.spi.environment.RunningEnvironment) RepositorySession(org.jboss.pnc.spi.repositorymanager.model.RepositorySession) DebugData(org.jboss.pnc.spi.builddriver.DebugData) Optional(java.util.Optional) Pattern(java.util.regex.Pattern) MixedOperation(io.fabric8.kubernetes.client.dsl.MixedOperation) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) RandomUtils(org.jboss.pnc.common.util.RandomUtils) Service(io.fabric8.kubernetes.api.model.Service) ExecutorService(java.util.concurrent.ExecutorService) RandomStringUtils(org.apache.commons.lang.RandomStringUtils) StringPropertyReplacer(org.jboss.util.StringPropertyReplacer) Logger(org.slf4j.Logger) Properties(java.util.Properties) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) Pod(io.fabric8.kubernetes.api.model.Pod) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) PodFailedStartException(org.jboss.pnc.environment.openshift.exceptions.PodFailedStartException) IOException(java.io.IOException) OpenShiftClient(io.fabric8.openshift.client.OpenShiftClient) PollingMonitor(org.jboss.pnc.common.monitor.PollingMonitor) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) CancellableCompletableFuture(org.jboss.pnc.common.monitor.CancellableCompletableFuture) KubernetesResource(io.fabric8.kubernetes.api.model.KubernetesResource) StartedEnvironment(org.jboss.pnc.spi.environment.StartedEnvironment) Paths(java.nio.file.Paths) CompletableFutureUtils(org.jboss.pnc.common.util.CompletableFutureUtils) ConfigBuilder(io.fabric8.kubernetes.client.ConfigBuilder) CompletableFuture(java.util.concurrent.CompletableFuture) CancellableCompletableFuture(org.jboss.pnc.common.monitor.CancellableCompletableFuture) CancellableCompletableFuture(org.jboss.pnc.common.monitor.CancellableCompletableFuture) PodFailedStartException(org.jboss.pnc.environment.openshift.exceptions.PodFailedStartException) RunningEnvironment(org.jboss.pnc.spi.environment.RunningEnvironment) TimeoutException(java.util.concurrent.TimeoutException) KubernetesClientException(io.fabric8.kubernetes.client.KubernetesClientException) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) PodFailedStartException(org.jboss.pnc.environment.openshift.exceptions.PodFailedStartException) IOException(java.io.IOException)

Example 4 with DebugData

use of org.jboss.pnc.spi.builddriver.DebugData in project pnc by project-ncl.

the class OpenshiftEnvironmentDriverRemoteTest method createAndDestroyEnvironment.

@Test
public void createAndDestroyEnvironment() throws EnvironmentDriverException, InterruptedException {
    final Semaphore mutex = new Semaphore(0);
    ObjectWrapper<Throwable> exceptionWrapper = new ObjectWrapper<>();
    String dummyImageId = "abcd1234";
    String dummyRepoUrl = "test.repo.url/repo";
    // Create container
    final StartedEnvironment startedEnv = environmentDriver.startEnvironment(dummyImageId, dummyRepoUrl, SystemImageType.DOCKER_IMAGE, DUMMY_REPOSITORY_CONFIGURATION, new DebugData(false), "put-access-token-here", false, Collections.emptyMap());
    Consumer<RunningEnvironment> onEnvironmentStarted = (runningEnvironment) -> {
        boolean containerDestroyed = false;
        try {
            assertThatContainerIsRunning(runningEnvironment);
            // Destroy container
            destroyEnvironment(runningEnvironment);
            containerDestroyed = true;
            assertThatContainerIsNotRunning(runningEnvironment);
            mutex.release();
        } catch (Throwable e) {
            exceptionWrapper.set(e);
        } finally {
            if (!containerDestroyed) {
                destroyEnvironmentWithReport(runningEnvironment);
            }
        }
        mutex.release();
    };
    Consumer<Exception> onError = (e) -> {
        try {
            logger.info("Trying to destroy environment due to an error:", e);
            startedEnv.destroyEnvironment();
            mutex.release();
        } catch (EnvironmentDriverException e1) {
            logger.error("Environment LEAK! The running environment was not destroyed. ID: " + startedEnv.getId(), e1);
        }
        fail("Failed to init builder. " + e.getMessage());
    };
    startedEnv.monitorInitialization(onEnvironmentStarted, onError);
    boolean completed = mutex.tryAcquire(TEST_EXECUTION_TIMEOUT, TimeUnit.SECONDS);
    Throwable exception = exceptionWrapper.get();
    if (exception != null) {
        logger.error("", exception);
        fail(exception.getMessage());
    }
    assertTrue("timeout reached, test has not complete.", completed);
}
Also used : HttpURLConnection(java.net.HttpURLConnection) URL(java.net.URL) LoggerFactory(org.slf4j.LoggerFactory) SystemImageType(org.jboss.pnc.enums.SystemImageType) RepositoryType(org.jboss.pnc.enums.RepositoryType) Map(java.util.Map) Assert.fail(org.junit.Assert.fail) EnvironmentDriver(org.jboss.pnc.spi.environment.EnvironmentDriver) OpenshiftEnvironmentDriverModuleConfig(org.jboss.pnc.common.json.moduleconfig.OpenshiftEnvironmentDriverModuleConfig) RepositoryManagerException(org.jboss.pnc.spi.repositorymanager.RepositoryManagerException) Semaphore(java.util.concurrent.Semaphore) MethodHandles(java.lang.invoke.MethodHandles) Assert.assertTrue(org.junit.Assert.assertTrue) DebugTest(org.jboss.pnc.test.category.DebugTest) Test(org.junit.Test) IOException(java.io.IOException) Category(org.junit.experimental.categories.Category) PollingMonitor(org.jboss.pnc.common.monitor.PollingMonitor) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) ObjectWrapper(org.jboss.pnc.common.util.ObjectWrapper) RepositoryConnectionInfo(org.jboss.pnc.spi.repositorymanager.model.RepositoryConnectionInfo) Mockito(org.mockito.Mockito) RunningEnvironment(org.jboss.pnc.spi.environment.RunningEnvironment) StartedEnvironment(org.jboss.pnc.spi.environment.StartedEnvironment) RepositorySession(org.jboss.pnc.spi.repositorymanager.model.RepositorySession) DebugData(org.jboss.pnc.spi.builddriver.DebugData) RepositoryManagerResult(org.jboss.pnc.spi.repositorymanager.RepositoryManagerResult) Assert.assertFalse(org.junit.Assert.assertFalse) EnvironmentDriverException(org.jboss.pnc.spi.environment.exception.EnvironmentDriverException) SystemConfig(org.jboss.pnc.common.json.moduleconfig.SystemConfig) Collections(java.util.Collections) DebugData(org.jboss.pnc.spi.builddriver.DebugData) Semaphore(java.util.concurrent.Semaphore) StartedEnvironment(org.jboss.pnc.spi.environment.StartedEnvironment) RunningEnvironment(org.jboss.pnc.spi.environment.RunningEnvironment) RepositoryManagerException(org.jboss.pnc.spi.repositorymanager.RepositoryManagerException) IOException(java.io.IOException) EnvironmentDriverException(org.jboss.pnc.spi.environment.exception.EnvironmentDriverException) EnvironmentDriverException(org.jboss.pnc.spi.environment.exception.EnvironmentDriverException) ObjectWrapper(org.jboss.pnc.common.util.ObjectWrapper) DebugTest(org.jboss.pnc.test.category.DebugTest) Test(org.junit.Test)

Example 5 with DebugData

use of org.jboss.pnc.spi.builddriver.DebugData in project pnc by project-ncl.

the class DestroyableEnvironmentMock method build.

public static DestroyableEnvironment build() {
    RepositorySession repositorySession = new RepositorySessionMock();
    Path workingDir = Paths.get("/root");
    return RunningEnvironment.createInstance("1", 8080, "localhost", "build/agent/url", "internal,build/agent/url", repositorySession, workingDir, () -> {
    }, new DebugData(false));
}
Also used : Path(java.nio.file.Path) DebugData(org.jboss.pnc.spi.builddriver.DebugData) RepositorySessionMock(org.jboss.pnc.mock.repositorymanager.RepositorySessionMock) RepositorySession(org.jboss.pnc.spi.repositorymanager.model.RepositorySession)

Aggregations

DebugData (org.jboss.pnc.spi.builddriver.DebugData)9 Consumer (java.util.function.Consumer)6 RunningEnvironment (org.jboss.pnc.spi.environment.RunningEnvironment)6 LoggerFactory (org.slf4j.LoggerFactory)6 TimeUnit (java.util.concurrent.TimeUnit)5 SystemConfig (org.jboss.pnc.common.json.moduleconfig.SystemConfig)5 Logger (org.slf4j.Logger)5 Paths (java.nio.file.Paths)4 CompletedBuild (org.jboss.pnc.spi.builddriver.CompletedBuild)4 RunningBuild (org.jboss.pnc.spi.builddriver.RunningBuild)4 BuildExecutionSession (org.jboss.pnc.spi.executor.BuildExecutionSession)4 RepositorySession (org.jboss.pnc.spi.repositorymanager.model.RepositorySession)4 Optional (java.util.Optional)3 CompletableFuture (java.util.concurrent.CompletableFuture)3 ExecutorService (java.util.concurrent.ExecutorService)3 TermdBuildDriverModuleConfig (org.jboss.pnc.common.json.moduleconfig.TermdBuildDriverModuleConfig)3 BuildStatus (org.jboss.pnc.enums.BuildStatus)3 BuildDriverException (org.jboss.pnc.spi.builddriver.exception.BuildDriverException)3 StartedEnvironment (org.jboss.pnc.spi.environment.StartedEnvironment)3 BuildExecutionConfiguration (org.jboss.pnc.spi.executor.BuildExecutionConfiguration)3