Skip to content

Commit

Permalink
Create build results before sending builds to agents.
Browse files Browse the repository at this point in the history
git-svn-id: https://svn.apache.org/repos/asf/continuum/trunk@1662630 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
batkinson committed Feb 27, 2015
1 parent 249a9d5 commit 893a420
Show file tree
Hide file tree
Showing 16 changed files with 363 additions and 133 deletions.
Expand Up @@ -118,6 +118,9 @@ String getBuildAgentUrl( int projectId, int buildDefinitionId )

List<ProjectRunSummary> getCurrentRuns();

ProjectRunSummary getCurrentRun( int projectId, int buildDefinitionId )
throws ContinuumException;

void removeCurrentRun( int projectId, int buildDefinitionId );

void cancelBuild( int projectId )
Expand Down
Expand Up @@ -49,6 +49,8 @@ void updateBuildResult( BuildResult build )

BuildResult getLatestBuildResultForBuildDefinition( int projectId, int buildDefinitionId );

BuildResult getPreviousBuildResultForBuildDefinition( int projectId, int buildDefinitionId, int buildResultId );

BuildResult getLatestBuildResultInSuccess( int projectId );

BuildResult getPreviousBuildResultInSuccess( int projectId, int buildResultId )
Expand Down
Expand Up @@ -19,6 +19,7 @@
* under the License.
*/

import org.apache.continuum.builder.distributed.manager.DistributedBuildManager;
import org.apache.continuum.builder.utils.ContinuumBuildConstant;
import org.apache.continuum.dao.BuildDefinitionDao;
import org.apache.continuum.dao.BuildResultDao;
Expand Down Expand Up @@ -82,6 +83,9 @@ public class DistributedBuildProjectTaskExecutor
@Requirement
private ConfigurationService configurationService;

@Requirement
private DistributedBuildManager distributedBuildManager;

public void setBuildAgentUrl( String buildAgentUrl )
{
this.buildAgentUrl = buildAgentUrl;
Expand All @@ -108,6 +112,7 @@ public void executeTask( Task task )
prepareBuildTask.getScmRootAddress(), prepareBuildTask.getProjectScmRootId() );

startTime = System.currentTimeMillis();
createInitialResults( prepareBuildTask );
client.buildProjects( buildContext );
endTime = System.currentTimeMillis();
}
Expand All @@ -120,7 +125,7 @@ public void executeTask( Task task )
{
log.error( "Error occurred while building task", e );
endTime = System.currentTimeMillis();
createResult( prepareBuildTask, ContinuumUtils.throwableToString( e ) );
recordErrorResults( prepareBuildTask, ContinuumUtils.throwableToString( e ) );
}
}

Expand Down Expand Up @@ -272,7 +277,42 @@ private List<Map<String, Object>> initializeBuildContext( Map<Integer, Integer>
}
}

private void createResult( PrepareBuildProjectsTask task, String error )
private void createInitialResults( PrepareBuildProjectsTask task )
throws ContinuumStoreException
{
Map<Integer, Integer> map = task.getProjectsBuildDefinitionsMap();
for ( Map.Entry<Integer, Integer> build : map.entrySet() )
{
int projectId = build.getKey();
int buildDefinitionId = build.getValue();

Project project = projectDao.getProject( projectId );
BuildDefinition buildDef = buildDefinitionDao.getBuildDefinition( buildDefinitionId );

BuildResult buildResult = new BuildResult();
buildResult.setError( "Sent build request to build agent " + buildAgentUrl );
buildResult.setBuildUrl( buildAgentUrl );
buildResult.setState( ContinuumProjectState.SENT_TO_AGENT );
buildResult.setBuildDefinition( buildDef );
buildResult.setTrigger( task.getBuildTrigger().getTrigger() );
buildResult.setUsername( task.getBuildTrigger().getTriggeredBy() );
buildResult.setStartTime( startTime );
buildResultDao.addBuildResult( project, buildResult );

try
{
// Install the build result for the current run, so we can safely update
distributedBuildManager.getCurrentRun( projectId, buildDefinitionId ).setBuildResultId(
buildResult.getId() );
}
catch ( ContinuumException e )
{
log.warn( "failed to install initial build result: {} ", e.getMessage() );
}
}
}

private void recordErrorResults( PrepareBuildProjectsTask task, String error )
throws TaskExecutionException
{
try
Expand All @@ -289,17 +329,38 @@ private void createResult( PrepareBuildProjectsTask task, String error )
else
{
Map<Integer, Integer> map = task.getProjectsBuildDefinitionsMap();
for ( Integer projectId : map.keySet() )
for ( Map.Entry<Integer, Integer> build : map.entrySet() )
{
int buildDefinitionId = map.get( projectId );
Project project = projectDao.getProject( projectId );
BuildDefinition buildDef = buildDefinitionDao.getBuildDefinition( buildDefinitionId );
BuildResult latestBuildResult = buildResultDao.getLatestBuildResultForBuildDefinition( projectId,
buildDefinitionId );
if ( latestBuildResult == null ||
( latestBuildResult.getStartTime() >= startTime && latestBuildResult.getEndTime() > 0 &&
latestBuildResult.getEndTime() < endTime ) || latestBuildResult.getStartTime() < startTime )
int projectId = build.getKey();
int buildDefinitionId = build.getValue();

boolean updatedExisting = false;
try
{
// Attempt to update the existing build result
int existingResultId =
distributedBuildManager.getCurrentRun( projectId, buildDefinitionId ).getBuildResultId();
if ( existingResultId > 0 )
{
BuildResult result = buildResultDao.getBuildResult( existingResultId );
result.setError( error );
result.setState( ContinuumProjectState.ERROR );
result.setEndTime( endTime );
buildResultDao.updateBuildResult( result );
updatedExisting = true;
}
}
catch ( ContinuumException e )
{
log.debug( "failed to update existing result: {}", e.getMessage() );
}

if ( !updatedExisting )
{
// No build result existed (likely failed before sending build to agent), add one
Project project = projectDao.getProject( projectId );
BuildDefinition buildDef = buildDefinitionDao.getBuildDefinition( buildDefinitionId );

BuildResult buildResult = new BuildResult();
buildResult.setBuildDefinition( buildDef );
buildResult.setError( error );
Expand All @@ -308,11 +369,9 @@ private void createResult( PrepareBuildProjectsTask task, String error )
buildResult.setUsername( task.getBuildTrigger().getTriggeredBy() );
buildResult.setStartTime( startTime );
buildResult.setEndTime( endTime );

buildResultDao.addBuildResult( project, buildResult );
}
}

}
}
catch ( ContinuumStoreException e )
Expand Down
Expand Up @@ -56,6 +56,9 @@
<requirement>
<role>org.apache.maven.continuum.configuration.ConfigurationService</role>
</requirement>
<requirement>
<role>org.apache.continuum.builder.distributed.manager.DistributedBuildManager</role>
</requirement>
</requirements>
</component>

Expand Down
Expand Up @@ -52,7 +52,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
Expand Down Expand Up @@ -104,16 +103,9 @@ public void updateBuildResult( Map<String, Object> context )
int projectId = ContinuumBuildConstant.getProjectId( context );
int buildDefinitionId = ContinuumBuildConstant.getBuildDefinitionId( context );

log.info( "update build result of project '" + projectId + "'" );

Project project = projectDao.getProjectWithAllDetails( projectId );
BuildDefinition buildDefinition = buildDefinitionDao.getBuildDefinition( buildDefinitionId );

BuildResult oldBuildResult = buildResultDao.getLatestBuildResultForBuildDefinition( projectId,
buildDefinitionId );

int buildNumber;

if ( ContinuumBuildConstant.getBuildState( context ) == ContinuumProjectState.OK )
{
buildNumber = project.getBuildNumber() + 1;
Expand All @@ -123,12 +115,40 @@ public void updateBuildResult( Map<String, Object> context )
buildNumber = project.getBuildNumber();
}

// ----------------------------------------------------------------------
// Make the buildResult
// ----------------------------------------------------------------------
BuildResult buildResult, oldBuildResult;

BuildResult buildResult = distributedBuildUtil.convertMapToBuildResult( context );
log.info( "update build result of project '{}'", projectId );

int existingResultId = 0;
try
{
existingResultId =
distributedBuildManager.getCurrentRun( projectId, buildDefinitionId ).getBuildResultId();
}
catch ( ContinuumException e )
{
log.warn( "failed to find result for remote build {}", e.getMessage() );
}

boolean existingResult = existingResultId > 0;

if ( existingResult )
{
buildResult = buildResultDao.getBuildResult( existingResultId );
distributedBuildUtil.updateBuildResultFromMap( buildResult, context );
oldBuildResult =
buildResultDao.getPreviousBuildResultForBuildDefinition( projectId, buildDefinitionId,
existingResultId );
}
else
{
buildResult = distributedBuildUtil.convertMapToBuildResult( context );
oldBuildResult = buildResultDao.getLatestBuildResultForBuildDefinition( projectId, buildDefinitionId );
}

// Set the complete contents of the build result...

BuildDefinition buildDefinition = buildDefinitionDao.getBuildDefinition( buildDefinitionId );
buildResult.setBuildDefinition( buildDefinition );
buildResult.setBuildNumber( buildNumber );
buildResult.setModifiedDependencies( distributedBuildUtil.getModifiedDependencies( oldBuildResult,
Expand All @@ -145,9 +165,15 @@ else if ( oldBuildResult != null )
buildResult.setLastChangedDate( oldBuildResult.getLastChangedDate() );
}

buildResultDao.addBuildResult( project, buildResult );

buildResult = buildResultDao.getBuildResult( buildResult.getId() );
if ( existingResult )
{
buildResultDao.updateBuildResult( buildResult );
}
else
{
buildResultDao.addBuildResult( project, buildResult );
buildResult = buildResultDao.getBuildResult( buildResult.getId() );
}

project.setOldState( project.getState() );
project.setState( ContinuumBuildConstant.getBuildState( context ) );
Expand All @@ -163,9 +189,10 @@ else if ( oldBuildResult != null )
fileWriter = new FileWriter( buildOutputFile );
String output = ContinuumBuildConstant.getBuildOutput( context );
fileWriter.write( output == null ? "" : output );
} finally
}
finally
{
IOUtils.closeQuietly(fileWriter);
IOUtils.closeQuietly( fileWriter );
}

notifierDispatcher.buildComplete( project, buildDefinition, buildResult );
Expand Down Expand Up @@ -228,6 +255,11 @@ public void startProjectBuild( int projectId )
project.setOldState( project.getState() );
project.setState( ContinuumProjectState.BUILDING );
projectDao.updateProject( project );

// Should actually use current run summary, only the tuple (project, buildDef) is unique
BuildResult result = buildResultDao.getBuildResult( project.getLatestBuildId() );
result.setState( ContinuumProjectState.BUILDING );
buildResultDao.updateBuildResult( result );
}
catch ( ContinuumStoreException e )
{
Expand Down

0 comments on commit 893a420

Please sign in to comment.