From db2dce4e24a9ff01d0032fc9311798ace0ecfb83 Mon Sep 17 00:00:00 2001 From: Vibhav Bobade Date: Mon, 18 Nov 2019 15:03:51 +0530 Subject: [PATCH] Make Jenkins_Home overwritable --- .../resources/init_configuration_configmap.go | 6 +-- .../configuration/base/resources/pod.go | 39 +++++++++++++++---- .../base/resources/scripts_configmap.go | 4 +- .../configuration/base/validate_test.go | 28 ------------- 4 files changed, 36 insertions(+), 41 deletions(-) diff --git a/pkg/controller/jenkins/configuration/base/resources/init_configuration_configmap.go b/pkg/controller/jenkins/configuration/base/resources/init_configuration_configmap.go index 918abded..f21d5b16 100644 --- a/pkg/controller/jenkins/configuration/base/resources/init_configuration_configmap.go +++ b/pkg/controller/jenkins/configuration/base/resources/init_configuration_configmap.go @@ -36,7 +36,7 @@ if (!operatorUserCreatedFile.exists()) { } `)) -func buildCreateJenkinsOperatorUserGroovyScript() (*string, error) { +func buildCreateJenkinsOperatorUserGroovyScript(jenkins *v1alpha2.Jenkins) (*string, error) { data := struct { OperatorCredentialsPath string OperatorUserNameFile string @@ -46,7 +46,7 @@ func buildCreateJenkinsOperatorUserGroovyScript() (*string, error) { OperatorCredentialsPath: jenkinsOperatorCredentialsVolumePath, OperatorUserNameFile: OperatorCredentialsSecretUserNameKey, OperatorPasswordFile: OperatorCredentialsSecretPasswordKey, - OperatorUserCreatedFilePath: jenkinsHomePath + "/operatorUserCreated", + OperatorUserCreatedFilePath: getJenkinsHomePath(jenkins) + "/operatorUserCreated", } output, err := render.Render(createOperatorUserGroovyFmtTemplate, data) @@ -66,7 +66,7 @@ func GetInitConfigurationConfigMapName(jenkins *v1alpha2.Jenkins) string { func NewInitConfigurationConfigMap(meta metav1.ObjectMeta, jenkins *v1alpha2.Jenkins) (*corev1.ConfigMap, error) { meta.Name = GetInitConfigurationConfigMapName(jenkins) - createJenkinsOperatorUserGroovy, err := buildCreateJenkinsOperatorUserGroovyScript() + createJenkinsOperatorUserGroovy, err := buildCreateJenkinsOperatorUserGroovyScript(jenkins) if err != nil { return nil, err } diff --git a/pkg/controller/jenkins/configuration/base/resources/pod.go b/pkg/controller/jenkins/configuration/base/resources/pod.go index 3cd378cf..0c479d7f 100644 --- a/pkg/controller/jenkins/configuration/base/resources/pod.go +++ b/pkg/controller/jenkins/configuration/base/resources/pod.go @@ -16,7 +16,6 @@ const ( // JenkinsHomeVolumeName is the Jenkins home volume name JenkinsHomeVolumeName = "jenkins-home" jenkinsPath = "/var/jenkins" - jenkinsHomePath = jenkinsPath + "/home" jenkinsScriptsVolumeName = "scripts" // JenkinsScriptsVolumePath is a path where are scripts used to configure Jenkins @@ -62,12 +61,7 @@ func GetJenkinsMasterContainerBaseCommand() []string { // GetJenkinsMasterContainerBaseEnvs returns Jenkins master pod envs required by operator func GetJenkinsMasterContainerBaseEnvs(jenkins *v1alpha2.Jenkins) []corev1.EnvVar { - envVars := []corev1.EnvVar{ - { - Name: "JENKINS_HOME", - Value: jenkinsHomePath, - }, - } + envVars := []corev1.EnvVar{} if len(jenkins.Spec.ConfigurationAsCode.Secret.Name) > 0 { envVars = append(envVars, corev1.EnvVar{ @@ -79,6 +73,17 @@ func GetJenkinsMasterContainerBaseEnvs(jenkins *v1alpha2.Jenkins) []corev1.EnvVa return envVars } +// getJenkinsHomePath fetches the Home Path for Jenkins +func getJenkinsHomePath(jenkins *v1alpha2.Jenkins) string { + defaultJenkinsHomePath := jenkinsPath + "/jenkins" + for _, envVar := range jenkins.Spec.Master.Containers[0].Env { + if envVar.Name == "JENKINS_HOME" { + return envVar.Value + } + } + return defaultJenkinsHomePath +} + // GetJenkinsMasterPodBaseVolumes returns Jenkins master pod volumes required by operator func GetJenkinsMasterPodBaseVolumes(jenkins *v1alpha2.Jenkins) []corev1.Volume { configMapVolumeSourceDefaultMode := corev1.ConfigMapVolumeSourceDefaultMode @@ -163,7 +168,7 @@ func GetJenkinsMasterContainerBaseVolumeMounts(jenkins *v1alpha2.Jenkins) []core volumeMounts := []corev1.VolumeMount{ { Name: JenkinsHomeVolumeName, - MountPath: jenkinsHomePath, + MountPath: getJenkinsHomePath(jenkins), ReadOnly: false, }, { @@ -204,9 +209,27 @@ func GetJenkinsMasterContainerBaseVolumeMounts(jenkins *v1alpha2.Jenkins) []core // NewJenkinsMasterContainer returns Jenkins master Kubernetes container func NewJenkinsMasterContainer(jenkins *v1alpha2.Jenkins) corev1.Container { jenkinsContainer := jenkins.Spec.Master.Containers[0] + envs := GetJenkinsMasterContainerBaseEnvs(jenkins) envs = append(envs, jenkinsContainer.Env...) + jenkinsHomeEnvVar := corev1.EnvVar{ + Name: "JENKINS_HOME", + Value: getJenkinsHomePath(jenkins), + } + + jenkinsHomeEnvVarExists := false + for _, env := range jenkinsContainer.Env { + if env.Name == jenkinsHomeEnvVar.Name { + jenkinsHomeEnvVarExists = true + break + } + } + + if !jenkinsHomeEnvVarExists { + envs = append(envs, jenkinsHomeEnvVar) + } + return corev1.Container{ Name: JenkinsMasterContainerName, Image: jenkinsContainer.Image, diff --git a/pkg/controller/jenkins/configuration/base/resources/scripts_configmap.go b/pkg/controller/jenkins/configuration/base/resources/scripts_configmap.go index 05450b75..12821e76 100644 --- a/pkg/controller/jenkins/configuration/base/resources/scripts_configmap.go +++ b/pkg/controller/jenkins/configuration/base/resources/scripts_configmap.go @@ -280,7 +280,7 @@ func buildInitBashScript(jenkins *v1alpha2.Jenkins) (*string, error) { BasePlugins []v1alpha2.Plugin UserPlugins []v1alpha2.Plugin }{ - JenkinsHomePath: jenkinsHomePath, + JenkinsHomePath: getJenkinsHomePath(jenkins), InitConfigurationPath: jenkinsInitConfigurationVolumePath, BasePlugins: jenkins.Spec.Master.BasePlugins, UserPlugins: jenkins.Spec.Master.Plugins, @@ -314,7 +314,7 @@ func NewScriptsConfigMap(meta metav1.ObjectMeta, jenkins *v1alpha2.Jenkins) (*co ObjectMeta: meta, Data: map[string]string{ InitScriptName: *initBashScript, - installPluginsCommand: fmt.Sprintf(installPluginsBashFmt, jenkinsHomePath), + installPluginsCommand: fmt.Sprintf(installPluginsBashFmt, getJenkinsHomePath(jenkins)), }, }, nil } diff --git a/pkg/controller/jenkins/configuration/base/validate_test.go b/pkg/controller/jenkins/configuration/base/validate_test.go index 0bc88cad..41b50ffb 100644 --- a/pkg/controller/jenkins/configuration/base/validate_test.go +++ b/pkg/controller/jenkins/configuration/base/validate_test.go @@ -371,34 +371,6 @@ func TestValidateJenkinsMasterPodEnvs(t *testing.T) { got := baseReconcileLoop.validateJenkinsMasterPodEnvs() assert.Nil(t, got) }) - t.Run("override JENKINS_HOME env", func(t *testing.T) { - jenkins := v1alpha2.Jenkins{ - Spec: v1alpha2.JenkinsSpec{ - Master: v1alpha2.JenkinsMaster{ - Containers: []v1alpha2.Container{ - { - Env: []v1.EnvVar{ - { - Name: "JENKINS_HOME", - Value: "", - }, - { - Name: constants.JavaOpsVariableName, - Value: validJenkinsOps, - }, - }, - }, - }, - }, - }, - } - baseReconcileLoop := New(configuration.Configuration{ - Jenkins: &jenkins, - }, logf.ZapLogger(false), false, false, nil) - got := baseReconcileLoop.validateJenkinsMasterPodEnvs() - - assert.Equal(t, got, []string{"Jenkins Master container env 'JENKINS_HOME' cannot be overridden"}) - }) t.Run("missing -Djava.awt.headless=true in JAVA_OPTS env", func(t *testing.T) { jenkins := v1alpha2.Jenkins{ Spec: v1alpha2.JenkinsSpec{