@@ -30,7 +30,9 @@ type task struct {
3030// NewRunner returns a new Runner, using the given Storer.
3131func NewRunner (s Storer ) * Runner {
3232 return & Runner {
33- Storer : s ,
33+ Storer : s ,
34+ runningJobs : make (map [uint64 ]bool ),
35+ runningProjs : make (map [uint64 ]bool ),
3436 }
3537}
3638
@@ -49,6 +51,7 @@ func (r *Runner) ScheduleProject(id uint64) error {
4951}
5052
5153func (r * Runner ) runJob (id uint64 , inProjectPipeline bool ) (Run , error ) {
54+ // TODO why return Run struct?
5255 defer r .doneJob (id , inProjectPipeline )
5356 var run Run
5457
@@ -62,7 +65,7 @@ func (r *Runner) runJob(id uint64, inProjectPipeline bool) (Run, error) {
6265 return run , errors .Wrap (err , "cannot assign run ID" )
6366 }
6467
65- if err : = createAndChdir (job .Workspace ); err != nil {
68+ if err = createAndChdir (job .Workspace ); err != nil {
6669 return run , errors .Wrap (err , "failed to create/change workspace" )
6770 }
6871
@@ -99,6 +102,30 @@ func (r *Runner) runJob(id uint64, inProjectPipeline bool) (Run, error) {
99102 return run , nil
100103}
101104
105+ func (r * Runner ) runPipe (id uint64 ) error {
106+ proj , err := r .GetProject (id )
107+ if err != nil {
108+ return errors .Wrapf (err , "cannot get project %d" , id )
109+ }
110+ defer r .donePipeline (id )
111+
112+ for _ , jobID := range proj .Pipeline {
113+ r .mu .Lock ()
114+ // TODO check if job is running first
115+ r .runningJobs [jobID ] = true
116+ r .mu .Unlock ()
117+ run , err := r .runJob (jobID , true )
118+ if err != nil {
119+ return err
120+ }
121+
122+ if ! run .Success {
123+ break
124+ }
125+ }
126+ return nil
127+ }
128+
102129func (r * Runner ) doneJob (id uint64 , inProjectPipeline bool ) {
103130 r .mu .Lock ()
104131 defer r .mu .Unlock ()
@@ -119,12 +146,31 @@ func (r *Runner) doneJob(id uint64, inProjectPipeline bool) {
119146 }
120147 }()
121148 } else {
122- // go r.runPipe(task.pipe )
149+ go r .runPipe (task .proj )
123150 }
124151 }
125152 }
126153}
127154
155+ func (r * Runner ) donePipeline (id uint64 ) {
156+ r .mu .Lock ()
157+ defer r .mu .Unlock ()
158+
159+ // Mark the Project as not running
160+ delete (r .runningProjs , id )
161+
162+ // If there are enqueued jobs/pipelines - run it
163+ if len (r .scheduled ) > 0 {
164+ task := r .scheduled [0 ]
165+ r .scheduled = r .scheduled [1 :]
166+ if task .job != 0 {
167+ go r .runJob (task .job , false )
168+ } else {
169+ go r .runPipe (task .proj )
170+ }
171+ }
172+ }
173+
128174func createAndChdir (path string ) error {
129175 if path == "" {
130176 return nil
0 commit comments