View Javadoc

1   package org.apache.maven.continuum.core.action;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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   * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
46   * @version $Id: ExecuteBuilderContinuumAction.java 1372260 2012-08-13 04:29:09Z brett $
47   * @plexus.component role="org.codehaus.plexus.action.Action"
48   * role-hint="execute-builder"
49   */
50  public class ExecuteBuilderContinuumAction
51      extends AbstractContinuumAction
52  {
53      private static final String KEY_CANCELLED = "cancelled";
54  
55      /**
56       * @plexus.requirement
57       */
58      private ConfigurationService configurationService;
59  
60      /**
61       * @plexus.requirement
62       */
63      private BuildExecutorManager buildExecutorManager;
64  
65      /**
66       * @plexus.requirement
67       */
68      private BuildResultDao buildResultDao;
69  
70      /**
71       * @plexus.requirement
72       */
73      private ProjectDao projectDao;
74  
75      /**
76       * @plexus.requirement
77       */
78      private ContinuumNotificationDispatcher notifier;
79  
80      public void execute( Map context )
81          throws Exception
82      {
83          // ----------------------------------------------------------------------
84          // Get parameters from the context
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         // Make the buildResult
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                 // Copy over the buildResult result
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             // Backup test result files
217             // ----------------------------------------------------------------------
218             //TODO: Move as a plugin
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 }