130 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Go
		
	
	
	
| package resources
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 
 | |
| 	"github.com/jenkinsci/kubernetes-operator/api/v1alpha2"
 | |
| 
 | |
| 	corev1 "k8s.io/api/core/v1"
 | |
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | |
| 	logf "sigs.k8s.io/controller-runtime/pkg/log"
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	NameWithSuffixFormat         = "%s-%s"
 | |
| 	PluginDefinitionFormat       = "%s:%s"
 | |
| 	BuilderDockerfileArg         = "--dockerfile=/workspace/dockerfile/Dockerfile"
 | |
| 	BuilderContextDirArg         = "--context=dir://workspace/"
 | |
| 	BuilderPushArg               = "--no-push"
 | |
| 	BuilderDigestFileArg         = "--digest-file=/dev/termination-log"
 | |
| 	BuilderSuffix                = "builder"
 | |
| 	DockerfileStorageSuffix      = "dockerfile-storage"
 | |
| 	DockerfileNameSuffix         = "dockerfile"
 | |
| 	JenkinsImageBuilderImage     = "gcr.io/kaniko-project/executor:latest"
 | |
| 	JenkinsImageBuilderName      = "jenkins-image-builder"
 | |
| 	JenkinsImageDefaultBaseImage = "jenkins/jenkins:lts"
 | |
| 	DockerfileName               = "Dockerfile"
 | |
| 	DockerfileTemplate           = `FROM %s
 | |
| RUN curl -o /tmp/install-plugins.sh https://raw.githubusercontent.com/jenkinsci/docker/master/install-plugins.sh
 | |
| RUN chmod +x /tmp/install-plugins.sh
 | |
| RUN install-plugins.sh %s `
 | |
| )
 | |
| 
 | |
| var log = logf.Log.WithName("controller_jenkinsimage")
 | |
| 
 | |
| // NewBuilderPod returns a busybox pod with the same name/namespace as the cr.
 | |
| func NewBuilderPod(cr *v1alpha2.JenkinsImage) *corev1.Pod {
 | |
| 	name := fmt.Sprintf(NameWithSuffixFormat, cr.Name, BuilderSuffix)
 | |
| 	args := []string{BuilderDockerfileArg, BuilderContextDirArg, BuilderPushArg, BuilderDigestFileArg}
 | |
| 	volumes := getVolumes(cr)
 | |
| 	volumeMounts := getVolumesMounts(cr)
 | |
| 	p := &corev1.Pod{
 | |
| 		ObjectMeta: metav1.ObjectMeta{
 | |
| 			Name:      name,
 | |
| 			Namespace: cr.Namespace,
 | |
| 		},
 | |
| 		Spec: corev1.PodSpec{
 | |
| 			RestartPolicy: corev1.RestartPolicyNever,
 | |
| 			Containers: []corev1.Container{
 | |
| 				{
 | |
| 					Name:         JenkinsImageBuilderName,
 | |
| 					Image:        JenkinsImageBuilderImage,
 | |
| 					Args:         args,
 | |
| 					VolumeMounts: volumeMounts,
 | |
| 				},
 | |
| 			},
 | |
| 			Volumes: volumes,
 | |
| 		},
 | |
| 	}
 | |
| 	return p
 | |
| }
 | |
| 
 | |
| // NewDockerfileConfigMap returns a busybox pod with the same name/namespace as the cr.
 | |
| func NewDockerfileConfigMap(cr *v1alpha2.JenkinsImage) *corev1.ConfigMap {
 | |
| 	dockerfileContent := fmt.Sprintf(DockerfileTemplate, getDefaultedBaseImage(cr), getPluginsList(cr))
 | |
| 	name := fmt.Sprintf(NameWithSuffixFormat, cr.Name, DockerfileNameSuffix)
 | |
| 	data := map[string]string{DockerfileName: dockerfileContent}
 | |
| 	dockerfile := &corev1.ConfigMap{
 | |
| 		ObjectMeta: metav1.ObjectMeta{
 | |
| 			Name:      name,
 | |
| 			Namespace: cr.Namespace,
 | |
| 		},
 | |
| 		Data: data,
 | |
| 	}
 | |
| 	return dockerfile
 | |
| }
 | |
| 
 | |
| func getPluginsList(cr *v1alpha2.JenkinsImage) string {
 | |
| 	logger := log.WithName("jenkinsimage_getPluginsList")
 | |
| 	plugins := ""
 | |
| 	for _, v := range cr.Spec.Plugins {
 | |
| 		plugins += fmt.Sprintf(PluginDefinitionFormat, v.Name, v.Version) + " "
 | |
| 		logger.Info(fmt.Sprintf("Adding plugin %s:%s ", v.Name, v.Version))
 | |
| 	}
 | |
| 	return plugins
 | |
| }
 | |
| 
 | |
| func getDefaultedBaseImage(cr *v1alpha2.JenkinsImage) string {
 | |
| 	if len(cr.Spec.BaseImage.Name) != 0 {
 | |
| 		return cr.Spec.BaseImage.Name
 | |
| 	}
 | |
| 	return JenkinsImageDefaultBaseImage
 | |
| }
 | |
| 
 | |
| func getVolumes(cr *v1alpha2.JenkinsImage) []corev1.Volume {
 | |
| 	name := fmt.Sprintf(NameWithSuffixFormat, cr.Name, DockerfileStorageSuffix)
 | |
| 	storage := corev1.Volume{
 | |
| 		Name: name,
 | |
| 		VolumeSource: corev1.VolumeSource{
 | |
| 			EmptyDir: &corev1.EmptyDirVolumeSource{},
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	name = fmt.Sprintf(NameWithSuffixFormat, cr.Name, DockerfileNameSuffix)
 | |
| 	config := corev1.Volume{
 | |
| 		Name: name,
 | |
| 		VolumeSource: corev1.VolumeSource{
 | |
| 			ConfigMap: &corev1.ConfigMapVolumeSource{
 | |
| 				LocalObjectReference: corev1.LocalObjectReference{Name: name},
 | |
| 			},
 | |
| 		},
 | |
| 	}
 | |
| 	volumes := []corev1.Volume{storage, config}
 | |
| 	return volumes
 | |
| }
 | |
| 
 | |
| func getVolumesMounts(cr *v1alpha2.JenkinsImage) []corev1.VolumeMount {
 | |
| 	name := fmt.Sprintf(NameWithSuffixFormat, cr.Name, DockerfileStorageSuffix)
 | |
| 	storage := corev1.VolumeMount{
 | |
| 		Name:      name,
 | |
| 		MountPath: "/workspace",
 | |
| 	}
 | |
| 	name = fmt.Sprintf(NameWithSuffixFormat, cr.Name, DockerfileNameSuffix)
 | |
| 	config := corev1.VolumeMount{
 | |
| 		Name:      name,
 | |
| 		MountPath: "/workspace/dockerfile",
 | |
| 	}
 | |
| 	volumeMounts := []corev1.VolumeMount{storage, config}
 | |
| 	return volumeMounts
 | |
| }
 |