/
worker.go
90 lines (77 loc) · 2.01 KB
/
worker.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package main
import (
"os"
"os/signal"
"runtime"
"syscall"
"github.com/codegangsta/cli"
"github.com/remind101/conveyor"
"github.com/remind101/conveyor/builder/docker"
)
// flags for the worker.
var workerFlags = []cli.Flag{
cli.StringFlag{
Name: "github.token",
Value: "",
Usage: "GitHub API token to use when updating commit statuses and setting up webhooks on repositories.",
EnvVar: "GITHUB_TOKEN",
},
cli.BoolFlag{
Name: "dry",
Usage: "Enable dry run mode.",
EnvVar: "DRY",
},
cli.StringFlag{
Name: "builder.image",
Value: docker.DefaultBuilderImage,
Usage: "A docker image to use to perform the build.",
EnvVar: "BUILDER_IMAGE",
},
cli.StringFlag{
Name: "reporter",
Value: "",
Usage: "The reporter to use to report errors. Available options are `hb://api.honeybadger.io?key=<key>&environment=<environment>",
EnvVar: "REPORTER",
},
cli.IntFlag{
Name: "workers",
Value: runtime.NumCPU(),
Usage: "Number of workers in goroutines to start.",
EnvVar: "WORKERS",
},
cli.StringFlag{
Name: "stats",
Value: "",
Usage: "If provided, defines where build metrics are sent. Available options are dogstatsd://<host>",
EnvVar: "STATS",
},
}
var cmdWorker = cli.Command{
Name: "worker",
Usage: "Run a set of workers.",
Action: workerAction,
Flags: append(sharedFlags, workerFlags...),
}
func workerAction(c *cli.Context) {
q := newBuildQueue(c)
if err := runWorker(q, c); err != nil {
must(err)
}
}
func runWorker(q conveyor.BuildQueue, c *cli.Context) error {
numWorkers := c.Int("workers")
info("Starting %d workers\n", numWorkers)
ch := make(chan conveyor.BuildRequest)
q.Subscribe(ch)
workers := conveyor.NewWorkerPool(numWorkers, conveyor.WorkerOptions{
Builder: newBuilder(c),
Logger: newLogger(c),
BuildRequests: ch,
})
workers.Start()
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
sig := <-quit
info("Signal %d received. Shutting down workers.\n", sig)
return workers.Shutdown()
}