in command-runner/pkg/runner/shell_command_executor.go [128:177]
func (sce *shellCommandExecutor) ExecuteCommand(ctx context.Context, command Command) error {
script := fmt.Sprintf(`
MCE_DIR=%s
cd $(cat ${MCE_DIR}/dir.txt)
set -a
. ${MCE_DIR}/env.sh
%s
CODEBUILD_LAST_EXIT=$?
export -p > ${MCE_DIR}/env.sh
pwd > ${MCE_DIR}/dir.txt
exit $CODEBUILD_LAST_EXIT`, sce.mceDir, strings.Join(command, " "))
scriptName := fmt.Sprintf("script-%d.sh", time.Now().UnixNano())
scriptPath := filepath.Join(sce.mceDir, scriptName)
if err := os.WriteFile(scriptPath, []byte(script), 00755); err != nil /* #nosec G306 */ {
return err
}
cmd := exec.CommandContext(ctx, "/bin/sh", scriptPath) //#nosec G204
cmd.Stdin = nil
cmd.Dir = sce.WorkingDir
cmd.Env = sce.Env
log.Debug().Msgf("ExecuteCommand: path=%s args=%s dir=%s env=%#v script=%s", cmd.Path, cmd.Args, cmd.Dir, cmd.Env, script)
stdout, err := cmd.StdoutPipe()
if err != nil {
return err
}
stderr, err := cmd.StderrPipe()
if err != nil {
return err
}
log.Ctx(ctx).Debug().Msgf("%s shell run command=%+v workdir=%s", logPrefix, cmd, sce.WorkingDir)
if common.Dryrun(ctx) {
log.Ctx(ctx).Debug().Msgf("exit for dryrun")
return nil
}
if err := cmd.Start(); err != nil {
return err
}
if sce.Stdout != nil {
go streamPipe(sce.Stdout, stdout)
}
if sce.Stderr != nil {
go streamPipe(sce.Stderr, stderr)
}
return cmd.Wait()
}