@@ -115,59 +115,71 @@ func New(runnerConfig *Config) (Runner, error) {
115115func (runner * runnerImpl ) NewPlanExecutor (plan * model.Plan ) common.Executor {
116116 maxJobNameLen := 0
117117
118- pipeline := make ([]common.Executor , 0 )
119- for s , stage := range plan .Stages {
120- stageExecutor := make ([]common.Executor , 0 )
121- for r , run := range stage .Runs {
122- job := run .Job ()
123- matrixes := job .GetMatrixes ()
124- maxParallel := 4
125- if job .Strategy != nil {
126- maxParallel = job .Strategy .MaxParallel
127- }
128-
129- if len (matrixes ) < maxParallel {
130- maxParallel = len (matrixes )
131- }
132-
133- b := 0
134- for i , matrix := range matrixes {
135- rc := runner .newRunContext (run , matrix )
136- rc .JobName = rc .Name
137- if len (matrixes ) > 1 {
138- rc .Name = fmt .Sprintf ("%s-%d" , rc .Name , i + 1 )
118+ stagePipeline := make ([]common.Executor , 0 )
119+ for i := range plan .Stages {
120+ s := i
121+ stage := plan .Stages [i ]
122+ stagePipeline = append (stagePipeline , func (ctx context.Context ) error {
123+ pipeline := make ([]common.Executor , 0 )
124+ stageExecutor := make ([]common.Executor , 0 )
125+ for r , run := range stage .Runs {
126+ job := run .Job ()
127+ if job .Strategy != nil {
128+ strategyRc := runner .newRunContext (run , nil )
129+ if err := strategyRc .NewExpressionEvaluator ().EvaluateYamlNode (& job .Strategy .RawMatrix ); err != nil {
130+ log .Errorf ("Error while evaluating matrix: %v" , err )
131+ }
132+ }
133+ matrixes := job .GetMatrixes ()
134+ maxParallel := 4
135+ if job .Strategy != nil {
136+ maxParallel = job .Strategy .MaxParallel
139137 }
140- if len (rc .String ()) > maxJobNameLen {
141- maxJobNameLen = len (rc .String ())
138+
139+ if len (matrixes ) < maxParallel {
140+ maxParallel = len (matrixes )
142141 }
143- stageExecutor = append (stageExecutor , func (ctx context.Context ) error {
144- jobName := fmt .Sprintf ("%-*s" , maxJobNameLen , rc .String ())
145- return rc .Executor ().Finally (func (ctx context.Context ) error {
146- isLastRunningContainer := func (currentStage int , currentRun int ) bool {
147- return currentStage == len (plan .Stages )- 1 && currentRun == len (stage .Runs )- 1
148- }
149-
150- if runner .config .AutoRemove && isLastRunningContainer (s , r ) {
151- log .Infof ("Cleaning up container for job %s" , rc .JobName )
152- if err := rc .stopJobContainer ()(ctx ); err != nil {
153- log .Errorf ("Error while cleaning container: %v" , err )
142+
143+ b := 0
144+ for i , matrix := range matrixes {
145+ rc := runner .newRunContext (run , matrix )
146+ rc .JobName = rc .Name
147+ if len (matrixes ) > 1 {
148+ rc .Name = fmt .Sprintf ("%s-%d" , rc .Name , i + 1 )
149+ }
150+ if len (rc .String ()) > maxJobNameLen {
151+ maxJobNameLen = len (rc .String ())
152+ }
153+ stageExecutor = append (stageExecutor , func (ctx context.Context ) error {
154+ jobName := fmt .Sprintf ("%-*s" , maxJobNameLen , rc .String ())
155+ return rc .Executor ().Finally (func (ctx context.Context ) error {
156+ isLastRunningContainer := func (currentStage int , currentRun int ) bool {
157+ return currentStage == len (plan .Stages )- 1 && currentRun == len (stage .Runs )- 1
158+ }
159+
160+ if runner .config .AutoRemove && isLastRunningContainer (s , r ) {
161+ log .Infof ("Cleaning up container for job %s" , rc .JobName )
162+ if err := rc .stopJobContainer ()(ctx ); err != nil {
163+ log .Errorf ("Error while cleaning container: %v" , err )
164+ }
154165 }
155- }
156-
157- return nil
158- })( common . WithJobErrorContainer ( WithJobLogger ( ctx , jobName , rc . Config . Secrets , rc . Config . InsecureSecrets )))
159- })
160- b ++
161- if b == maxParallel {
162- pipeline = append ( pipeline , common .NewParallelExecutor ( stageExecutor ... ) )
163- stageExecutor = make ([]common. Executor , 0 )
164- b = 0
166+
167+ return nil
168+ })( common . WithJobErrorContainer ( WithJobLogger ( ctx , jobName , rc . Config . Secrets , rc . Config . InsecureSecrets )))
169+ })
170+ b ++
171+ if b == maxParallel {
172+ pipeline = append ( pipeline , common . NewParallelExecutor ( stageExecutor ... ))
173+ stageExecutor = make ([] common.Executor , 0 )
174+ b = 0
175+ }
165176 }
166177 }
167- }
178+ return common .NewPipelineExecutor (pipeline ... )(ctx )
179+ })
168180 }
169181
170- return common .NewPipelineExecutor (pipeline ... ).Then (handleFailure (plan ))
182+ return common .NewPipelineExecutor (stagePipeline ... ).Then (handleFailure (plan ))
171183}
172184
173185func handleFailure (plan * model.Plan ) common.Executor {
0 commit comments