From 7ed278ce6afd7b8bd93dbf523a7582272b04f544 Mon Sep 17 00:00:00 2001 From: Ivan Mikheykin Date: Fri, 26 May 2023 12:08:32 +0300 Subject: [PATCH 1/2] fix: hide build log in export command - always print grouping frame for images - move log catching logic into Conveyor - add DeferBuildLog to ConveyorOptions - refactor ExportPhase into standalone Exporter - print log using logboek OutStream instead of fmt.Print Signed-off-by: Ivan Mikheykin --- cmd/werf/build/main.go | 5 +- cmd/werf/bundle/export/export.go | 32 ++++------- cmd/werf/bundle/publish/publish.go | 32 ++++------- cmd/werf/common/conveyor_options.go | 21 ++++++- cmd/werf/compose/main.go | 24 +++----- cmd/werf/converge/converge.go | 32 ++++------- cmd/werf/export/export.go | 34 +++++------ cmd/werf/helm/get_autogenerated_values.go | 2 +- cmd/werf/kube_run/kube_run.go | 23 +++----- cmd/werf/render/render.go | 36 ++++++------ cmd/werf/run/run.go | 23 +++----- cmd/werf/stage/image/main.go | 2 +- pkg/build/conveyor.go | 70 +++++++++++++---------- pkg/build/export_phase.go | 57 ++++++++---------- pkg/logging/main.go | 22 ------- 15 files changed, 184 insertions(+), 231 deletions(-) diff --git a/cmd/werf/build/main.go b/cmd/werf/build/main.go index c4ec171c23..5d729566ff 100644 --- a/cmd/werf/build/main.go +++ b/cmd/werf/build/main.go @@ -243,11 +243,14 @@ func run(ctx context.Context, containerBackend container_backend.ContainerBacken return err } - conveyorOptions, err := common.GetConveyorOptionsWithParallel(&commonCmdData, imagesToProcess, buildOptions) + conveyorOptions, err := common.GetConveyorOptionsWithParallel(ctx, &commonCmdData, imagesToProcess, buildOptions) if err != nil { return err } + // Always print logs. + conveyorOptions.DeferBuildLog = false + logboek.LogOptionalLn() conveyorWithRetry := build.NewConveyorWithRetryWrapper(werfConfig, giterminismManager, giterminismManager.ProjectDir(), projectTmpDir, ssh_agent.SSHAuthSock, containerBackend, storageManager, storageLockManager, conveyorOptions) diff --git a/cmd/werf/bundle/export/export.go b/cmd/werf/bundle/export/export.go index cb7bd23fee..743d6fae00 100644 --- a/cmd/werf/bundle/export/export.go +++ b/cmd/werf/bundle/export/export.go @@ -13,7 +13,6 @@ import ( "helm.sh/helm/v3/pkg/cli/values" "github.com/werf/logboek" - "github.com/werf/logboek/pkg/level" "github.com/werf/werf/cmd/werf/common" "github.com/werf/werf/pkg/build" "github.com/werf/werf/pkg/config" @@ -24,7 +23,6 @@ import ( "github.com/werf/werf/pkg/git_repo" "github.com/werf/werf/pkg/git_repo/gitdata" "github.com/werf/werf/pkg/image" - "github.com/werf/werf/pkg/logging" "github.com/werf/werf/pkg/ssh_agent" "github.com/werf/werf/pkg/storage/lrumeta" "github.com/werf/werf/pkg/storage/manager" @@ -290,7 +288,7 @@ func runExport(ctx context.Context, imagesToProcess build.ImagesToProcess) error imagesRepo = storageManager.GetServiceValuesRepo() - conveyorOptions, err := common.GetConveyorOptionsWithParallel(&commonCmdData, imagesToProcess, buildOptions) + conveyorOptions, err := common.GetConveyorOptionsWithParallel(ctx, &commonCmdData, imagesToProcess, buildOptions) if err != nil { return err } @@ -299,25 +297,19 @@ func runExport(ctx context.Context, imagesToProcess build.ImagesToProcess) error defer conveyorWithRetry.Terminate() if err := conveyorWithRetry.WithRetryBlock(ctx, func(c *build.Conveyor) error { - buildFunc := func(ctx context.Context) error { - if common.GetRequireBuiltImages(ctx, &commonCmdData) { - shouldBeBuiltOptions, err := common.GetShouldBeBuiltOptions(&commonCmdData, giterminismManager, werfConfig) - if err != nil { - return err - } - - return c.ShouldBeBuilt(ctx, shouldBeBuiltOptions) + if common.GetRequireBuiltImages(ctx, &commonCmdData) { + shouldBeBuiltOptions, err := common.GetShouldBeBuiltOptions(&commonCmdData, giterminismManager, werfConfig) + if err != nil { + return err } - return c.Build(ctx, buildOptions) - } - // Print build logs on error if --require-built-images is specified. - // Always print logs by default or if --log-verbose is specified. - requireBuiltImage := common.GetRequireBuiltImages(ctx, &commonCmdData) - isVerbose := logboek.Context(ctx).IsAcceptedLevel(level.Default) - deferLog := requireBuiltImage || !isVerbose - if err := logging.RunWithDeferredLog(ctx, deferLog, buildFunc); err != nil { - return err + if err := c.ShouldBeBuilt(ctx, shouldBeBuiltOptions); err != nil { + return err + } + } else { + if err := c.Build(ctx, buildOptions); err != nil { + return err + } } imagesInfoGetters, err = c.GetImageInfoGetters(image.InfoGetterOptions{CustomTagFunc: useCustomTagFunc}) diff --git a/cmd/werf/bundle/publish/publish.go b/cmd/werf/bundle/publish/publish.go index adf52f3516..c9cd4be6ad 100644 --- a/cmd/werf/bundle/publish/publish.go +++ b/cmd/werf/bundle/publish/publish.go @@ -15,7 +15,6 @@ import ( "helm.sh/helm/v3/pkg/cli/values" "github.com/werf/logboek" - "github.com/werf/logboek/pkg/level" "github.com/werf/werf/cmd/werf/common" "github.com/werf/werf/pkg/build" "github.com/werf/werf/pkg/config" @@ -27,7 +26,6 @@ import ( "github.com/werf/werf/pkg/git_repo" "github.com/werf/werf/pkg/git_repo/gitdata" "github.com/werf/werf/pkg/image" - "github.com/werf/werf/pkg/logging" "github.com/werf/werf/pkg/ssh_agent" "github.com/werf/werf/pkg/storage/lrumeta" "github.com/werf/werf/pkg/storage/manager" @@ -296,7 +294,7 @@ func runPublish(ctx context.Context, imagesToProcess build.ImagesToProcess) erro imagesRepo = storageManager.GetServiceValuesRepo() - conveyorOptions, err := common.GetConveyorOptionsWithParallel(&commonCmdData, imagesToProcess, buildOptions) + conveyorOptions, err := common.GetConveyorOptionsWithParallel(ctx, &commonCmdData, imagesToProcess, buildOptions) if err != nil { return err } @@ -305,25 +303,19 @@ func runPublish(ctx context.Context, imagesToProcess build.ImagesToProcess) erro defer conveyorWithRetry.Terminate() if err := conveyorWithRetry.WithRetryBlock(ctx, func(c *build.Conveyor) error { - buildFunc := func(ctx context.Context) error { - if common.GetRequireBuiltImages(ctx, &commonCmdData) { - shouldBeBuiltOptions, err := common.GetShouldBeBuiltOptions(&commonCmdData, giterminismManager, werfConfig) - if err != nil { - return err - } - - return c.ShouldBeBuilt(ctx, shouldBeBuiltOptions) + if common.GetRequireBuiltImages(ctx, &commonCmdData) { + shouldBeBuiltOptions, err := common.GetShouldBeBuiltOptions(&commonCmdData, giterminismManager, werfConfig) + if err != nil { + return err } - return c.Build(ctx, buildOptions) - } - // Print build logs on error if --require-built-images is specified. - // Always print logs by default or if --log-verbose is specified. - requireBuiltImage := common.GetRequireBuiltImages(ctx, &commonCmdData) - isVerbose := logboek.Context(ctx).IsAcceptedLevel(level.Default) - deferLog := requireBuiltImage || !isVerbose - if err := logging.RunWithDeferredLog(ctx, deferLog, buildFunc); err != nil { - return err + if err := c.ShouldBeBuilt(ctx, shouldBeBuiltOptions); err != nil { + return err + } + } else { + if err := c.Build(ctx, buildOptions); err != nil { + return err + } } imagesInfoGetters, err = c.GetImageInfoGetters(image.InfoGetterOptions{CustomTagFunc: useCustomTagFunc}) diff --git a/cmd/werf/common/conveyor_options.go b/cmd/werf/common/conveyor_options.go index 94df6918c1..87c1def160 100644 --- a/cmd/werf/common/conveyor_options.go +++ b/cmd/werf/common/conveyor_options.go @@ -7,6 +7,8 @@ import ( "strings" "text/template" + "github.com/werf/logboek" + "github.com/werf/logboek/pkg/level" "github.com/werf/werf/pkg/build" "github.com/werf/werf/pkg/build/stage" "github.com/werf/werf/pkg/config" @@ -18,7 +20,7 @@ import ( "github.com/werf/werf/pkg/storage" ) -func GetConveyorOptions(commonCmdData *CmdData, imagesToProcess build.ImagesToProcess) (build.ConveyorOptions, error) { +func GetConveyorOptions(ctx context.Context, commonCmdData *CmdData, imagesToProcess build.ImagesToProcess) (build.ConveyorOptions, error) { conveyorOptions := build.ConveyorOptions{ LocalGitRepoVirtualMergeOptions: stage.VirtualMergeOptions{ VirtualMerge: *commonCmdData.VirtualMerge, @@ -34,11 +36,24 @@ func GetConveyorOptions(commonCmdData *CmdData, imagesToProcess build.ImagesToPr conveyorOptions.TargetPlatforms = platforms } + conveyorOptions.DeferBuildLog = GetDeferredBuildLog(ctx, commonCmdData) + return conveyorOptions, nil } -func GetConveyorOptionsWithParallel(commonCmdData *CmdData, imagesToProcess build.ImagesToProcess, buildStagesOptions build.BuildOptions) (build.ConveyorOptions, error) { - conveyorOptions, err := GetConveyorOptions(commonCmdData, imagesToProcess) +// GetDeferredBuildLog returns true if build log should be catched and printed on error. +// Default rules are follows: +// - If --require-built-images is specified catch log and print on error. +// - Hide log messages if --log-quiet is specified. +// - Print "live" logs by default or if --log-verbose is specified. +func GetDeferredBuildLog(ctx context.Context, commonCmdData *CmdData) bool { + requireBuiltImage := GetRequireBuiltImages(ctx, commonCmdData) + isVerbose := logboek.Context(ctx).IsAcceptedLevel(level.Default) + return requireBuiltImage || !isVerbose +} + +func GetConveyorOptionsWithParallel(ctx context.Context, commonCmdData *CmdData, imagesToProcess build.ImagesToProcess, buildStagesOptions build.BuildOptions) (build.ConveyorOptions, error) { + conveyorOptions, err := GetConveyorOptions(ctx, commonCmdData, imagesToProcess) if err != nil { return conveyorOptions, err } diff --git a/cmd/werf/compose/main.go b/cmd/werf/compose/main.go index e39796ae1b..6f752859f3 100644 --- a/cmd/werf/compose/main.go +++ b/cmd/werf/compose/main.go @@ -11,7 +11,6 @@ import ( "github.com/spf13/cobra" "github.com/werf/logboek" - "github.com/werf/logboek/pkg/level" "github.com/werf/werf/cmd/werf/common" "github.com/werf/werf/pkg/build" "github.com/werf/werf/pkg/container_backend" @@ -19,7 +18,6 @@ import ( "github.com/werf/werf/pkg/git_repo/gitdata" "github.com/werf/werf/pkg/giterminism_manager" "github.com/werf/werf/pkg/image" - "github.com/werf/werf/pkg/logging" "github.com/werf/werf/pkg/ssh_agent" "github.com/werf/werf/pkg/storage/lrumeta" "github.com/werf/werf/pkg/storage/manager" @@ -402,7 +400,7 @@ func run(ctx context.Context, containerBackend container_backend.ContainerBacken logboek.Context(ctx).Info().LogOptionalLn() - conveyorOptions, err := common.GetConveyorOptions(&commonCmdData, imagesToProcess) + conveyorOptions, err := common.GetConveyorOptions(ctx, &commonCmdData, imagesToProcess) if err != nil { return err } @@ -411,20 +409,14 @@ func run(ctx context.Context, containerBackend container_backend.ContainerBacken defer conveyorWithRetry.Terminate() if err := conveyorWithRetry.WithRetryBlock(ctx, func(c *build.Conveyor) error { - buildFunc := func(ctx context.Context) error { - if common.GetRequireBuiltImages(ctx, &commonCmdData) { - return c.ShouldBeBuilt(ctx, build.ShouldBeBuiltOptions{}) + if common.GetRequireBuiltImages(ctx, &commonCmdData) { + if err := c.ShouldBeBuilt(ctx, build.ShouldBeBuiltOptions{}); err != nil { + return err + } + } else { + if err := c.Build(ctx, build.BuildOptions{SkipImageMetadataPublication: *commonCmdData.Dev}); err != nil { + return err } - return c.Build(ctx, build.BuildOptions{SkipImageMetadataPublication: *commonCmdData.Dev}) - } - - // Print build logs on error if --require-built-images is specified. - // Always print logs by default or if --log-verbose is specified. - requireBuiltImage := common.GetRequireBuiltImages(ctx, &commonCmdData) - isVerbose := logboek.Context(ctx).IsAcceptedLevel(level.Default) - deferLog := requireBuiltImage || !isVerbose - if err := logging.RunWithDeferredLog(ctx, deferLog, buildFunc); err != nil { - return err } for _, img := range c.GetExportedImages() { diff --git a/cmd/werf/converge/converge.go b/cmd/werf/converge/converge.go index 78170a3853..18baaad6ad 100644 --- a/cmd/werf/converge/converge.go +++ b/cmd/werf/converge/converge.go @@ -20,7 +20,6 @@ import ( "github.com/werf/kubedog/pkg/kube" "github.com/werf/logboek" - "github.com/werf/logboek/pkg/level" "github.com/werf/werf/cmd/werf/common" "github.com/werf/werf/pkg/build" "github.com/werf/werf/pkg/config/deploy_params" @@ -36,7 +35,6 @@ import ( "github.com/werf/werf/pkg/git_repo/gitdata" "github.com/werf/werf/pkg/giterminism_manager" "github.com/werf/werf/pkg/image" - "github.com/werf/werf/pkg/logging" "github.com/werf/werf/pkg/ssh_agent" "github.com/werf/werf/pkg/storage/lrumeta" "github.com/werf/werf/pkg/storage/manager" @@ -339,7 +337,7 @@ func run(ctx context.Context, containerBackend container_backend.ContainerBacken imagesRepo = storageManager.GetServiceValuesRepo() - conveyorOptions, err := common.GetConveyorOptionsWithParallel(&commonCmdData, imagesToProcess, buildOptions) + conveyorOptions, err := common.GetConveyorOptionsWithParallel(ctx, &commonCmdData, imagesToProcess, buildOptions) if err != nil { return err } @@ -348,25 +346,19 @@ func run(ctx context.Context, containerBackend container_backend.ContainerBacken defer conveyorWithRetry.Terminate() if err := conveyorWithRetry.WithRetryBlock(ctx, func(c *build.Conveyor) error { - buildFunc := func(ctx context.Context) error { - if common.GetRequireBuiltImages(ctx, &commonCmdData) { - shouldBeBuiltOptions, err := common.GetShouldBeBuiltOptions(&commonCmdData, giterminismManager, werfConfig) - if err != nil { - return err - } - - return c.ShouldBeBuilt(ctx, shouldBeBuiltOptions) + if common.GetRequireBuiltImages(ctx, &commonCmdData) { + shouldBeBuiltOptions, err := common.GetShouldBeBuiltOptions(&commonCmdData, giterminismManager, werfConfig) + if err != nil { + return err } - return c.Build(ctx, buildOptions) - } - // Print build logs on error if --require-built-images is specified. - // Always print logs by default or if --log-verbose is specified. - requireBuiltImage := common.GetRequireBuiltImages(ctx, &commonCmdData) - isVerbose := logboek.Context(ctx).IsAcceptedLevel(level.Default) - deferLog := requireBuiltImage || !isVerbose - if err := logging.RunWithDeferredLog(ctx, deferLog, buildFunc); err != nil { - return err + if err := c.ShouldBeBuilt(ctx, shouldBeBuiltOptions); err != nil { + return err + } + } else { + if err := c.Build(ctx, buildOptions); err != nil { + return err + } } imagesInfoGetters, err = c.GetImageInfoGetters(image.InfoGetterOptions{CustomTagFunc: useCustomTagFunc}) diff --git a/cmd/werf/export/export.go b/cmd/werf/export/export.go index 7f4052d576..6754f39eb5 100644 --- a/cmd/werf/export/export.go +++ b/cmd/werf/export/export.go @@ -11,7 +11,6 @@ import ( "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/spf13/cobra" - "github.com/werf/logboek" "github.com/werf/werf/cmd/werf/common" "github.com/werf/werf/pkg/build" @@ -237,7 +236,7 @@ func run(ctx context.Context, imagesToProcess build.ImagesToProcess, tagTemplate logboek.Context(ctx).Info().LogOptionalLn() - conveyorOptions, err := common.GetConveyorOptions(&commonCmdData, imagesToProcess) + conveyorOptions, err := common.GetConveyorOptions(ctx, &commonCmdData, imagesToProcess) if err != nil { return err } @@ -263,21 +262,24 @@ func run(ctx context.Context, imagesToProcess build.ImagesToProcess, tagTemplate return err } + if common.GetRequireBuiltImages(ctx, &commonCmdData) { + if err := c.ShouldBeBuilt(ctx, build.ShouldBeBuiltOptions{}); err != nil { + return err + } + } else { + if err := c.Build(ctx, build.BuildOptions{SkipImageMetadataPublication: *commonCmdData.Dev}); err != nil { + return err + } + } + return c.Export(ctx, build.ExportOptions{ - BuildPhaseOptions: build.BuildPhaseOptions{ - BuildOptions: build.BuildOptions{SkipImageMetadataPublication: *commonCmdData.Dev}, - ShouldBeBuiltMode: common.GetRequireBuiltImages(ctx, &commonCmdData), - }, - ExportPhaseOptions: build.ExportPhaseOptions{ - ExportImageNameList: imageNameList, - ExportTagFuncList: tagFuncList, - MutateConfigFunc: func(config v1.Config) (v1.Config, error) { - for k, v := range extraLabels { - config.Labels[k] = v - } - - return config, nil - }, + ExportImageNameList: imageNameList, + ExportTagFuncList: tagFuncList, + MutateConfigFunc: func(config v1.Config) (v1.Config, error) { + for k, v := range extraLabels { + config.Labels[k] = v + } + return config, nil }, }) }) diff --git a/cmd/werf/helm/get_autogenerated_values.go b/cmd/werf/helm/get_autogenerated_values.go index fd87a1a6b6..5c876c9a99 100644 --- a/cmd/werf/helm/get_autogenerated_values.go +++ b/cmd/werf/helm/get_autogenerated_values.go @@ -208,7 +208,7 @@ func runGetServiceValues(ctx context.Context, imagesToProcess build.ImagesToProc storageManager := manager.NewStorageManager(projectName, stagesStorage, finalStagesStorage, secondaryStagesStorageList, cacheStagesStorageList, storageLockManager) - conveyorOptions, err := common.GetConveyorOptions(&getAutogeneratedValuedCmdData, imagesToProcess) + conveyorOptions, err := common.GetConveyorOptions(ctx, &getAutogeneratedValuedCmdData, imagesToProcess) if err != nil { return err } diff --git a/cmd/werf/kube_run/kube_run.go b/cmd/werf/kube_run/kube_run.go index 10862527ff..27974f1f4a 100644 --- a/cmd/werf/kube_run/kube_run.go +++ b/cmd/werf/kube_run/kube_run.go @@ -25,7 +25,6 @@ import ( "github.com/werf/kubedog/pkg/kube" "github.com/werf/logboek" - "github.com/werf/logboek/pkg/level" "github.com/werf/werf/cmd/werf/common" "github.com/werf/werf/pkg/build" "github.com/werf/werf/pkg/config" @@ -398,7 +397,7 @@ func run(ctx context.Context, pod, secret, namespace string, werfConfig *config. imagesToProcess := build.NewImagesToProcess([]string{imageName}, false) - conveyorOptions, err := common.GetConveyorOptions(&commonCmdData, imagesToProcess) + conveyorOptions, err := common.GetConveyorOptions(ctx, &commonCmdData, imagesToProcess) if err != nil { return err } @@ -408,20 +407,14 @@ func run(ctx context.Context, pod, secret, namespace string, werfConfig *config. var image string if err := conveyorWithRetry.WithRetryBlock(ctx, func(c *build.Conveyor) error { - buildFunc := func(ctx context.Context) error { - if common.GetRequireBuiltImages(ctx, &commonCmdData) { - return c.ShouldBeBuilt(ctx, build.ShouldBeBuiltOptions{}) + if common.GetRequireBuiltImages(ctx, &commonCmdData) { + if err := c.ShouldBeBuilt(ctx, build.ShouldBeBuiltOptions{}); err != nil { + return err + } + } else { + if err := c.Build(ctx, build.BuildOptions{}); err != nil { + return err } - return c.Build(ctx, build.BuildOptions{}) - } - - // Print build logs on error if --require-built-images is specified. - // Always print logs by default or if --log-verbose is specified. - requireBuiltImage := common.GetRequireBuiltImages(ctx, &commonCmdData) - isVerbose := logboek.Context(ctx).IsAcceptedLevel(level.Default) - deferLog := requireBuiltImage || !isVerbose - if err := logging.RunWithDeferredLog(ctx, deferLog, buildFunc); err != nil { - return err } image, err = c.GetFullImageName(ctx, imageName) diff --git a/cmd/werf/render/render.go b/cmd/werf/render/render.go index bfa3ed399a..68c03f16e7 100644 --- a/cmd/werf/render/render.go +++ b/cmd/werf/render/render.go @@ -27,7 +27,6 @@ import ( "github.com/werf/werf/pkg/git_repo" "github.com/werf/werf/pkg/git_repo/gitdata" "github.com/werf/werf/pkg/image" - "github.com/werf/werf/pkg/logging" "github.com/werf/werf/pkg/ssh_agent" "github.com/werf/werf/pkg/storage" "github.com/werf/werf/pkg/storage/lrumeta" @@ -312,33 +311,34 @@ func runRender(ctx context.Context, imagesToProcess build.ImagesToProcess) error imagesRepo = storageManager.GetServiceValuesRepo() - conveyorOptions, err := common.GetConveyorOptionsWithParallel(&commonCmdData, imagesToProcess, buildOptions) + conveyorOptions, err := common.GetConveyorOptionsWithParallel(ctx, &commonCmdData, imagesToProcess, buildOptions) if err != nil { return err } + // Override default behaviour: + // Print build logs on error by default. + // Always print logs if --log-verbose is specified (level.Info). + isVerbose := logboek.Context(ctx).IsAcceptedLevel(level.Default) + conveyorOptions.DeferBuildLog = !isVerbose + conveyorWithRetry := build.NewConveyorWithRetryWrapper(werfConfig, giterminismManager, giterminismManager.ProjectDir(), projectTmpDir, ssh_agent.SSHAuthSock, containerBackend, storageManager, storageLockManager, conveyorOptions) defer conveyorWithRetry.Terminate() if err := conveyorWithRetry.WithRetryBlock(ctx, func(c *build.Conveyor) error { - buildFunc := func(ctx context.Context) error { - if common.GetRequireBuiltImages(ctx, &commonCmdData) { - shouldBeBuiltOptions, err := common.GetShouldBeBuiltOptions(&commonCmdData, giterminismManager, werfConfig) - if err != nil { - return err - } - - return c.ShouldBeBuilt(ctx, shouldBeBuiltOptions) + if common.GetRequireBuiltImages(ctx, &commonCmdData) { + shouldBeBuiltOptions, err := common.GetShouldBeBuiltOptions(&commonCmdData, giterminismManager, werfConfig) + if err != nil { + return err } - return c.Build(ctx, buildOptions) - } - - // Print build logs on error by default. - // Always print logs if --log-verbose is specified (level.Info). - isVerbose := logboek.Context(ctx).IsAcceptedLevel(level.Default) - if err := logging.RunWithDeferredLog(ctx, !isVerbose, buildFunc); err != nil { - return err + if err := c.ShouldBeBuilt(ctx, shouldBeBuiltOptions); err != nil { + return err + } + } else { + if err := c.Build(ctx, buildOptions); err != nil { + return err + } } imagesInfoGetters, err = c.GetImageInfoGetters(image.InfoGetterOptions{CustomTagFunc: useCustomTagFunc}) diff --git a/cmd/werf/run/run.go b/cmd/werf/run/run.go index 0609b0f9e2..0a23f7dc52 100644 --- a/cmd/werf/run/run.go +++ b/cmd/werf/run/run.go @@ -13,7 +13,6 @@ import ( "github.com/spf13/cobra" "github.com/werf/logboek" - "github.com/werf/logboek/pkg/level" "github.com/werf/werf/cmd/werf/common" "github.com/werf/werf/pkg/build" "github.com/werf/werf/pkg/container_backend" @@ -384,7 +383,7 @@ func run(ctx context.Context, containerBackend container_backend.ContainerBacken imagesToProcess := build.NewImagesToProcess([]string{imageName}, false) - conveyorOptions, err := common.GetConveyorOptions(&commonCmdData, imagesToProcess) + conveyorOptions, err := common.GetConveyorOptions(ctx, &commonCmdData, imagesToProcess) if err != nil { return err } @@ -394,20 +393,14 @@ func run(ctx context.Context, containerBackend container_backend.ContainerBacken var dockerImageName string if err := conveyorWithRetry.WithRetryBlock(ctx, func(c *build.Conveyor) error { - buildFunc := func(ctx context.Context) error { - if common.GetRequireBuiltImages(ctx, &commonCmdData) { - return c.ShouldBeBuilt(ctx, build.ShouldBeBuiltOptions{}) + if common.GetRequireBuiltImages(ctx, &commonCmdData) { + if err := c.ShouldBeBuilt(ctx, build.ShouldBeBuiltOptions{}); err != nil { + return err + } + } else { + if err := c.Build(ctx, build.BuildOptions{SkipImageMetadataPublication: *commonCmdData.Dev}); err != nil { + return err } - return c.Build(ctx, build.BuildOptions{SkipImageMetadataPublication: *commonCmdData.Dev}) - } - - // Print build logs on error if --require-built-images is specified. - // Always print logs by default or if --log-verbose is specified. - requireBuiltImage := common.GetRequireBuiltImages(ctx, &commonCmdData) - isVerbose := logboek.Context(ctx).IsAcceptedLevel(level.Default) - deferLog := requireBuiltImage || !isVerbose - if err := logging.RunWithDeferredLog(ctx, deferLog, buildFunc); err != nil { - return err } dockerImageName, err = c.GetFullImageName(ctx, imageName) diff --git a/cmd/werf/stage/image/main.go b/cmd/werf/stage/image/main.go index 90a3ce253d..743a666a6e 100644 --- a/cmd/werf/stage/image/main.go +++ b/cmd/werf/stage/image/main.go @@ -194,7 +194,7 @@ func run(ctx context.Context, imageName string) error { imagesToProcess := build.NewImagesToProcess([]string{imageName}, false) - conveyorOptions, err := common.GetConveyorOptions(&commonCmdData, imagesToProcess) + conveyorOptions, err := common.GetConveyorOptions(ctx, &commonCmdData, imagesToProcess) if err != nil { return err } diff --git a/pkg/build/conveyor.go b/pkg/build/conveyor.go index 2759de321b..080a9ee9fa 100644 --- a/pkg/build/conveyor.go +++ b/pkg/build/conveyor.go @@ -1,6 +1,7 @@ package build import ( + "bytes" "context" "errors" "fmt" @@ -70,6 +71,7 @@ type ConveyorOptions struct { ParallelTasksLimit int64 LocalGitRepoVirtualMergeOptions stage.VirtualMergeOptions TargetPlatforms []string + DeferBuildLog bool ImagesToProcess } @@ -382,6 +384,8 @@ func (c *Conveyor) ShouldBeBuilt(ctx context.Context, opts ShouldBeBuiltOptions) return err } + buildCtx, buf := c.prepareBuildCtx(ctx) + phases := []Phase{ NewBuildPhase(c, BuildPhaseOptions{ ShouldBeBuiltMode: true, @@ -391,11 +395,11 @@ func (c *Conveyor) ShouldBeBuilt(ctx context.Context, opts ShouldBeBuiltOptions) }), } - if err := c.runPhases(ctx, phases, false); err != nil { - return err + err := c.runPhases(buildCtx, phases, false) + if err != nil { + c.printDeferredBuildLog(ctx, buf) } - - return nil + return err } func (c *Conveyor) FetchLastImageStage(ctx context.Context, targetPlatform, imageName string) error { @@ -497,6 +501,26 @@ It is recommended to use shell builder, because ansible builder will be deprecat return nil } +// prepareBuildCtx creates buffer and a new logger context if printing build log should be deferred. +func (c *Conveyor) prepareBuildCtx(ctx context.Context) (context.Context, *bytes.Buffer) { + if !c.DeferBuildLog { + return ctx, nil + } + + buf := new(bytes.Buffer) + bufLogger := logboek.NewLogger(buf, buf) + return logboek.NewContext(ctx, bufLogger), buf +} + +func (c *Conveyor) printDeferredBuildLog(ctx context.Context, buf *bytes.Buffer) { + if !c.DeferBuildLog || buf == nil { + return + } + + _, _ = logboek.Context(ctx).OutStream().Write(buf.Bytes()) + //fmt.Println(buf.String()) +} + func (c *Conveyor) Build(ctx context.Context, opts BuildOptions) error { if err := c.checkContainerBackendSupported(ctx); err != nil { return err @@ -506,31 +530,24 @@ func (c *Conveyor) Build(ctx context.Context, opts BuildOptions) error { return err } + buildCtx, buf := c.prepareBuildCtx(ctx) + phases := []Phase{ NewBuildPhase(c, BuildPhaseOptions{ BuildOptions: opts, }), } - return c.runPhases(ctx, phases, true) + err := c.runPhases(buildCtx, phases, true) + if err != nil { + c.printDeferredBuildLog(ctx, buf) + } + return err } -type ExportOptions struct { - BuildPhaseOptions BuildPhaseOptions - ExportPhaseOptions ExportPhaseOptions -} func (c *Conveyor) Export(ctx context.Context, opts ExportOptions) error { - if err := c.determineStages(ctx); err != nil { - return err - } - - phases := []Phase{ - NewBuildPhase(c, opts.BuildPhaseOptions), - NewExportPhase(c, opts.ExportPhaseOptions), - } - - return c.runPhases(ctx, phases, true) + return NewExporter(c, opts).Run(ctx) } func (c *Conveyor) determineStages(ctx context.Context) error { @@ -587,7 +604,7 @@ func (c *Conveyor) doImages(ctx context.Context, phases []Phase, logImages bool) return c.doImagesInParallel(ctx, phases, logImages) } else { for _, img := range c.imagesTree.GetImages() { - if err := c.doImage(ctx, img, phases, logImages); err != nil { + if err := c.doImage(ctx, img, phases); err != nil { return err } } @@ -639,7 +656,7 @@ func (c *Conveyor) doImagesInParallel(ctx context.Context, phases []Phase, logIm // execution time calculation taskStartTime := time.Now() { - if err := c.doImage(ctx, taskImage, taskPhases, logImages); err != nil { + if err := c.doImage(ctx, taskImage, taskPhases); err != nil { return err } @@ -679,15 +696,8 @@ func (c *Conveyor) doImagesInParallel(ctx context.Context, phases []Phase, logIm return nil } -func (c *Conveyor) doImage(ctx context.Context, img *image.Image, phases []Phase, logImages bool) error { - var imagesLogger types.ManagerInterface - if logImages { - imagesLogger = logboek.Context(ctx).Default() - } else { - imagesLogger = logboek.Context(ctx).Info() - } - - return imagesLogger.LogProcess(img.LogDetailedName()). +func (c *Conveyor) doImage(ctx context.Context, img *image.Image, phases []Phase) error { + return logboek.Context(ctx).LogProcess(img.LogDetailedName()). Options(func(options types.LogProcessOptionsInterface) { options.Style(img.LogProcessStyle()) }). diff --git a/pkg/build/export_phase.go b/pkg/build/export_phase.go index 58f96142e2..60424829ca 100644 --- a/pkg/build/export_phase.go +++ b/pkg/build/export_phase.go @@ -16,55 +16,51 @@ import ( "github.com/werf/werf/pkg/util" ) -type ExportPhase struct { - BasePhase - ExportPhaseOptions +type Exporter struct { + ExportOptions + Conveyor *Conveyor } -type ExportPhaseOptions struct { +type ExportOptions struct { ExportImageNameList []string ExportTagFuncList []image.ExportTagFunc MutateConfigFunc func(config v1.Config) (v1.Config, error) } -func NewExportPhase(c *Conveyor, opts ExportPhaseOptions) *ExportPhase { - return &ExportPhase{ - BasePhase: BasePhase{c}, - ExportPhaseOptions: opts, +func NewExporter(c *Conveyor, opts ExportOptions) *Exporter { + return &Exporter{ + ExportOptions: opts, + Conveyor: c, } } -func (phase *ExportPhase) Name() string { - return "export" -} - -func (phase *ExportPhase) AfterImages(ctx context.Context) error { - if len(phase.ExportTagFuncList) == 0 { +func (e *Exporter) Run(ctx context.Context) error { + if len(e.ExportTagFuncList) == 0 { return nil } - for _, desc := range phase.Conveyor.imagesTree.GetImagesByName(true) { + for _, desc := range e.Conveyor.imagesTree.GetImagesByName(true) { name, images := desc.Unpair() - if !slices.Contains(phase.ExportImageNameList, name) { + if !slices.Contains(e.ExportImageNameList, name) { continue } targetPlatforms := util.MapFuncToSlice(images, func(img *build_image.Image) string { return img.TargetPlatform }) if len(targetPlatforms) == 1 { img := images[0] - if err := phase.exportImage(ctx, img); err != nil { + if err := e.exportImage(ctx, img); err != nil { return fmt.Errorf("unable to export image %q: %w", img.Name, err) } } else { // FIXME(multiarch): Support multiplatform manifest by pushing local images to repo first, then create manifest list. // FIXME(multiarch): Also support multiplatform manifest in werf build command in local mode with enabled final-repo. - if _, isLocal := phase.Conveyor.StorageManager.GetStagesStorage().(*storage.LocalStagesStorage); isLocal { + if _, isLocal := e.Conveyor.StorageManager.GetStagesStorage().(*storage.LocalStagesStorage); isLocal { return fmt.Errorf("export command is not supported in multiplatform mode") } // multiplatform mode - img := phase.Conveyor.imagesTree.GetMultiplatformImage(name) - if err := phase.exportMultiplatformImage(ctx, img); err != nil { + img := e.Conveyor.imagesTree.GetMultiplatformImage(name) + if err := e.exportMultiplatformImage(ctx, img); err != nil { return fmt.Errorf("unable to export multiplatform image %q: %w", img.Name, err) } } @@ -73,18 +69,18 @@ func (phase *ExportPhase) AfterImages(ctx context.Context) error { return nil } -func (phase *ExportPhase) exportMultiplatformImage(ctx context.Context, img *build_image.MultiplatformImage) error { +func (e *Exporter) exportMultiplatformImage(ctx context.Context, img *build_image.MultiplatformImage) error { return logboek.Context(ctx).Default().LogProcess("Exporting image..."). Options(func(options types.LogProcessOptionsInterface) { options.Style(style.Highlight()) }). DoError(func() error { - for _, tagFunc := range phase.ExportTagFuncList { + for _, tagFunc := range e.ExportTagFuncList { tag := tagFunc(img.Name, img.GetStageID().String()) if err := logboek.Context(ctx).Default().LogProcess("tag %s", tag). DoError(func() error { desc := img.GetStageDescription() - if err := phase.Conveyor.StorageManager.GetStagesStorage().ExportStage(ctx, desc, tag, phase.MutateConfigFunc); err != nil { + if err := e.Conveyor.StorageManager.GetStagesStorage().ExportStage(ctx, desc, tag, e.MutateConfigFunc); err != nil { return err } @@ -98,11 +94,11 @@ func (phase *ExportPhase) exportMultiplatformImage(ctx context.Context, img *bui }) } -func (phase *ExportPhase) exportImage(ctx context.Context, img *build_image.Image) error { - if !slices.Contains(phase.ExportImageNameList, img.Name) { +func (e *Exporter) exportImage(ctx context.Context, img *build_image.Image) error { + if !slices.Contains(e.ExportImageNameList, img.Name) { return nil } - if len(phase.ExportTagFuncList) == 0 { + if len(e.ExportTagFuncList) == 0 { return nil } @@ -111,12 +107,12 @@ func (phase *ExportPhase) exportImage(ctx context.Context, img *build_image.Imag options.Style(style.Highlight()) }). DoError(func() error { - for _, tagFunc := range phase.ExportTagFuncList { + for _, tagFunc := range e.ExportTagFuncList { tag := tagFunc(img.GetName(), img.GetStageID()) if err := logboek.Context(ctx).Default().LogProcess("tag %s", tag). DoError(func() error { stageDesc := img.GetLastNonEmptyStage().GetStageImage().Image.GetStageDescription() - if err := phase.Conveyor.StorageManager.GetStagesStorage().ExportStage(ctx, stageDesc, tag, phase.MutateConfigFunc); err != nil { + if err := e.Conveyor.StorageManager.GetStagesStorage().ExportStage(ctx, stageDesc, tag, e.MutateConfigFunc); err != nil { return err } @@ -129,8 +125,3 @@ func (phase *ExportPhase) exportImage(ctx context.Context, img *build_image.Imag return nil }) } - -func (phase *ExportPhase) Clone() Phase { - u := *phase - return &u -} diff --git a/pkg/logging/main.go b/pkg/logging/main.go index 668f098d4f..9b97520077 100644 --- a/pkg/logging/main.go +++ b/pkg/logging/main.go @@ -1,13 +1,9 @@ package logging import ( - "bytes" - "context" "fmt" "github.com/gookit/color" - - "github.com/werf/logboek" ) var ( @@ -67,21 +63,3 @@ func ImageDefaultStyle(isArtifact bool) color.Style { func ImageMetadataStyle() color.Style { return ImageDefaultStyle(false) } - -// RunWithDeferredLog will run a function and print log if condition is true and -// print logs only on error if condition is false. -func RunWithDeferredLog(ctx context.Context, deferLog bool, run func(ctx context.Context) error) error { - if !deferLog { - return run(ctx) - } - - buf := new(bytes.Buffer) - bufLogger := logboek.NewLogger(buf, buf) - ctxWithBufLogger := logboek.NewContext(ctx, bufLogger) - - err := run(ctxWithBufLogger) - if err != nil { - fmt.Println(buf.String()) - } - return err -} From cd5327828ad4821b477215649ec1c061dc5bb8dc Mon Sep 17 00:00:00 2001 From: Ivan Mikheykin Date: Fri, 26 May 2023 20:42:10 +0300 Subject: [PATCH 2/2] ++ linting Signed-off-by: Ivan Mikheykin --- cmd/werf/export/export.go | 1 + pkg/build/conveyor.go | 4 +--- pkg/build/export_phase.go | 2 +- pkg/buildah/common.go | 1 + 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmd/werf/export/export.go b/cmd/werf/export/export.go index 6754f39eb5..e5f6eaf485 100644 --- a/cmd/werf/export/export.go +++ b/cmd/werf/export/export.go @@ -11,6 +11,7 @@ import ( "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/spf13/cobra" + "github.com/werf/logboek" "github.com/werf/werf/cmd/werf/common" "github.com/werf/werf/pkg/build" diff --git a/pkg/build/conveyor.go b/pkg/build/conveyor.go index 080a9ee9fa..a3f7c138e8 100644 --- a/pkg/build/conveyor.go +++ b/pkg/build/conveyor.go @@ -513,12 +513,11 @@ func (c *Conveyor) prepareBuildCtx(ctx context.Context) (context.Context, *bytes } func (c *Conveyor) printDeferredBuildLog(ctx context.Context, buf *bytes.Buffer) { - if !c.DeferBuildLog || buf == nil { + if !c.DeferBuildLog || buf == nil { return } _, _ = logboek.Context(ctx).OutStream().Write(buf.Bytes()) - //fmt.Println(buf.String()) } func (c *Conveyor) Build(ctx context.Context, opts BuildOptions) error { @@ -545,7 +544,6 @@ func (c *Conveyor) Build(ctx context.Context, opts BuildOptions) error { return err } - func (c *Conveyor) Export(ctx context.Context, opts ExportOptions) error { return NewExporter(c, opts).Run(ctx) } diff --git a/pkg/build/export_phase.go b/pkg/build/export_phase.go index 60424829ca..fdea721200 100644 --- a/pkg/build/export_phase.go +++ b/pkg/build/export_phase.go @@ -29,8 +29,8 @@ type ExportOptions struct { func NewExporter(c *Conveyor, opts ExportOptions) *Exporter { return &Exporter{ + Conveyor: c, ExportOptions: opts, - Conveyor: c, } } diff --git a/pkg/buildah/common.go b/pkg/buildah/common.go index d6ce0773fc..5155ca6e04 100644 --- a/pkg/buildah/common.go +++ b/pkg/buildah/common.go @@ -256,6 +256,7 @@ func GetDefaultIsolation() (thirdparty.Isolation, error) { return thirdparty.IsolationChroot, nil } +//nolint:deadcode,unused func debug() bool { return os.Getenv("WERF_BUILDAH_DEBUG") == "1" }