1 package org.apache.maven.continuum.core.action;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.continuum.dao.BuildResultDao;
23 import org.apache.continuum.dao.ProjectDao;
24 import org.apache.continuum.utils.ContinuumUtils;
25 import org.apache.continuum.utils.build.BuildTrigger;
26 import org.apache.maven.continuum.configuration.ConfigurationService;
27 import org.apache.maven.continuum.execution.ContinuumBuildCancelledException;
28 import org.apache.maven.continuum.execution.ContinuumBuildExecutionResult;
29 import org.apache.maven.continuum.execution.ContinuumBuildExecutor;
30 import org.apache.maven.continuum.execution.manager.BuildExecutorManager;
31 import org.apache.maven.continuum.model.project.BuildDefinition;
32 import org.apache.maven.continuum.model.project.BuildResult;
33 import org.apache.maven.continuum.model.project.Project;
34 import org.apache.maven.continuum.model.project.ProjectDependency;
35 import org.apache.maven.continuum.model.scm.ScmResult;
36 import org.apache.maven.continuum.notification.ContinuumNotificationDispatcher;
37 import org.apache.maven.continuum.project.ContinuumProjectState;
38
39 import java.io.File;
40 import java.util.Date;
41 import java.util.List;
42 import java.util.Map;
43
44
45
46
47
48
49
50 public class ExecuteBuilderContinuumAction
51 extends AbstractContinuumAction
52 {
53 private static final String KEY_CANCELLED = "cancelled";
54
55
56
57
58 private ConfigurationService configurationService;
59
60
61
62
63 private BuildExecutorManager buildExecutorManager;
64
65
66
67
68 private BuildResultDao buildResultDao;
69
70
71
72
73 private ProjectDao projectDao;
74
75
76
77
78 private ContinuumNotificationDispatcher notifier;
79
80 public void execute( Map context )
81 throws Exception
82 {
83
84
85
86
87 Project project = projectDao.getProject( getProject( context ).getId() );
88
89 BuildDefinition buildDefinition = getBuildDefinition( context );
90
91 BuildTrigger buildTrigger = getBuildTrigger( context );
92
93 ScmResult scmResult = getScmResult( context );
94
95 List<ProjectDependency> updatedDependencies = getUpdatedDependencies( context );
96
97 ContinuumBuildExecutor buildExecutor = buildExecutorManager.getBuildExecutor( project.getExecutorId() );
98
99
100
101
102
103 BuildResult buildResult = new BuildResult();
104
105 buildResult.setStartTime( new Date().getTime() );
106
107 buildResult.setState( ContinuumProjectState.BUILDING );
108
109 buildResult.setTrigger( buildTrigger.getTrigger() );
110
111 buildResult.setUsername( buildTrigger.getTriggeredBy() );
112
113 buildResult.setScmResult( scmResult );
114
115 buildResult.setModifiedDependencies( updatedDependencies );
116
117 buildResult.setBuildDefinition( getBuildDefinition( context ) );
118
119 buildResultDao.addBuildResult( project, buildResult );
120
121 AbstractContinuumAction.setBuildId( context, Integer.toString( buildResult.getId() ) );
122
123 setCancelled( context, false );
124
125 buildResult = buildResultDao.getBuildResult( buildResult.getId() );
126
127 String projectScmRootUrl = getProjectScmRootUrl( context, project.getScmUrl() );
128 List<Project> projectsWithCommonScmRoot = getListOfProjectsInGroupWithCommonScmRoot( context );
129
130 try
131 {
132 notifier.runningGoals( project, buildDefinition, buildResult );
133
134 File buildOutputFile = configurationService.getBuildOutputFile( buildResult.getId(), project.getId() );
135
136 ContinuumBuildExecutionResult result = buildExecutor.build( project, buildDefinition, buildOutputFile,
137 projectsWithCommonScmRoot, projectScmRootUrl );
138
139 buildResult.setState( result.getExitCode() == 0 ? ContinuumProjectState.OK : ContinuumProjectState.FAILED );
140
141 buildResult.setExitCode( result.getExitCode() );
142 }
143 catch ( ContinuumBuildCancelledException e )
144 {
145 getLogger().info( "Cancelled build" );
146
147 buildResult.setState( ContinuumProjectState.CANCELLED );
148
149 setCancelled( context, true );
150 }
151 catch ( Throwable e )
152 {
153 getLogger().error( "Error running buildResult", e );
154
155 buildResult.setState( ContinuumProjectState.ERROR );
156
157 buildResult.setError( ContinuumUtils.throwableToString( e ) );
158 }
159 finally
160 {
161 project = projectDao.getProject( project.getId() );
162
163 if ( buildResult.getState() == ContinuumProjectState.CANCELLED )
164 {
165 project.setState( project.getOldState() );
166
167 project.setOldState( 0 );
168
169 int buildResultId = getOldBuildId( context );
170
171 project.setLatestBuildId( buildResultId );
172
173 buildResultDao.removeBuildResult( buildResult );
174 }
175 else
176 {
177 buildResult.setEndTime( new Date().getTime() );
178
179 if ( buildResult.getState() == ContinuumProjectState.OK )
180 {
181 project.setBuildNumber( project.getBuildNumber() + 1 );
182 }
183
184 project.setLatestBuildId( buildResult.getId() );
185
186 buildResult.setBuildNumber( project.getBuildNumber() );
187
188 if ( buildResult.getState() != ContinuumProjectState.OK &&
189 buildResult.getState() != ContinuumProjectState.FAILED &&
190 buildResult.getState() != ContinuumProjectState.ERROR )
191 {
192 buildResult.setState( ContinuumProjectState.ERROR );
193 }
194
195 project.setState( buildResult.getState() );
196
197
198
199
200
201 buildResultDao.updateBuildResult( buildResult );
202
203 buildResult = buildResultDao.getBuildResult( buildResult.getId() );
204
205 notifier.goalsCompleted( project, buildDefinition, buildResult );
206 }
207
208 AbstractContinuumAction.setProject( context, project );
209
210 projectDao.updateProject( project );
211
212 projectScmRootUrl = getProjectScmRootUrl( context, project.getScmUrl() );
213 projectsWithCommonScmRoot = getListOfProjectsInGroupWithCommonScmRoot( context );
214
215
216
217
218
219 buildExecutor.backupTestFiles( project, buildResult.getId(), projectScmRootUrl, projectsWithCommonScmRoot );
220 }
221 }
222
223 public static boolean isCancelled( Map<String, Object> context )
224 {
225 return getBoolean( context, KEY_CANCELLED );
226 }
227
228 private static void setCancelled( Map<String, Object> context, boolean cancelled )
229 {
230 context.put( KEY_CANCELLED, cancelled );
231 }
232 }