diff options
Diffstat (limited to 'third_party/gerrit-queue/main.go')
-rw-r--r-- | third_party/gerrit-queue/main.go | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/third_party/gerrit-queue/main.go b/third_party/gerrit-queue/main.go new file mode 100644 index 000000000000..d8577dad507e --- /dev/null +++ b/third_party/gerrit-queue/main.go @@ -0,0 +1,139 @@ +//go:generate statik -f + +package main + +import ( + "os" + "time" + + "net/http" + + "github.com/tweag/gerrit-queue/frontend" + "github.com/tweag/gerrit-queue/gerrit" + "github.com/tweag/gerrit-queue/misc" + "github.com/tweag/gerrit-queue/submitqueue" + + "github.com/urfave/cli" + + "github.com/apex/log" + "github.com/apex/log/handlers/multi" + "github.com/apex/log/handlers/text" +) + +func main() { + var URL, username, password, projectName, branchName string + var fetchOnly bool + var triggerInterval int + + app := cli.NewApp() + app.Name = "gerrit-queue" + + app.Flags = []cli.Flag{ + cli.StringFlag{ + Name: "url", + Usage: "URL to the gerrit instance", + EnvVar: "GERRIT_URL", + Destination: &URL, + Required: true, + }, + cli.StringFlag{ + Name: "username", + Usage: "Username to use to login to gerrit", + EnvVar: "GERRIT_USERNAME", + Destination: &username, + Required: true, + }, + cli.StringFlag{ + Name: "password", + Usage: "Password to use to login to gerrit", + EnvVar: "GERRIT_PASSWORD", + Destination: &password, + Required: true, + }, + cli.StringFlag{ + Name: "project", + Usage: "Gerrit project name to run the submit queue for", + EnvVar: "GERRIT_PROJECT", + Destination: &projectName, + Required: true, + }, + cli.StringFlag{ + Name: "branch", + Usage: "Destination branch", + EnvVar: "GERRIT_BRANCH", + Destination: &branchName, + Value: "master", + }, + cli.IntFlag{ + Name: "trigger-interval", + Usage: "How often we should trigger ourselves (interval in seconds)", + EnvVar: "SUBMIT_QUEUE_TRIGGER_INTERVAL", + Destination: &triggerInterval, + Value: 600, + }, + cli.BoolFlag{ + Name: "fetch-only", + Usage: "Only fetch changes and assemble queue, but don't actually write", + EnvVar: "SUBMIT_QUEUE_FETCH_ONLY", + Destination: &fetchOnly, + }, + } + + rotatingLogHandler := misc.NewRotatingLogHandler(10000) + l := &log.Logger{ + Handler: multi.New( + text.New(os.Stderr), + rotatingLogHandler, + ), + Level: log.DebugLevel, + } + + app.Action = func(c *cli.Context) error { + gerrit, err := gerrit.NewClient(l, URL, username, password, projectName, branchName) + if err != nil { + return err + } + log.Infof("Successfully connected to gerrit at %s", URL) + + runner := submitqueue.NewRunner(l, gerrit) + + handler := frontend.MakeFrontend(rotatingLogHandler, gerrit, runner) + + // fetch only on first run + err = runner.Trigger(fetchOnly) + if err != nil { + log.Error(err.Error()) + } + + // ticker + go func() { + for { + time.Sleep(time.Duration(triggerInterval) * time.Second) + err = runner.Trigger(fetchOnly) + if err != nil { + log.Error(err.Error()) + } + } + }() + + server := http.Server{ + Addr: ":8080", + Handler: handler, + } + + server.ListenAndServe() + if err != nil { + log.Fatalf(err.Error()) + } + + return nil + } + + err := app.Run(os.Args) + if err != nil { + log.Fatal(err.Error()) + } + + // TODOS: + // - handle event log, either by accepting webhooks, or by streaming events? +} |