in kinder/ci/tools/update-workflows/pkg/workflows.go [32:134]
func processWorkflows(settings *Settings, cfg *jobGroup, oldestVer, minVer *versionutil.Version) error {
log.Infof("processing workflows for jobGroup %q", cfg.Name)
var err error
var tBytes []byte
var templateWorkflow, templateFileName *template.Template
tPath := cfg.KinderWorkflowSpec.Template
// in case the template path is not defined, assume this job group has a single task file
if len(cfg.KinderWorkflowSpec.Template) == 0 {
goto copyAdditionalFiles
}
// prepare the workflow template
if !path.IsAbs(tPath) {
tPath = filepath.Join(filepath.Dir(settings.PathConfig), tPath)
}
tBytes, err = ioutil.ReadFile(tPath)
if err != nil {
return err
}
templateWorkflow, err = template.New("workflow-template").Funcs(template.FuncMap{
"dashVer": dashVer,
"ciLabelFor": ciLabelFor,
}).Parse(string(tBytes))
if err != nil {
return err
}
// prepare output file name template
templateFileName, err = template.New("file-name").Parse(cfg.KinderWorkflowSpec.TargetFile)
if err != nil {
return err
}
for i, job := range cfg.Jobs {
log.Infof("processing Job index %d, %#v", i, job)
if skipVersion(oldestVer, minVer, job.KubernetesVersion) {
log.Infof("skipping Job index %d, %#v", i, job)
continue
}
// prepare variables for template replacement
vars := templateVars{
KubernetesVersion: job.KubernetesVersion,
KubeadmVersion: job.KubeadmVersion,
KubeletVersion: job.KubeletVersion,
InitVersion: job.InitVersion,
TargetFile: cfg.TestInfraJobSpec.TargetFile,
}
// prepare skip versions
if len(job.SkipVersions) != 0 {
vars.SkipVersions, err = parseSkipVersions(settings.KubernetesVersion, job.SkipVersions)
if err != nil {
return errors.Wrapf(err, "malformed SkipVersions %v", job.SkipVersions)
}
}
// execute templates
buf := bytes.Buffer{}
if err := templateWorkflow.Execute(&buf, vars); err != nil {
return err
}
str := buf.String()
str = strings.ReplaceAll(str, "\\{", "{") // unescape existing template vars
str = strings.ReplaceAll(str, "\\}", "}")
buf.Reset()
if err := templateFileName.Execute(&buf, vars); err != nil {
return err
}
// add header and write output file
outPath := filepath.Join(settings.PathWorkflows, buf.String())
log.Infof("writing %q", outPath)
str = autogeneratedHeader + "\n" + str
if err := ioutil.WriteFile(outPath, []byte(str), 0664); err != nil {
return err
}
}
copyAdditionalFiles:
for _, taskFile := range cfg.KinderWorkflowSpec.AdditionalFiles {
outPath := filepath.Join(settings.PathWorkflows, path.Base(taskFile))
inPath := taskFile
if !path.IsAbs(inPath) {
inPath = filepath.Join(filepath.Dir(settings.PathConfig), taskFile)
}
log.Infof("copying %q to %q", inPath, settings.PathWorkflows)
taskBytes, err := ioutil.ReadFile(inPath)
if err != nil {
return err
}
// add header and write
str := autogeneratedHeader + "\n" + string(taskBytes)
if err := ioutil.WriteFile(outPath, []byte(str), 0644); err != nil {
return err
}
}
return nil
}