func()

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()
}