diff --git a/pkg/apis/jenkinsio/v1alpha1/jenkins_types.go b/pkg/apis/jenkinsio/v1alpha1/jenkins_types.go index 2002fbca..4a828442 100644 --- a/pkg/apis/jenkinsio/v1alpha1/jenkins_types.go +++ b/pkg/apis/jenkinsio/v1alpha1/jenkins_types.go @@ -21,11 +21,12 @@ type JenkinsSpec struct { // JenkinsMaster defines the Jenkins master pod attributes and plugins, // every single change requires Jenkins master pod restart type JenkinsMaster struct { - Image string `json:"image,omitempty"` - NodeSelector map[string]string `json:"nodeSelector,omitempty"` - Annotations map[string]string `json:"masterAnnotations,omitempty"` - Resources corev1.ResourceRequirements `json:"resources,omitempty"` - Env []corev1.EnvVar `json:"env,omitempty"` + Image string `json:"image,omitempty"` + ImagePullPolicy corev1.PullPolicy `json:"imagePullPolicy,omitempty"` + NodeSelector map[string]string `json:"nodeSelector,omitempty"` + Annotations map[string]string `json:"masterAnnotations,omitempty"` + Resources corev1.ResourceRequirements `json:"resources,omitempty"` + Env []corev1.EnvVar `json:"env,omitempty"` // OperatorPlugins contains plugins required by operator OperatorPlugins map[string][]string `json:"basePlugins,omitempty"` // Plugins contains plugins required by user diff --git a/pkg/controller/jenkins/configuration/base/reconcile.go b/pkg/controller/jenkins/configuration/base/reconcile.go index fdd99cf9..c6775376 100644 --- a/pkg/controller/jenkins/configuration/base/reconcile.go +++ b/pkg/controller/jenkins/configuration/base/reconcile.go @@ -373,36 +373,39 @@ func isPodTerminating(pod corev1.Pod) bool { } func (r *ReconcileJenkinsBaseConfiguration) isRecreatePodNeeded(currentJenkinsMasterPod corev1.Pod) bool { - recreatePod := false - if currentJenkinsMasterPod.Status.Phase == corev1.PodFailed || currentJenkinsMasterPod.Status.Phase == corev1.PodSucceeded || currentJenkinsMasterPod.Status.Phase == corev1.PodUnknown { r.logger.Info(fmt.Sprintf("Invalid Jenkins pod phase '%+v', recreating pod", currentJenkinsMasterPod.Status)) - recreatePod = true + return true } if r.jenkins.Spec.Master.Image != currentJenkinsMasterPod.Spec.Containers[0].Image { r.logger.Info(fmt.Sprintf("Jenkins image has changed to '%+v', recreating pod", r.jenkins.Spec.Master.Image)) - recreatePod = true + return true + } + + if r.jenkins.Spec.Master.ImagePullPolicy != currentJenkinsMasterPod.Spec.Containers[0].ImagePullPolicy { + r.logger.Info(fmt.Sprintf("Jenkins image pull policy has changed to '%+v', recreating pod", r.jenkins.Spec.Master.ImagePullPolicy)) + return true } if len(r.jenkins.Spec.Master.Annotations) > 0 && !reflect.DeepEqual(r.jenkins.Spec.Master.Annotations, currentJenkinsMasterPod.ObjectMeta.Annotations) { r.logger.Info(fmt.Sprintf("Jenkins pod annotations have changed to '%+v', recreating pod", r.jenkins.Spec.Master.Annotations)) - recreatePod = true + return true } if !reflect.DeepEqual(r.jenkins.Spec.Master.Resources, currentJenkinsMasterPod.Spec.Containers[0].Resources) { r.logger.Info(fmt.Sprintf("Jenkins pod resources have changed, actual '%+v' required '%+v' - recreating pod", currentJenkinsMasterPod.Spec.Containers[0].Resources, r.jenkins.Spec.Master.Resources)) - recreatePod = true + return true } if !reflect.DeepEqual(r.jenkins.Spec.Master.NodeSelector, currentJenkinsMasterPod.Spec.NodeSelector) { r.logger.Info(fmt.Sprintf("Jenkins pod node selector has changed, actual '%+v' required '%+v' - recreating pod", currentJenkinsMasterPod.Spec.NodeSelector, r.jenkins.Spec.Master.NodeSelector)) - recreatePod = true + return true } requiredEnvs := resources.GetJenkinsMasterPodBaseEnvs() @@ -410,10 +413,10 @@ func (r *ReconcileJenkinsBaseConfiguration) isRecreatePodNeeded(currentJenkinsMa if !reflect.DeepEqual(requiredEnvs, currentJenkinsMasterPod.Spec.Containers[0].Env) { r.logger.Info(fmt.Sprintf("Jenkins env have changed, actual '%+v' required '%+v' - recreating pod", currentJenkinsMasterPod.Spec.Containers[0].Env, requiredEnvs)) - recreatePod = true + return true } - return recreatePod + return false } func (r *ReconcileJenkinsBaseConfiguration) restartJenkinsMasterPod(meta metav1.ObjectMeta) error { diff --git a/pkg/controller/jenkins/configuration/base/resources/pod.go b/pkg/controller/jenkins/configuration/base/resources/pod.go index 898b75ac..e2963f0f 100644 --- a/pkg/controller/jenkins/configuration/base/resources/pod.go +++ b/pkg/controller/jenkins/configuration/base/resources/pod.go @@ -97,8 +97,9 @@ func NewJenkinsMasterPod(objectMeta metav1.ObjectMeta, jenkins *v1alpha1.Jenkins NodeSelector: jenkins.Spec.Master.NodeSelector, Containers: []corev1.Container{ { - Name: "jenkins-master", - Image: jenkins.Spec.Master.Image, + Name: "jenkins-master", + Image: jenkins.Spec.Master.Image, + ImagePullPolicy: jenkins.Spec.Master.ImagePullPolicy, Command: []string{ "bash", fmt.Sprintf("%s/%s", jenkinsScriptsVolumePath, initScriptName), diff --git a/pkg/controller/jenkins/jenkins_controller.go b/pkg/controller/jenkins/jenkins_controller.go index cb22439f..1c594500 100644 --- a/pkg/controller/jenkins/jenkins_controller.go +++ b/pkg/controller/jenkins/jenkins_controller.go @@ -219,9 +219,15 @@ func (r *ReconcileJenkins) setDefaults(jenkins *v1alpha1.Jenkins, logger logr.Lo logger.Info("Setting default Jenkins master image: " + constants.DefaultJenkinsMasterImage) changed = true jenkins.Spec.Master.Image = constants.DefaultJenkinsMasterImage + jenkins.Spec.Master.ImagePullPolicy = corev1.PullAlways + } + if len(jenkins.Spec.Master.ImagePullPolicy) == 0 { + logger.Info(fmt.Sprintf("Setting default Jenkins master image pull policy: %s", corev1.PullAlways)) + changed = true + jenkins.Spec.Master.ImagePullPolicy = corev1.PullAlways } if len(jenkins.Spec.Master.OperatorPlugins) == 0 { - logger.Info("Setting default base plugins") + logger.Info("Setting default operator plugins") changed = true jenkins.Spec.Master.OperatorPlugins = plugins.BasePlugins() }