diff --git a/api/v1alpha2/jenkins_types.go b/api/v1alpha2/jenkins_types.go index 09332af42..4b9f95cec 100644 --- a/api/v1alpha2/jenkins_types.go +++ b/api/v1alpha2/jenkins_types.go @@ -311,6 +311,7 @@ type JenkinsMaster struct { // periodSeconds: 10 // successThreshold: 1 // timeoutSeconds: 5 + // lifecycle: {} // name: jenkins-master // readinessProbe: // failureThreshold: 3 diff --git a/chart/jenkins-operator/templates/jenkins.yaml b/chart/jenkins-operator/templates/jenkins.yaml index 72c18c239..0906891fd 100644 --- a/chart/jenkins-operator/templates/jenkins.yaml +++ b/chart/jenkins-operator/templates/jenkins.yaml @@ -134,6 +134,9 @@ spec: {{- with .Values.jenkins.env }} env: {{- toYaml . | nindent 8 }} {{- end }} + {{- with .Values.jenkins.lifecycle}} + lifecycle: {{ toYaml . | nindent 10 }} + {{- end }} {{- with .Values.jenkins.volumeMounts }} volumeMounts: {{- toYaml . | nindent 8 }} {{- end }} diff --git a/chart/jenkins-operator/values.yaml b/chart/jenkins-operator/values.yaml index c2a1cdd10..e40347989 100644 --- a/chart/jenkins-operator/values.yaml +++ b/chart/jenkins-operator/values.yaml @@ -44,6 +44,9 @@ jenkins: # imagePullPolicy defines policy for pulling images imagePullPolicy: Always + # lifecycle is used if you want to specify lifecycle hooks for the master container + lifecycle: {} + # priorityClassName indicates the importance of a Pod relative to other Pods # See: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/ priorityClassName: "" diff --git a/controllers/jenkins_controller.go b/controllers/jenkins_controller.go index 7eb92454b..8569b6f25 100644 --- a/controllers/jenkins_controller.go +++ b/controllers/jenkins_controller.go @@ -378,6 +378,11 @@ func (r *JenkinsReconciler) setDefaults(jenkins *v1alpha2.Jenkins) (requeue bool changed = true jenkinsContainer.LivenessProbe = resources.NewProbe(containerProbeURI, containerProbePortName, corev1.URISchemeHTTP, 80, 5, 12) } + if jenkinsContainer.Lifecycle == nil { + logger.Info("Setting default Jenkins lifecycle") + changed = true + jenkinsContainer.Lifecycle = &corev1.Lifecycle{} + } if len(jenkinsContainer.Command) == 0 { logger.Info("Setting default Jenkins container command") changed = true diff --git a/pkg/configuration/base/resources/pod.go b/pkg/configuration/base/resources/pod.go index 783ccaa2b..e46eb5339 100644 --- a/pkg/configuration/base/resources/pod.go +++ b/pkg/configuration/base/resources/pod.go @@ -243,6 +243,7 @@ func NewJenkinsMasterContainer(jenkins *v1alpha2.Jenkins) corev1.Container { Image: jenkinsContainer.Image, ImagePullPolicy: jenkinsContainer.ImagePullPolicy, Command: jenkinsContainer.Command, + Lifecycle: jenkinsContainer.Lifecycle, LivenessProbe: jenkinsContainer.LivenessProbe, ReadinessProbe: jenkinsContainer.ReadinessProbe, Ports: []corev1.ContainerPort{ diff --git a/test/bats/2-deploy-with-more-options.bats b/test/bats/2-deploy-with-more-options.bats index 3b9aabeea..693bf4006 100644 --- a/test/bats/2-deploy-with-more-options.bats +++ b/test/bats/2-deploy-with-more-options.bats @@ -105,6 +105,7 @@ setup() { --set jenkins.nodeSelector.batstest=yep \ --set jenkins.image="jenkins/jenkins:2.462.3-lts" \ --set jenkins.imagePullPolicy="IfNotPresent" \ + --set jenkins.lifecycle.preStop.command='["echo bats test"]' \ --set jenkins.backup.makeBackupBeforePodDeletion=false \ --set jenkins.backup.image=quay.io/jenkins-kubernetes-operator/backup-pvc:e2e-test \ chart/jenkins-operator --wait @@ -137,6 +138,15 @@ setup() { assert_success } +#bats test_tags=phase:helm,scenario:more-options +@test "2.5 Helm: check lifecycle" { + [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" + + run ${KUBECTL} get pod jenkins-jenkins -o jsonpath={.spec.containers[0].lifecycle.preStop.exec.command[0]} + assert_success + assert_output "echo 'bats test'" +} + #bats test_tags=phase:helm,scenario:more-options @test "2.12 Helm: check node selector again" { [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly"