Previously, gerrit-queue used statik to embed files. Since go1.16, we have go:embed, which solves this much nicer, without any requirements to have the statik binary around. As the only other thing the shell.nix and .envrc plumbing did was bring a version of Go in scope, it's dropped now. We assume to have a recent-enough go binary around, else go will complain. Imported from https://github.com/flokli/gerrit-queue/pull/9 Change-Id: I851b06777a29d4f2d955cf3a7db6455a7189bc46 Reviewed-on: https://cl.tvl.fyi/c/depot/+/4329 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in> Autosubmit: tazjin <mail@tazj.in>
		
			
				
	
	
		
			137 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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?
 | |
| }
 |