in pkg/controller/jenkins_jobbuildrun/controller.go [155:195]
func checkLastBuild(job *gojenkins.Job, instance *jenkinsApi.JenkinsJobBuildRun,
jc jenkins.ClientInterface,
) (time.Duration, error) {
build, err := jc.GetLastBuild(job)
if err != nil {
// job does not have any builds so we can trigger new one
if helper.JenkinsIsNotFoundErr(err) {
return retryInterval, triggerNewBuild(instance, jc, jenkinsApi.JobBuildRunStatusCreated)
}
// unknown error
return 0, fmt.Errorf("failed to get last build: %w", err)
}
// check if latest build already running
if jc.BuildIsRunning(build) {
return retryInterval, nil // latest build already running, stop here and check later after specified interval
}
// if job has latest build we must check if it was created by this controller
if build.GetBuildNumber() == instance.Status.BuildNumber { // build created by this controller
if build.GetResult() == gojenkins.STATUS_SUCCESS { // build finished with success, so we can set Completed status to CR and exit
instance.Status.Status = jenkinsApi.JobBuildRunStatusCompleted
return instance.GetDeleteAfterCompletionInterval(), nil
}
// build was not finished with success, so we must check how many times we already started it
if instance.Spec.Retry > instance.Status.Launches { // launches is less than amount of specified retries
return retryInterval, triggerNewBuild(instance, jc, jenkinsApi.JobBuildRunStatusRetrying)
}
// we reach amount of specified retries so job is failed, exit
instance.Status.Status = jenkinsApi.JobBuildRunStatusFailed
return 0, nil
}
// latest job was not created by this controller so we can trigger a new one
return retryInterval, triggerNewBuild(instance, jc, jenkinsApi.JobBuildRunStatusCreated)
}