package jenkins
import (
"embed"
"fmt"
"html/template"
"io"
"os"
"freeleaps.com/gitops/initializer/api/v1alpha1"
)
//go:embed templates/*
var embeddedTemplates embed.FS
type JenkinsfileGenerator struct {
io.Closer
Instance *v1alpha1.ProjectInitialize
workingDir string
generated bool
}
const leftDelim = "[["
const rightDelim = "]]"
func (jg *JenkinsfileGenerator) prepareWorkingDir() error {
path, err := os.MkdirTemp("", fmt.Sprintf("jenkinsfile-gen-%s-*", jg.Instance.Name))
if err != nil {
return fmt.Errorf("failed to create jenkinsfile generator temp dir: %w", err)
}
jg.workingDir = path
return nil
}
func (jg *JenkinsfileGenerator) readTemplate(name string) (*template.Template, error) {
tpl := template.New(name)
templateBytes, err := embeddedTemplates.ReadFile(name)
if err != nil {
return nil, fmt.Errorf("failed to read template %s: %w", name, err)
}
tpl, err = tpl.
Delims(leftDelim, rightDelim).
Parse(string(templateBytes))
if err != nil {
return nil, fmt.Errorf("failed to parse template %s: %w", name, err)
}
return tpl, nil
}
func (jg *JenkinsfileGenerator) Generate() error {
if jg.Instance == nil {
return fmt.Errorf("instance is nil")
}
if err := jg.prepareWorkingDir(); err != nil {
return err
}
tpl, err := jg.readTemplate("templates/Jenkinsfile.tpl")
if err != nil {
return err
}
jenkinsfileFd, err := os.Create(jg.workingDir + "/Jenkinsfile")
if err != nil {
return fmt.Errorf("failed to create Jenkinsfile: %w", err)
}
defer jenkinsfileFd.Close()
if err := tpl.Execute(jenkinsfileFd, jg.Instance.Spec); err != nil {
return fmt.Errorf("failed to render Jenkinsfile with template: %w", err)
}
jg.generated = true
return nil
}
func (jg *JenkinsfileGenerator) Close() error {
if jg.workingDir != "" {
return os.RemoveAll(jg.workingDir)
}
return nil
}
func (jg *JenkinsfileGenerator) ReadGeneratedJenkinsfile() ([]byte, error) {
if !jg.generated {
return nil, fmt.Errorf("jenkinsfile not generated")
}
jenkinsfileBytes, err := os.ReadFile(jg.workingDir + "/Jenkinsfile")
if err != nil {
return nil, fmt.Errorf("failed to read generated Jenkinsfile: %w", err)
}
return jenkinsfileBytes, nil
}