1

I'm trying to write some code for a webhook, that will call go install. The problem i'm having is that the GOPATH isn't set when i call any go commands with exec.Command

func exec_cmd(w http.ResponseWriter, cmd string, args ...string) {
    command := exec.Command(cmd, args...)
    var out bytes.Buffer
    var stderr bytes.Buffer
    command.Stdout = &out
    command.Stderr = &stderr
    err := command.Run()
    if err != nil {
        errstring := fmt.Sprintf(fmt.Sprint(err) + ": " + stderr.String())
        io.WriteString(w, errstring)
    }
    io.WriteString(w, out.String())
    fmt.Println(out.String())
}

func webhook(w http.ResponseWriter, r *http.Request) {
    exec_cmd(w, "go", "install", "github.com/me/myrepo/mything")
}

func test(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "test")
}

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/webhook", webhook)
    mux.HandleFunc("/", test)
    http.ListenAndServe(":8000", mux)
}

when the webhook endpoint is hit, it gives:

exit status 1: can't load package: package github.com/me/myrepo/mything: cannot find package "github.com/me/myrepo/mything" in any of:
    /usr/lib/go-1.6/src/github.com/me/myrepo/mything (from $GOROOT)
    ($GOPATH not set)

How would i go about making sure the GOPATH is set in this context?

If i run "go install github.com/me/myrepo/mything" from the command line, it works fine.

2
  • 2
    Fill Env in golang.org/pkg/os/exec/#Cmd. Commented Mar 21, 2017 at 11:59
  • 1
    You should also update your version of Go, if only because go1.8 introduced a default GOPATH. Commented Mar 21, 2017 at 22:28

1 Answer 1

2

Are you running this in your editor context, or in a container perhaps? It won't work in a context without the GOPATH env variable set.

If running with go run main.go, does it work? It works for me in that context without modifying your code. As long as the parent context has access to GOPATH it should. You could alternatively set it manually with something like this:

command.Env = append(os.Environ(), "GOPATH=/tmp/go")

Or you could set GOPATH (for install) and PATH (for go,git cmds) in the context this process will run in (probably preferable), for example in a systemd unit file.

Sign up to request clarification or add additional context in comments.

1 Comment

setting the Env is working perfectly now, thanks. Setting it in systemd process file is probably better though, i didn't realise i could do that.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.