github.com/octohelm/wagon@v0.0.0-20240308040401-88662650dc0b/pkg/engine/plan/task/container_exec.go (about) 1 package task 2 3 import ( 4 "context" 5 "time" 6 7 "dagger.io/dagger" 8 "github.com/octohelm/wagon/pkg/engine/daggerutil" 9 "github.com/octohelm/wagon/pkg/engine/plan/task/core" 10 ) 11 12 func init() { 13 core.DefaultFactory.Register(&Exec{}) 14 } 15 16 type Exec struct { 17 core.Task 18 19 Input core.FS `json:"input"` 20 Mounts map[string]core.Mount `json:"mounts"` 21 Env map[string]core.SecretOrString `json:"env"` 22 Workdir string `json:"workdir" default:"/"` 23 Args []string `json:"args"` 24 User string `json:"user" default:"root:root"` 25 Always bool `json:"always,omitempty"` 26 27 Output core.FS `json:"-" wagon:"generated,name=output"` 28 } 29 30 func (e *Exec) Do(ctx context.Context) error { 31 return daggerutil.Do(ctx, func(c *dagger.Client) error { 32 ct := c.Container().WithRootfs(e.Input.LoadDirectory(c)) 33 34 if workdir := e.Workdir; workdir != "" { 35 ct = ct.WithWorkdir(workdir) 36 } 37 38 if user := e.User; user != "" { 39 ct = ct.WithUser(user) 40 } 41 42 for n := range e.Mounts { 43 ct = e.Mounts[n].MountTo(c, ct) 44 } 45 46 for k := range e.Env { 47 if envVar := e.Env[k]; envVar.Secret != nil { 48 ct = ct.WithSecretVariable(k, c.LoadSecretFromID(envVar.Secret.SecretID())) 49 } else { 50 ct = ct.WithEnvVariable(k, envVar.Value) 51 } 52 } 53 54 if e.Always { 55 // disable cache 56 ct = ct.WithEnvVariable("__WAGON_EXEC_STARTED_AT", time.Now().String()) 57 } 58 59 ct = ct.WithExec(e.Args) 60 61 return e.Output.SetDirectoryIDBy(ctx, ct.Rootfs()) 62 }) 63 }