github.com/octohelm/wagon@v0.0.0-20240308040401-88662650dc0b/pkg/engine/plan/task/container_run.go (about) 1 package task 2 3 import ( 4 "context" 5 "sort" 6 "time" 7 8 "dagger.io/dagger" 9 "github.com/octohelm/wagon/pkg/engine/daggerutil" 10 "github.com/octohelm/wagon/pkg/engine/plan/task/core" 11 ) 12 13 func init() { 14 core.DefaultFactory.Register(&Run{}) 15 } 16 17 type Run struct { 18 core.Task 19 20 Input core.FS `json:"input"` 21 Config core.ImageConfig `json:"config"` 22 23 Mounts map[string]core.Mount `json:"mounts"` 24 Env map[string]core.SecretOrString `json:"env"` 25 Workdir string `json:"workdir,omitempty" default:"/"` 26 User string `json:"user,omitempty" default:"root:root"` 27 Always bool `json:"always,omitempty"` 28 Entrypoint []string `json:"entrypoint,omitempty"` 29 Command struct { 30 Name string `json:"name"` 31 Args []string `json:"args"` 32 Flags map[string]core.StringOrBool `json:"flags"` 33 } `json:"command,omitempty"` 34 35 Output core.FS `json:"-" wagon:"generated,name=output"` 36 } 37 38 func (e *Run) Do(ctx context.Context) error { 39 return daggerutil.Do(ctx, func(c *dagger.Client) error { 40 ct := c.Container(). 41 WithRootfs(e.Input.LoadDirectory(c)) 42 43 ct = e.Config.ApplyTo(ct) 44 45 for n := range e.Mounts { 46 ct = e.Mounts[n].MountTo(c, ct) 47 } 48 49 for k := range e.Env { 50 if envVar := e.Env[k]; envVar.Secret != nil { 51 ct = ct.WithSecretVariable(k, c.LoadSecretFromID(envVar.Secret.SecretID())) 52 } else { 53 ct = ct.WithEnvVariable(k, envVar.Value) 54 } 55 } 56 57 if workdir := e.Workdir; workdir != "" { 58 ct = ct.WithWorkdir(workdir) 59 } 60 61 if user := e.User; user != "" { 62 ct = ct.WithUser(user) 63 } 64 65 if entrypoint := e.Entrypoint; len(entrypoint) > 0 { 66 ct = ct.WithEntrypoint(entrypoint) 67 } 68 69 if e.Always { 70 // disable cache 71 ct = ct.WithEnvVariable("__WAGON_EXEC_STARTED_AT", time.Now().String()) 72 } 73 74 args := make([]string, 0) 75 if name := e.Command.Name; name != "" { 76 args = append(args, name) 77 78 flagNames := make([]string, 0) 79 for flag := range e.Command.Flags { 80 flagNames = append(flagNames, flag) 81 } 82 sort.Strings(flagNames) 83 84 for _, flag := range flagNames { 85 v := e.Command.Flags[flag] 86 if v.Bool != nil { 87 args = append(args, flag) 88 } else { 89 args = append(args, flag, v.String) 90 } 91 } 92 93 args = append(args, e.Command.Args...) 94 } 95 96 ct = ct.WithExec(args) 97 98 return e.Output.SetDirectoryIDBy(ctx, ct.Rootfs()) 99 }) 100 }