private List<InputBuildId> readListOfBuildIds() { List<InputBuildId> result = new ArrayList<>(); File inputFile = new File(this.config.getInputPath()); try { BufferedReader reader = new BufferedReader(new FileReader(inputFile)); while (reader.ready()) { String line = reader.readLine().trim(); if (!line.isEmpty()) { String[] buildIds = line.split(Utils.COMMA+""); if (buildIds.length > 0) { long buggyBuildId = Long.parseLong(buildIds[0]); if (this.config.getLauncherMode() == LauncherMode.BEARS) { if (buildIds.length > 1) { long patchedBuildId = Long.parseLong(buildIds[1]); result.add(new InputBuildId(buggyBuildId, patchedBuildId)); } else { LOGGER.error("The build "+buggyBuildId+" will not be processed because there is no next build for it in the input file."); } } else { result.add(new InputBuildId(buggyBuildId)); } } } } reader.close(); } catch (IOException e) { throw new RuntimeException("Error while reading build ids from file: "+inputFile.getPath(),e); } return result; }
/** * For submitting build, we first call {@link #prepareBeforeSubmitBuild(long)}, then we create the container and add it to the list of submitted. */ public RunnablePipelineContainer submitBuild(String imageId, InputBuildId inputBuildId) { TreatedBuildTracking treatedBuildTracking = this.prepareBeforeSubmitBuild(inputBuildId.getBuggyBuildId()); RunnablePipelineContainer runnablePipelineContainer = new RunnablePipelineContainer(this, imageId, inputBuildId, this.dockerOutputDir, treatedBuildTracking); this.submittedRunnablePipelineContainers.add(runnablePipelineContainer); return runnablePipelineContainer; }
this.treatedBuildTracking = treatedBuildTracking; this.containerName = "repairnator-pipeline_"+ Utils.formatFilenameDate(new Date())+"_"+this.inputBuildId.getBuggyBuildId()+"_"+this.repairnatorConfig.getRunId(); String output = (this.repairnatorConfig.isCreateOutputDir()) ? "/var/log/"+this.repairnatorConfig.getRunId() : "/var/log"; this.envValues.add("BUILD_ID="+this.inputBuildId.getBuggyBuildId()); if (this.repairnatorConfig.getLauncherMode() == LauncherMode.BEARS) { this.envValues.add("NEXT_BUILD_ID="+this.inputBuildId.getPatchedBuildId()); if (this.repairnatorConfig.isDebug()) { this.envValues.add("LOG_LEVEL=DEBUG");
@Override public void removeSubmittedRunnablePipelineContainer(RunnablePipelineContainer pipelineContainer) { LOGGER.info("Build (id: "+pipelineContainer.getInputBuildId().getBuggyBuildId()+") has finished."); super.removeSubmittedRunnablePipelineContainer(pipelineContainer); if (!this.waitingBuilds.isEmpty()) { Build build = this.waitingBuilds.pollFirst(); this.submitBuild(build); } } }
public void submitBuild(Build build) { if (this.limitDateNextRetrieveDockerImage.before(new Date())) { this.refreshDockerImage(); } if (getRunning() < this.nbThreads) { LOGGER.info("Build (id: "+build.getId()+") immediately submitted for running."); this.executorService.submit(this.submitBuild(this.dockerImageId, new InputBuildId(build.getId()))); } else { LOGGER.info("All threads currently running (Limit: "+this.nbThreads+"). Add build (id: "+build.getId()+") to wait list"); if (this.waitingBuilds.size() == this.nbThreads) { Build b = this.waitingBuilds.removeLast(); LOGGER.debug("Remove oldest build (id: "+b.getId()+")"); } this.waitingBuilds.push(build); } }
DockerClient docker = this.poolManager.getDockerClient(); try { LOGGER.info("Start to build and run container for build id "+this.inputBuildId.getBuggyBuildId()); LOGGER.info("At most this docker run will be killed at: "+this.limitDateBeforeKilling); LOGGER.info("(BUILD ID " + this.inputBuildId.getBuggyBuildId() + ") Create the container: "+this.containerName); ContainerCreation container = docker.createContainer(containerConfig); LOGGER.info("(BUILD ID " + this.inputBuildId.getBuggyBuildId() + ") Start the container: "+this.containerName); docker.startContainer(container.id()); LOGGER.info("(BUILD ID " + this.inputBuildId.getBuggyBuildId() + ") The container has finished with status code: "+exitStatus.statusCode()); LOGGER.info("(BUILD ID " + this.inputBuildId.getBuggyBuildId() + ") Container will be removed."); docker.removeContainer(this.containerId); this.removeVolumes(docker); LOGGER.error("Error while running the container for build id "+this.inputBuildId.getBuggyBuildId(), e); killDockerContainer(docker, false); } catch (DockerException e) { LOGGER.error("Error while creating or running the container for build id "+this.inputBuildId.getBuggyBuildId(), e); serialize("ERROR");