55import com .flowci .core .job .domain .Executed ;
66import com .flowci .core .job .domain .ExecutedLocalTask ;
77import com .flowci .core .job .domain .Job ;
8+ import com .flowci .core .job .event .TaskStatusChangeEvent ;
89import com .flowci .core .job .manager .DockerManager ;
910import com .flowci .core .job .manager .YmlManager ;
1011import com .flowci .core .plugin .domain .Plugin ;
@@ -72,8 +73,13 @@ public List<ExecutedLocalTask> list(Job job) {
7273 }
7374
7475 @ Override
75- public void executeAsync (Job job , LocalTask task ) {
76- localTaskExecutor .execute (() -> execute (job , task ));
76+ public void executeAsync (Job job ) {
77+ localTaskExecutor .execute (() -> {
78+ NodeTree tree = ymlManager .getTree (job );
79+ for (LocalTask t : tree .getRoot ().getNotifications ()) {
80+ execute (job , t );
81+ }
82+ });
7783 }
7884
7985 @ Override
@@ -86,9 +92,7 @@ public ExecutedLocalTask execute(Job job, LocalTask task) {
8692 }
8793
8894 ExecutedLocalTask exec = optional .get ();
89- exec .setStartAt (new Date ());
90- exec .setStatus (Executed .Status .RUNNING );
91- executedLocalTaskDao .save (exec );
95+ updateStatusTimeAndSave (exec , Executed .Status .RUNNING , null );
9296
9397 DockerManager .Option option = new DockerManager .Option ();
9498 option .setImage (DefaultImage );
@@ -101,11 +105,7 @@ public ExecutedLocalTask execute(Job job, LocalTask task) {
101105 if (event .hasError ()) {
102106 String message = event .getError ().getMessage ();
103107 log .warn (message );
104-
105- exec .setError (message );
106- exec .setStatus (Executed .Status .EXCEPTION );
107- exec .setFinishAt (new Date ());
108- executedLocalTaskDao .save (exec );
108+ updateStatusTimeAndSave (exec , Executed .Status .EXCEPTION , message );;
109109 return exec ;
110110 }
111111
@@ -121,12 +121,41 @@ public ExecutedLocalTask execute(Job job, LocalTask task) {
121121 });
122122 }
123123
124- log .info ("Start local task {} image = {} for job {}" , task .getPlugin (), option .getImage (), job .getId ());
125- executedLocalTaskDao .save (runDockerTask (option , exec ));
124+ try {
125+ log .info ("Start local task {} image = {} for job {}" , task .getPlugin (), option .getImage (), job .getId ());
126+ runDockerTask (option , exec );
127+ updateStatusTimeAndSave (exec , Executed .Status .SUCCESS , null );
128+ } catch (Exception e ) {
129+ log .warn (e .getMessage ());
130+ updateStatusTimeAndSave (exec , Executed .Status .EXCEPTION , e .getMessage ());
131+ }
132+
126133 return exec ;
127134 }
128135
129- private ExecutedLocalTask runDockerTask (DockerManager .Option option , ExecutedLocalTask r ) {
136+ private void updateStatusTimeAndSave (ExecutedLocalTask t , Executed .Status status , String error ) {
137+ if (t .getStatus () == status ) {
138+ return ;
139+ }
140+
141+ if (Executed .Status .RUNNING == status ) {
142+ t .setStartAt (new Date ());
143+ }
144+
145+ if (Executed .FinishStatus .contains (status )) {
146+ t .setFinishAt (new Date ());
147+ }
148+
149+ t .setStatus (status );
150+ t .setError (error );
151+ executedLocalTaskDao .save (t );
152+
153+ String jobId = t .getJobId ();
154+ List <ExecutedLocalTask > list = executedLocalTaskDao .findAllByJobId (jobId );
155+ eventManager .publish (new TaskStatusChangeEvent (this , t .getJobId (), list ));
156+ }
157+
158+ private void runDockerTask (DockerManager .Option option , ExecutedLocalTask r ) throws InterruptedException , RuntimeException {
130159 try {
131160 String image = option .getImage ();
132161 boolean isSuccess = dockerManager .pullImage (image );
@@ -143,19 +172,10 @@ private ExecutedLocalTask runDockerTask(DockerManager.Option option, ExecutedLoc
143172 }
144173
145174 r .setCode (dockerManager .getContainerExitCode (cid ));
146- } catch (InterruptedException | RuntimeException e ) {
147- log .warn (e .getMessage ());
148- r .setError (e .getMessage ());
149- r .setStatus (Executed .Status .EXCEPTION );
150175 } finally {
151- r .setStatus (Executed .Status .SUCCESS );
152- r .setFinishAt (new Date ());
153-
154176 if (r .hasContainerId ()) {
155177 dockerManager .removeContainer (r .getContainerId ());
156178 }
157179 }
158-
159- return r ;
160180 }
161181}
0 commit comments