From 43e6677600e5a754a078beeda02d0d27a3db33d8 Mon Sep 17 00:00:00 2001 From: Marcin Ciszak Date: Fri, 18 Jun 2021 12:52:41 +0100 Subject: [PATCH] Dev command environments handling fix (#576) * Fixes `dev` command so that all environments are rendered by default. When in skaffold mode, then it locks to a specified environment, or `dev` if none provided. * Fixes skaffold#UpdateBuildArtifacts function to ensure that nil and empty slices are handled correctly before comparison Co-authored-by: marcinc --- cmd/kev/cmd/dev.go | 3 ++- pkg/kev/dev.go | 23 ++++++++++++++++++----- pkg/kev/skaffold.go | 7 ++++++- pkg/kev/skaffold_test.go | 17 +++++++++++++++++ 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/cmd/kev/cmd/dev.go b/cmd/kev/cmd/dev.go index daaac368..897758a8 100644 --- a/cmd/kev/cmd/dev.go +++ b/cmd/kev/cmd/dev.go @@ -139,7 +139,8 @@ func runDevCmd(cmd *cobra.Command, _ []string) error { eventHandler := func(e kev.RunnerEvent, r kev.Runner) error { return nil } var envs []string - if len(kevenv) > 0 { + if len(kevenv) > 0 && skaffold { + // when in --skaffold mode - only watch, render and deploy a specified environment envs = append(envs, kevenv) } diff --git a/pkg/kev/dev.go b/pkg/kev/dev.go index c60c832e..7e67e67e 100644 --- a/pkg/kev/dev.go +++ b/pkg/kev/dev.go @@ -22,6 +22,7 @@ import ( "io" "os" "os/signal" + "regexp" "syscall" "github.com/appvia/kev/pkg/kev/log" @@ -65,16 +66,23 @@ func (r *DevRunner) Run() error { r.UI.Output("[development mode] ... watching for changes - press Ctrl+C to stop", kmd.WithStyle(kmd.LogStyle)) r.DisplaySkaffoldOptionsIfAvailable() - runPreCommands := func() error { + runPreCommands := func(envs []string) error { sg := r.UI.StepGroup() defer sg.Done() - step := sg.Add(fmt.Sprintf("Running render for environment: %s", r.config.Envs[0])) + var msg string + if len(envs) == 0 { + msg = "Running render for all environments" + } else { + msg = fmt.Sprintf("Running render for environment: %s", envs[0]) + } + + step := sg.Add(msg) renderRunner = NewRenderRunner( r.WorkingDir, WithEventHandler(r.eventHandler), - WithEnvs(r.config.Envs), + WithEnvs(envs), WithUI(kmd.NoOpUI()), ) if _, err := renderRunner.Run(); err != nil { @@ -90,7 +98,7 @@ func (r *DevRunner) Run() error { defer close(change) // initial manifests generation for specified environments only - if err := runPreCommands(); err != nil { + if err := runPreCommands(r.config.Envs); err != nil { return err } @@ -133,6 +141,8 @@ func (r *DevRunner) Run() error { go r.Watch(change) + envRe := regexp.MustCompile(`^.*\.(.*)\.ya?ml$`) + for { ch := <-change if len(ch) > 0 { @@ -143,11 +153,14 @@ func (r *DevRunner) Run() error { kmd.WithStyle(kmd.LogStyle), ) + match := envRe.FindStringSubmatch(ch) + env := match[1] + if err := r.eventHandler(DevLoopIterated, r); err != nil { return newEventError(err, DevLoopIterated) } - _ = runPreCommands() + _ = runPreCommands([]string{env}) // empty the buffer as we only ever do one re-render cycle per a batch of changes if len(change) > 0 { diff --git a/pkg/kev/skaffold.go b/pkg/kev/skaffold.go index f990e78b..cd51b176 100644 --- a/pkg/kev/skaffold.go +++ b/pkg/kev/skaffold.go @@ -154,7 +154,9 @@ func UpdateSkaffoldBuildArtifacts(path string, project *ComposeProject) error { // true - when list of artefacts was updated, false - otherwise func (s *SkaffoldManifest) UpdateBuildArtifacts(analysis *Analysis, project *ComposeProject) bool { prevArts := s.Build.Artifacts - + if prevArts == nil { + prevArts = []*latest.Artifact{} + } sort.SliceStable(prevArts, func(i, j int) bool { return prevArts[i].ImageName < prevArts[j].ImageName }) @@ -162,6 +164,9 @@ func (s *SkaffoldManifest) UpdateBuildArtifacts(analysis *Analysis, project *Com s.SetBuildArtifacts(analysis, project) currArts := s.Build.Artifacts + if currArts == nil { + currArts = []*latest.Artifact{} + } sort.SliceStable(currArts, func(i, j int) bool { return currArts[i].ImageName < currArts[j].ImageName }) diff --git a/pkg/kev/skaffold_test.go b/pkg/kev/skaffold_test.go index 6c3ba532..a8448bf7 100644 --- a/pkg/kev/skaffold_test.go +++ b/pkg/kev/skaffold_test.go @@ -349,6 +349,23 @@ var _ = Describe("Skaffold", func() { Expect(images).ToNot(ContainElement("quay.io/myorg/svc2")) }) }) + + When("previous build artefacts were not defined (nil)", func() { + BeforeEach(func() { + skaffoldManifest.Build.Artifacts = nil + }) + + When("and current build artefacts were not detected (empty slice)", func() { + BeforeEach(func() { + analysis = nil + project.Services[0].Build = nil // reminder: images with no build context are excluded + }) + + It("returns false", func() { + Expect(changed).To(BeFalse()) + }) + }) + }) }) Describe("InjectProfiles", func() {