in workflow.go [265:303]
func (w *Workflow) Do(ctx context.Context) error {
// assert the Workflow is not running
if !w.isRunning.TryLock() {
return ErrWorkflowIsRunning
}
defer w.isRunning.Unlock()
// if no steps to run
if w.Empty() {
return nil
}
w.reset()
// preflight check
if err := w.preflight(); err != nil {
return err
}
// each time one Step terminated, tick forward
w.statusChange.L.Lock()
for {
if done := w.tick(ctx); done {
break
}
w.statusChange.Wait()
}
w.statusChange.L.Unlock()
// ensure all goroutines are exited
w.waitGroup.Wait()
// return the error
err := make(ErrWorkflow)
for step, state := range w.steps {
err[step] = state.GetStepResult()
}
if w.SkipAsError && err.AllSucceeded() {
return nil
}
if !w.SkipAsError && err.AllSucceededOrSkipped() {
return nil
}
return err
}