grim/convey

Parents 466f881e1593
Children a07b353c07e7
First stab and making sure the .config-XXXX directory is always cleaned up
  • +74 -19
    runner/cmd.go
  • --- a/runner/cmd.go Mon Oct 11 21:50:45 2021 -0500
    +++ b/runner/cmd.go Fri Oct 15 23:56:14 2021 -0500
    @@ -1,15 +1,21 @@
    package runner
    import (
    + "context"
    "fmt"
    "os"
    + "os/signal"
    "path/filepath"
    + "syscall"
    "time"
    + log "github.com/sirupsen/logrus"
    +
    "keep.imfreedom.org/grim/convey/config"
    "keep.imfreedom.org/grim/convey/environment"
    "keep.imfreedom.org/grim/convey/globals"
    "keep.imfreedom.org/grim/convey/logging"
    + "keep.imfreedom.org/grim/convey/plans"
    "keep.imfreedom.org/grim/convey/runtime"
    )
    @@ -23,6 +29,57 @@
    Plans []string `kong:"arg,help='The names of the plans to run',default='default'"`
    }
    +func (c *RunnerCmd) runPlan(name string, cfg *config.Config, plan plans.Plan) error {
    + configPath, _ := filepath.Split(c.ConfigFile)
    + if configPath == "" {
    + cwd, err := os.Getwd()
    + if err != nil {
    + return err
    + }
    +
    + configPath = cwd
    + }
    +
    + env := environment.New(c.Environment...)
    + rt := runtime.New(env, configPath, c.ForceSequential, c.KeepWorkspace, c.Timeout)
    + defer rt.Shutdown()
    +
    + configEnv := environment.New(cfg.Environment...)
    +
    + return plan.Execute(name, cfg.Tasks, configEnv, rt)
    +}
    +
    +func (c *RunnerCmd) runPlans(ctx context.Context, cfg *config.Config) error {
    + errChan := make(chan error, 1)
    +
    + cancelled := false
    +
    + go func() {
    + for _, name := range c.Plans {
    + plan := cfg.Plans[name]
    +
    + if err := c.runPlan(name, cfg, plan); err != nil {
    + errChan <- err
    + return
    + }
    +
    + if cancelled {
    + break
    + }
    + }
    + errChan <- nil
    + }()
    +
    + for {
    + select {
    + case err := <-errChan:
    + return err
    + case <-ctx.Done():
    + cancelled = true
    + }
    + }
    +}
    +
    func (c *RunnerCmd) Run(g *globals.Globals) error {
    logging.Setup(g.Color, g.Verbose)
    @@ -41,28 +98,26 @@
    return err
    }
    - configPath, _ := filepath.Split(c.ConfigFile)
    - if configPath == "" {
    - cwd, err := os.Getwd()
    - if err != nil {
    - return err
    - }
    + signalChan := make(chan os.Signal, 1)
    + signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill)
    - configPath = cwd
    - }
    + errChan := make(chan error, 1)
    +
    + ctx, cancel := context.WithCancel(context.Background())
    - env := environment.New(c.Environment...)
    - rt := runtime.New(env, configPath, c.ForceSequential, c.KeepWorkspace, c.Timeout)
    - defer rt.Shutdown()
    -
    - configEnv := environment.New(cfg.Environment...)
    + go func(ctx context.Context, cfg *config.Config) {
    + errChan <- c.runPlans(ctx, cfg)
    + }(ctx, cfg)
    - for _, name := range c.Plans {
    - plan := cfg.Plans[name]
    -
    - err := plan.Execute(name, cfg.Tasks, configEnv, rt)
    - if err != nil {
    - return err
    + for {
    + select {
    + case err := <-errChan:
    + if err != nil {
    + return err
    + }
    + case s := <-signalChan:
    + log.Infof("caught signal %s, exiting...", s)
    + cancel()
    }
    }