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  }