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)
}