func checkLastBuild()

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