func()

in commands/multi.go [883:954]


func (mr *RunCommand) processBuildOnRunner(
	runner *common.RunnerConfig,
	runners chan *common.RunnerConfig,
	provider common.ExecutorProvider,
	executorData common.ExecutorData,
) error {
	buildSession, sessionInfo, err := mr.createSession(provider)
	if err != nil {
		// Release job request
		mr.buildsHelper.releaseRequest(runner, false)
		return err
	}

	// Receive a new build
	trace, jobData, err := mr.requestJob(runner, sessionInfo)
	// Release job request
	mr.buildsHelper.releaseRequest(runner, jobData != nil)
	if err != nil || jobData == nil {
		return err
	}
	defer func() { mr.traceOutcome(trace, err) }()

	// Create a new build
	build, err := common.NewBuild(*jobData, runner, mr.abortBuilds, executorData)
	if err != nil {
		return err
	}
	build.Session = buildSession
	build.ArtifactUploader = mr.network.UploadRawArtifacts

	trace.SetDebugModeEnabled(build.IsDebugModeEnabled())

	// Add build to list of builds to assign numbers
	mr.buildsHelper.addBuild(build)

	fields := logrus.Fields{
		"job":                   build.ID,
		"project":               build.JobInfo.ProjectID,
		"repo_url":              build.RepoCleanURL(),
		"time_in_queue_seconds": build.JobInfo.TimeInQueueSeconds,
	}

	mr.log().WithFields(fields).Infoln("Added job to processing list")
	defer func() {
		if mr.buildsHelper.removeBuild(build) {
			mr.log().WithFields(fields).Infoln("Removed job from processing list")

			mr.usageLoggerStore(usage_log.Record{
				Runner: usage_log.Runner{
					ID:       runner.ShortDescription(),
					Name:     runner.Name,
					SystemID: runner.GetSystemID(),
				},
				Job: usage_log.Job{
					URL:             build.JobURL(),
					DurationSeconds: build.FinalDuration().Seconds(),
					Status:          build.CurrentState().String(),
					FailureReason:   build.FailureReason().String(),
					StartedAt:       build.StartedAt().UTC(),
					FinishedAt:      build.FinishedAt().UTC(),
				},
			})
		}
	}()

	// Process the same runner by different worker again
	// to speed up taking the builds
	mr.requeueRunner(runner, runners)

	// Process a build
	return build.Run(mr.getConfig(), trace)
}