func()

in pkg/api/service/service.go [49:105]


func (s *StepRunnerService) Run(ctx context.Context, request *proto.RunRequest) (response *proto.RunResponse, err error) {
	if _, ok := s.jobs.Get(request.Id); ok {
		return &proto.RunResponse{}, nil
	}

	specDef, err := s.loadSteps(request.Steps, request)
	if err != nil {
		return nil, fmt.Errorf("loading step: %w", err)
	}

	jobOpts := []func(*jobs.Job){}
	if s.runExitWaitTime != 0 {
		jobOpts = append(jobOpts, jobs.WithRunExitWaitTime(s.runExitWaitTime))
	}

	job, err := jobs.New(request.Id, specDef.Dir(), jobOpts...)
	if err != nil {
		return nil, fmt.Errorf("initializing request: %w", err)
	}

	defer func() {
		if err != nil {
			job.Close()
		}
	}()

	jobVars, err := variables.Prepare(request.Job, job.TmpDir)
	if err != nil {
		return nil, fmt.Errorf("preparing environment: %w", err)
	}

	env, err := runner.GlobalEnvironment(s.env, jobVars)
	if err != nil {
		return nil, fmt.Errorf("initializing global environment: %w", err)
	}

	globalCtxEnv := env.AddLexicalScope(request.Env)
	stdout, stderr := job.Logs()
	globCtx := runner.NewGlobalContext(job.WorkDir, jobVars, globalCtxEnv, stdout, stderr)

	params := &runner.Params{}
	step, err := s.stepParser.Parse(globCtx, specDef, params, runner.StepDefinedInGitLabJob)
	if err != nil {
		return nil, fmt.Errorf("failed to start step runner service: %w", err)
	}

	inputs := params.NewInputsWithDefault(specDef.SpecInputs())
	stepsCtx, err := runner.NewStepsContext(globCtx, specDef.Dir(), inputs, globCtx.Env())
	if err != nil {
		return nil, err
	}

	// actually execute the steps request
	s.jobs.Put(request.Id, job)
	s.execute(func() { job.Run(stepsCtx, step) })
	return &proto.RunResponse{}, nil
}