diff --git a/pkg/controller/jenkins/groovy/doc.go b/pkg/controller/jenkins/groovy/doc.go new file mode 100644 index 00000000..5ac19494 --- /dev/null +++ b/pkg/controller/jenkins/groovy/doc.go @@ -0,0 +1,2 @@ +// Package groovy implements groovy scripts execution via Jenkins Job +package groovy diff --git a/pkg/controller/jenkins/groovy/groovy.go b/pkg/controller/jenkins/groovy/groovy.go new file mode 100644 index 00000000..7db956ba --- /dev/null +++ b/pkg/controller/jenkins/groovy/groovy.go @@ -0,0 +1,96 @@ +package groovy + +import ( + "crypto/sha256" + "encoding/base64" + + virtuslabv1alpha1 "github.com/VirtusLab/jenkins-operator/pkg/apis/virtuslab/v1alpha1" + jenkinsclient "github.com/VirtusLab/jenkins-operator/pkg/controller/jenkins/client" + "github.com/VirtusLab/jenkins-operator/pkg/controller/jenkins/jobs" + + "github.com/go-logr/logr" + k8s "sigs.k8s.io/controller-runtime/pkg/client" +) + +const ( + // ExecuteGroovyJobName this is the fixed execute groovy job name + ExecuteGroovyJobName = "Execute Groovy Scripts" + + groovyScriptParameterName = "GROOVY_SCRIPT" +) + +// Groovy defines API for groovy scripts execution via jenkins job +type Groovy struct { + jenkinsClient jenkinsclient.Jenkins + k8sClient k8s.Client + logger logr.Logger +} + +// New creates new instance of Groovy +func New(jenkinsClient jenkinsclient.Jenkins, k8sClient k8s.Client, logger logr.Logger) *Groovy { + return &Groovy{ + jenkinsClient: jenkinsClient, + k8sClient: k8sClient, + logger: logger, + } +} + +// ConfigureGroovyJob configures jenkins job for executing groovy scripts +func (g *Groovy) ConfigureGroovyJob() error { + _, err := g.jenkinsClient.CreateOrUpdateJob(groovyJobConfigXML, ExecuteGroovyJobName) + if err != nil { + return err + } + return nil +} + +// EnsureGroovyJob executes groovy script and verifies jenkins job status according to reconciliation loop lifecycle +// see https://wiki.jenkins.io/display/JENKINS/Jenkins+Script+Console +func (g *Groovy) EnsureGroovyJob(groovyScript string, jenkins *virtuslabv1alpha1.Jenkins) (bool, error) { + jobsClient := jobs.New(g.jenkinsClient, g.k8sClient, g.logger) + + hash := sha256.New() + hash.Write([]byte(groovyScript)) + encodedHash := base64.URLEncoding.EncodeToString(hash.Sum(nil)) + + parameters := map[string]string{ + groovyScriptParameterName: groovyScript, + } + + done, err := jobsClient.EnsureBuildJob(ExecuteGroovyJobName, encodedHash, parameters, jenkins, true) + if err != nil { + return false, err + } + return done, nil +} + +var groovyJobConfigXML = ` + + + + false + + + + + GROOVY_SCRIPT + + + false + + + + + + + false + + + false + +`