func New()

in pkg/api/internal/jobs/jobs.go [44:92]


func New(jobID, workDir string, options ...func(*Job)) (*Job, error) {
	if workDir == "" {
		osWorkDir, err := os.Getwd()
		if err != nil {
			return nil, fmt.Errorf("could not determine working directory: %w", err)
		}
		workDir = osWorkDir
	}

	if err := os.MkdirAll(workDir, 0700); err != nil {
		return nil, fmt.Errorf("creating workdir %q: %w", workDir, err)
	}

	// TODO: add job timeout to RunRequest and hook it up here
	ctx, cancel := context.WithCancel(context.Background())

	job := &Job{
		TmpDir:          "",
		WorkDir:         workDir,
		ID:              jobID,
		Ctx:             ctx,
		cancel:          cancel,
		logs:            nil,
		status:          proto.StepResult_unspecified,
		finishC:         make(chan struct{}, 1),
		runExitWaitTime: time.Second * 2,
	}

	for _, opt := range options {
		opt(job)
	}

	if job.logs == nil {
		job.TmpDir = path.Join(os.TempDir(), "step-runner-output-"+jobID)
		if err := os.MkdirAll(job.TmpDir, 0700); err != nil {
			return nil, fmt.Errorf("creating tmpdir %q: %w", job.TmpDir, err)
		}

		logs, err := file.New(path.Join(job.TmpDir, "logs"))
		if err != nil {
			_ = os.RemoveAll(job.TmpDir)
			return nil, fmt.Errorf("creating log file: %w", err)
		}

		job.logs = logs
	}

	return job, nil
}