dagger-helm/dagger.go
2023-04-06 22:30:09 +02:00

75 lines
2.1 KiB
Go

package daggerhelm
import (
"context"
"fmt"
"os"
"path"
"text/template"
"dagger.io/dagger"
)
const CONTAINER_IMAGE = "docker.io/alpine/k8s:1.26.3"
func Compile(ctx context.Context, client *dagger.Client, chartPath string, valuesFilePath string) (*dagger.Directory, error) {
chart := client.Host().Directory(chartPath)
tmpdir := os.TempDir()
err := os.MkdirAll(tmpdir, 0755)
if err != nil {
return nil, fmt.Errorf("failed to create tmpdir: %v", err)
}
tmpvalues, err := os.CreateTemp(tmpdir, "")
if err != nil {
return nil, fmt.Errorf("could not create a tempdir. err: %v", err)
}
//defer func() {
// if _, err := os.Stat(tmpdir); !errors.Is(err, os.ErrNotExist) {
// err := os.RemoveAll(tmpdir)
// if err != nil {
// panic(err)
// }
// }
//}()
tmpl, err := template.New("helm-dagger").ParseFiles(valuesFilePath)
if err != nil {
return nil, fmt.Errorf("failed to build template for values.yaml, err: %v", err)
}
err = tmpl.Execute(tmpvalues, struct{}{})
if err != nil {
return nil, fmt.Errorf("failed to execute template. err: %v", err)
}
err = tmpvalues.Sync()
if err != nil {
return nil, fmt.Errorf("failed to write to tmpfile. err: %v", err)
}
files, err := os.ReadDir(tmpdir)
if err != nil {
return nil, fmt.Errorf("failed to read tmpdir. err: %v", err)
}
valuesFileDirPath := path.Dir(tmpdir)
valuesFileRelativePath := files[0].Name()
valuesFile := client.Host().Directory(valuesFileDirPath).File(valuesFileRelativePath)
helmoutput := client.Container().From(CONTAINER_IMAGE).WithWorkdir("/mnt").WithDirectory("chart", chart).WithFile("values.yaml", valuesFile).WithExec([]string{"helm", "template", ".", "--output-dir", "/mnt/output"})
if exitCode, err := helmoutput.ExitCode(ctx); err != nil || exitCode != 0 {
return nil, fmt.Errorf("failed to render helm chart: %v", err)
}
exported, err := helmoutput.Directory("/mnt/output").Export(ctx, "dist")
if err != nil {
return nil, fmt.Errorf("failed to export helm template: %v", err)
}
if !exported {
return nil, fmt.Errorf("nothing was exported")
}
return nil, nil
}