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  }