func Run()

in codecatalyst-runner/pkg/workflows/workflow_runner.go [25:105]


func Run(ctx context.Context, params *RunParams) error {
	log.Ctx(ctx).Debug().Msgf("running workflow with params %+v", *params)
	if params.WorkflowPath != "" {
		if _, err := os.Stat(params.WorkflowPath); err != nil {
			return fmt.Errorf("unable to load workflow file '%s': %w", params.WorkflowPath, err)
		}

		params.WorkingDir, _ = filepath.Abs(filepath.Dir(filepath.Dir(filepath.Dir(params.WorkflowPath))))
	} else {
		params.WorkingDir, _ = filepath.Abs(params.WorkingDir)
		if workflows, err := os.ReadDir(filepath.Join(params.WorkingDir, ".codecatalyst", "workflows")); err != nil {
			return err
		} else {
			workflowOptions := make(map[string]string, 0)
			for _, workflow := range workflows {
				ext := filepath.Ext(workflow.Name())
				if ext != ".yml" && ext != ".yaml" {
					continue
				}
				workflowFile := filepath.Join(params.WorkingDir, ".codecatalyst", "workflows", workflow.Name())
				log.Debug().Msgf("considering workflow file %s", workflowFile)
				if workflow, err := readWorkflow(workflowFile); err != nil {
					return fmt.Errorf("unable to read workflow file '%s': %w", workflowFile, err)
				} else {
					workflowOptions[workflow.Name] = workflowFile
				}
			}
			if params.WorkflowName != "" {
				if val, ok := workflowOptions[params.WorkflowName]; !ok {
					return fmt.Errorf("no workflow defined named '%s'", params.WorkflowName)
				} else {
					params.WorkflowPath = val
				}
			} else {
				// prompt to select a workflow
				prompt := promptui.Select{
					Label:  "Select workflow",
					Items:  reflect.ValueOf(workflowOptions).MapKeys(),
					Stdout: &bellSkipper{},
				}
				if _, result, err := prompt.Run(); err != nil {
					return fmt.Errorf("unable to select a workflow: %w", err)
				} else {
					params.WorkflowPath = workflowOptions[result]
				}
			}
		}
	}

	if !filepath.IsAbs(params.WorkflowPath) {
		if absWorkflowPath, err := filepath.Abs(params.WorkflowPath); err != nil {
			return err
		} else {
			params.WorkflowPath = absWorkflowPath
		}
	}

	log.Debug().Msgf("🚚 Running workflow file '%s'", params.WorkflowPath)

	workflow, err := readWorkflow(params.WorkflowPath)
	if err != nil {
		return fmt.Errorf("unable to read workflow file '%s': %w", params.WorkflowPath, err)
	}

	params.NewWorkflowPlansProviderParams.Workflow = workflow
	plans := NewWorkflowPlansProvider(&params.NewWorkflowPlansProviderParams)

	params.NewWorkflowFeaturesProviderParams.Workflow = workflow
	params.NewWorkflowFeaturesProviderParams.EnvironmentConfiguration.WorkingDir = params.WorkingDir
	features, err := NewWorkflowFeaturesProvider(&params.NewWorkflowFeaturesProviderParams)
	if err != nil {
		return fmt.Errorf("unable to create features provider: %w", err)
	}
	return runner.RunAll(ctx, &runner.RunAllParams{
		Namespace:     workflow.Name,
		Plans:         plans,
		Features:      features,
		Concurrency:   params.Concurrency,
		ExecutionType: params.ExecutionType,
	})
}