diff --git a/pkg/skaffold/runner/build_deploy.go b/pkg/skaffold/runner/build_deploy.go index c66db8ae5c6..3b04131af8f 100644 --- a/pkg/skaffold/runner/build_deploy.go +++ b/pkg/skaffold/runner/build_deploy.go @@ -79,12 +79,6 @@ func (r *SkaffoldRunner) Build(ctx context.Context, out io.Writer, artifacts []* return nil, err } - if !r.runCtx.SkipTests() { - if err = r.tester.Test(ctx, out, bRes); err != nil { - return nil, err - } - } - // Update which images are logged. r.addTagsToPodSelector(bRes) diff --git a/pkg/skaffold/runner/build_deploy_test.go b/pkg/skaffold/runner/build_deploy_test.go index 1a541e0a0a6..242cc2ee1c2 100644 --- a/pkg/skaffold/runner/build_deploy_test.go +++ b/pkg/skaffold/runner/build_deploy_test.go @@ -139,7 +139,10 @@ func TestBuildTestDeploy(t *testing.T) { runner := createRunner(t, test.testBench, nil, artifacts) bRes, err := runner.Build(ctx, ioutil.Discard, artifacts) if err == nil { - err = runner.DeployAndLog(ctx, ioutil.Discard, bRes) + err = runner.Test(ctx, ioutil.Discard, bRes) + if err == nil { + err = runner.DeployAndLog(ctx, ioutil.Discard, bRes) + } } t.CheckErrorAndDeepEqual(test.shouldErr, err, test.expectedActions, test.testBench.Actions()) diff --git a/pkg/skaffold/runner/dev.go b/pkg/skaffold/runner/dev.go index c50bccbec9d..a4f6c199e7c 100644 --- a/pkg/skaffold/runner/dev.go +++ b/pkg/skaffold/runner/dev.go @@ -102,11 +102,20 @@ func (r *SkaffoldRunner) doDev(ctx context.Context, out io.Writer, logger *kuber instrumentation.AddDevIteration("build") meterUpdated = true } - if _, err := r.Build(ctx, out, r.changeSet.needsRebuild); err != nil { - logrus.Warnln("Skipping deploy due to error:", err) + bRes, err := r.Build(ctx, out, r.changeSet.needsRebuild) + if err != nil { + logrus.Warnln("Skipping test and deploy due to build error:", err) event.DevLoopFailedInPhase(r.devIteration, sErrors.Build, err) return nil } + // TODO(modali): Add skipTest boolean to Tester itself to avoid this check. + if !r.runCtx.SkipTests() { + if err = r.Test(ctx, out, bRes); err != nil { + logrus.Warnln("Skipping deploy due to test error:", err) + event.DevLoopFailedInPhase(r.devIteration, sErrors.Build, err) + return nil + } + } } if needsDeploy { @@ -134,7 +143,7 @@ func (r *SkaffoldRunner) doDev(ctx context.Context, out io.Writer, logger *kuber return nil } -// Dev watches for changes and runs the skaffold build and deploy +// Dev watches for changes and runs the skaffold build, test and deploy // config until interrupted by the user. func (r *SkaffoldRunner) Dev(ctx context.Context, out io.Writer, artifacts []*latest.Artifact) error { event.DevLoopInProgress(r.devIteration) @@ -219,6 +228,12 @@ func (r *SkaffoldRunner) Dev(ctx context.Context, out io.Writer, artifacts []*la event.DevLoopFailedInPhase(r.devIteration, sErrors.Build, err) return fmt.Errorf("exiting dev mode because first build failed: %w", err) } + if !r.runCtx.SkipTests() { + if err = r.Test(ctx, out, bRes); err != nil { + event.DevLoopFailedInPhase(r.devIteration, sErrors.Build, err) + return fmt.Errorf("exiting dev mode because test failed after first build: %w", err) + } + } logger := r.createLogger(out, bRes) defer logger.Stop()