package seedjobs import ( virtuslabv1alpha1 "github.com/VirtusLab/jenkins-operator/pkg/apis/virtuslab/v1alpha1" jenkins "github.com/VirtusLab/jenkins-operator/pkg/controller/jenkins/client" k8s "sigs.k8s.io/controller-runtime/pkg/client" "context" "fmt" "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" "strings" ) const ( // ConfigureSeedJobsName this is the job name ConfigureSeedJobsName = "Configure Seed Jobs" deployKeyIDParameterName = "DEPLOY_KEY_ID" privateKeyParameterName = "PRIVATE_KEY" repositoryURLParameterName = "REPOSITORY_URL" repositoryBranchParameterName = "REPOSITORY_BRANCH" targetsParameterName = "TARGETS" displayNameParameterName = "SEED_JOB_DISPLAY_NAME" ) // ConfigureSeedJobs configures and triggers seed job pipeline for every Jenkins.Spec.SeedJobs entry func ConfigureSeedJobs(jenkinsClient jenkins.Jenkins, k8sClient k8s.Client, jenkins *virtuslabv1alpha1.Jenkins) error { err := configureSeedJobsPipeline(jenkinsClient) if err != nil { return err } seedJobs := jenkins.Spec.SeedJobs for _, seedJob := range seedJobs { privateKey, err := extractPrivateKey(k8sClient, jenkins.Namespace, seedJob) if err != nil { return err } err = triggerConfigureSeedJobsPipeline( jenkinsClient, seedJob.ID, privateKey, seedJob.RepositoryURL, seedJob.RepositoryBranch, seedJob.Targets, fmt.Sprintf("Seed Job from %s", seedJob.ID)) if err != nil { return err } } return nil } // configureSeedJobsPipeline configures seed jobs and deploy keys func configureSeedJobsPipeline(jenkinsClient jenkins.Jenkins) error { // FIXME(bantoniak) implement CreateOrUpdateJob() _, err := jenkinsClient.CreateJob(seedJobConfigXML, ConfigureSeedJobsName) if err != nil && strings.Contains(err.Error(), "A job already exists") { // skip, job already exists return nil } return err } // triggerConfigureSeedJobsPipeline triggers and configures seed job for specific GitHub repository func triggerConfigureSeedJobsPipeline(jenkinsClient jenkins.Jenkins, deployKeyID, privateKey, repositoryURL, repositoryBranch, targets, displayName string) error { options := map[string]string{ deployKeyIDParameterName: deployKeyID, privateKeyParameterName: privateKey, repositoryURLParameterName: repositoryURL, repositoryBranchParameterName: repositoryBranch, targetsParameterName: targets, displayNameParameterName: displayName, } // FIXME(bantoniak) implement EnsureJob() _, err := jenkinsClient.BuildJob(ConfigureSeedJobsName, options) if err != nil { return err } return nil } func extractPrivateKey(k8sClient k8s.Client, namespace string, seedJob virtuslabv1alpha1.SeedJob) (string, error) { if seedJob.PrivateKey.SecretKeyRef != nil { deployKeySecret := &v1.Secret{} namespaceName := types.NamespacedName{Namespace: namespace, Name: seedJob.PrivateKey.SecretKeyRef.Name} err := k8sClient.Get(context.TODO(), namespaceName, deployKeySecret) if err != nil { return "", err } return string(deployKeySecret.Data[seedJob.PrivateKey.SecretKeyRef.Key]), nil } return "", nil } // FIXME use mask-password plugin for params.PRIVATE_KEY var seedJobConfigXML = ` false DEPLOY_KEY_ID false PRIVATE_KEY REPOSITORY_URL false REPOSITORY_BRANCH master false SEED_JOB_DISPLAY_NAME false TARGETS cicd/jobs/*.jenkins false false false `