in command-runner/pkg/runner/shell_command_executor.go [38:118]
func newShellCommandExecutor(ctx context.Context, params *newShellCommandExecutorParams) (commandExecutor, error) {
mceDir, err := os.MkdirTemp(fs.TmpDir(), "mce")
if err != nil {
return nil, err
}
closeExecutors := []common.Executor{}
for _, filemap := range params.FileMaps {
switch filemap.Type {
case FileMapTypeCopyOut:
closeExecutors = append(closeExecutors, copyOut(ctx, mceDir, params.WorkingDir, filemap))
case FileMapTypeBind:
// treat bind mount as symlink
if err := symlink(mceDir, params.WorkingDir, filemap); err != nil {
return nil, err
}
case FileMapTypeCopyIn:
if err := copyDir(
ctx,
resolvePath(filemap.TargetPath, mceDir),
resolvePath(filemap.SourcePath, params.WorkingDir),
false,
); err != nil {
return nil, err
}
case FileMapTypeCopyInWithGitignore:
if err := copyDir(
ctx,
resolvePath(filemap.TargetPath, mceDir),
resolvePath(filemap.SourcePath, params.WorkingDir),
true,
); err != nil {
return nil, err
}
default:
return nil, fmt.Errorf("unknown filemap Type")
}
}
closeExecutors = append(closeExecutors, setOutputs(mceDir, params.Stdout))
closeExecutors = append(closeExecutors, func(ctx context.Context) error {
log.Debug().Msgf("close() is removing %s", mceDir)
return os.RemoveAll(mceDir)
})
env := make([]string, 0)
var defaultDir string
if params.Env != nil {
for k, v := range params.Env {
if strings.HasPrefix(k, "CATALYST_SOURCE_DIR_") {
v = resolvePath(v, mceDir)
if k == "CATALYST_SOURCE_DIR_WorkflowSource" || defaultDir == "" {
defaultDir = v
}
}
env = append(env, fmt.Sprintf("%s=%s", k, interpolate(v, params.Env)))
}
}
if defaultDir == "" {
defaultDir = params.WorkingDir
}
env = append(env, fmt.Sprintf("PATH=%s", os.Getenv("PATH")))
env = append(env, fmt.Sprintf("CATALYST_DEFAULT_DIR=%s", defaultDir))
if err := os.WriteFile(filepath.Join(mceDir, "env.sh"), []byte(""), 00666); err != nil /* #nosec G306 */ {
return nil, err
}
if err := os.WriteFile(filepath.Join(mceDir, "dir.txt"), []byte(defaultDir), 00644); err != nil /* #nosec G306 */ {
return nil, err
}
return &shellCommandExecutor{
Stdout: params.Stdout,
Stderr: params.Stderr,
WorkingDir: defaultDir,
Env: env,
CloseExecutors: closeExecutors,
mceDir: mceDir,
ctx: ctx,
}, nil
}