diff options
author | Terin Stock <terinjokes@gmail.com> | 2017-07-14 16:38:48 -0600 |
---|---|---|
committer | Terin Stock <terinjokes@gmail.com> | 2017-07-14 23:38:25 -0600 |
commit | d5b1fc4cea623a0d1699c9c2e693415ac69ca667 (patch) | |
tree | d56a1b3e9b4fa20aa6e710c413d2defa52581c95 | |
parent | 290e822a687e7d69def79d55dd7801447c804293 (diff) |
feat(main): run jobs in parallel
Ons systems with multiple CPUs, support running build jobs in parallel. This is currently a naive implementation, which only supports running `runtime.NumCPU()` jobs, with no additional configuration.
-rw-r--r-- | .travis.yml | 5 | ||||
-rw-r--r-- | Gopkg.lock | 15 | ||||
-rw-r--r-- | Gopkg.toml | 3 | ||||
-rw-r--r-- | main.go | 70 |
4 files changed, 62 insertions, 31 deletions
diff --git a/.travis.yml b/.travis.yml index 1de576e..48a19e9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,9 +2,10 @@ language: go go: - 1.8.x install: - - go get github.com/Masterminds/glide + - go get github.com/golang/dep/cmd/dep + - dep ensure script: - - go test -v $(glide nv) + - go test -v $(go list ./... | grep -v /vendor/) jobs: include: diff --git a/Gopkg.lock b/Gopkg.lock new file mode 100644 index 0000000..19691af --- /dev/null +++ b/Gopkg.lock @@ -0,0 +1,15 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + branch = "master" + name = "github.com/neelance/parallel" + packages = ["."] + revision = "4de9ce63d14c18517a79efe69e10e99d32c850c3" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "5cee123e66d33e8e63ab1f1a2ae68b744798e2093d92a855bfa52f7465b4c6ca" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml new file mode 100644 index 0000000..3e6859e --- /dev/null +++ b/Gopkg.toml @@ -0,0 +1,3 @@ +[[constraint]] + branch = "master" + name = "github.com/neelance/parallel" diff --git a/main.go b/main.go index d2ecf84..ea2942c 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,9 @@ import ( "os" "os/exec" "path/filepath" + "runtime" + + "github.com/neelance/parallel" ) type Arch string @@ -111,37 +114,46 @@ func main() { os.Exit(-1) } + parallelJobs := runtime.NumCPU() + par := parallel.NewRun(parallelJobs) + fmt.Printf("info: running bakelite with %d jobs\n", parallelJobs) + for _, platform := range platforms { for _, pkg := range packages { - name := fmt.Sprintf("%s-%s-%s", filepath.Base(pkg), platform.OS, platform.Arch) - env := kvs{ - "GOOS": string(platform.OS), - "GOARCH": string(platform.Arch), - "GOROOT": os.Getenv("GOROOT"), - "GOPATH": os.Getenv("GOPATH"), - } - - if cgo { - env["CGO_ENABLED"] = "1" - } else { - env["CGO_ENABLED"] = "0" - } - - var stdout bytes.Buffer - var stderr bytes.Buffer - - cmd := exec.CommandContext(context.Background(), "go", "build", "-o", name, pkg) - cmd.Env = env.Strings() - cmd.Stdout = &stdout - cmd.Stderr = &stderr - - fmt.Printf("info: Running build for %s @ %s/%s…\n", pkg, platform.OS, platform.Arch) - err := cmd.Run() - - if err != nil { - log.Printf("fatal: There was an error! err='%s' stdout='%s' stderr='%s'", err, stdout.String(), stderr.String()) - os.Exit(-1) - } + par.Acquire() + go func(platform Platform, pkg string) { + defer par.Release() + name := fmt.Sprintf("%s-%s-%s", filepath.Base(pkg), platform.OS, platform.Arch) + env := kvs{ + "GOOS": string(platform.OS), + "GOARCH": string(platform.Arch), + "GOROOT": os.Getenv("GOROOT"), + "GOPATH": os.Getenv("GOPATH"), + } + + if cgo { + env["CGO_ENABLED"] = "1" + } else { + env["CGO_ENABLED"] = "0" + } + + var stdout bytes.Buffer + var stderr bytes.Buffer + + cmd := exec.CommandContext(context.Background(), "go", "build", "-o", name, pkg) + cmd.Env = env.Strings() + cmd.Stdout = &stdout + cmd.Stderr = &stderr + + fmt.Printf("info: Running build for %s @ %s/%s…\n", pkg, platform.OS, platform.Arch) + err := cmd.Run() + + if err != nil { + log.Printf("fatal: There was an error! err='%s' stdout='%s' stderr='%s'", err, stdout.String(), stderr.String()) + os.Exit(-1) + } + }(platform, pkg) } } + par.Wait() } |