	public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {
		Map<AbstractProject, ReactorSubProjectConfig> projects = getSubJobs();
		List<Future<Build>> futuresList = new ArrayList<Future<Build>>();
		for (AbstractProject project : projects.keySet()) {
			listener.getLogger().printf("Starting build job %s.\n", HyperlinkNote.encodeTo('/' + project.getUrl(), project.getFullName()));
			ReactorSubProjectConfig projectConfig = projects.get(project);
			List<Action> actions = new ArrayList<Action>();
			prepareActions(build, project, projectConfig, listener, actions);
			Future future = project.scheduleBuild2(project.getQuietPeriod(), new UpstreamCause((Run) build), actions.toArray(new Action[0]));
			if (future != null) {
				futuresList.add(future);
			}
		}
		boolean failed = false;
		for (Future future : futuresList) {
			if (failed) {
				future.cancel(true);
			}
			try {
				Build jobBuild = (Build) future.get();
				Result result = jobBuild.getResult();
				listener.getLogger().printf("Job '%s' finished: %s.\n",
						HyperlinkNote.encodeTo('/' + jobBuild.getProject().getUrl(), jobBuild.getProject().getFullName()), result);
				if (!continuationCondition.isContinue(jobBuild)) {
					failed = true;
				}
			} catch (ExecutionException e) {
				failed = true;
			}
		}
		return !failed;
	}

	public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {
		Map<AbstractProject, ReactorSubProjectConfig> projects = getSubJobs();
		List<Future<Build>> futuresList = new ArrayList<Future<Build>>();
		for (AbstractProject project : projects.keySet()) {
			listener.getLogger().printf("Starting build job %s.\n", HyperlinkNote.encodeTo('/' + project.getUrl(), project.getFullName()));
			ReactorSubProjectConfig projectConfig = projects.get(project);
			List<Action> actions = new ArrayList<Action>();
			prepareActions(build, project, projectConfig, listener, actions);
			Future future = project.scheduleBuild2(project.getQuietPeriod(), new UpstreamCause((Run) build), actions.toArray(new Action[0]));
			if (future != null) {
				futuresList.add(future);
			}
		}
		boolean failed = false;
		for (Future future : futuresList) {
			if (failed) {
				future.cancel(true);
			}
			try {
				Build jobBuild = (Build) future.get();
				Result result = jobBuild.getResult();
				listener.getLogger().printf("Build   "+ HyperlinkNote.encodeTo("/" + jobBuild.getUrl()+"/",  String.valueOf(jobBuild.getNumber())),"Console :"+
						HyperlinkNote.encodeTo('/' + jobBuild.getUrl()+"/console",  result.toString()));
				if (!continuationCondition.isContinue(jobBuild)) {
					failed = true;
				}
			} catch (ExecutionException e) {
				failed = true;
			}
		}
		return !failed;
	}
