From dd9bc0954f6e73c3c567a4cbd23d57b09f5d194c Mon Sep 17 00:00:00 2001 From: Ilya Lesikov Date: Sun, 21 Apr 2024 07:00:28 +0300 Subject: [PATCH] fix: remove deprecated werf bundle export/download commands Signed-off-by: Ilya Lesikov --- cmd/werf/bundle/download/download.go | 112 -------- cmd/werf/bundle/export/export.go | 396 -------------------------- cmd/werf/bundle/export/export_docs.go | 18 -- cmd/werf/root/root.go | 4 - 4 files changed, 530 deletions(-) delete mode 100644 cmd/werf/bundle/download/download.go delete mode 100644 cmd/werf/bundle/export/export.go delete mode 100644 cmd/werf/bundle/export/export_docs.go diff --git a/cmd/werf/bundle/download/download.go b/cmd/werf/bundle/download/download.go deleted file mode 100644 index 0897b2bcdd..0000000000 --- a/cmd/werf/bundle/download/download.go +++ /dev/null @@ -1,112 +0,0 @@ -package download - -import ( - "context" - "fmt" - "os" - - "github.com/spf13/cobra" - helm_v3 "helm.sh/helm/v3/cmd/helm" - - "github.com/werf/logboek" - "github.com/werf/werf/v2/cmd/werf/common" - "github.com/werf/werf/v2/pkg/deploy/bundles" - "github.com/werf/werf/v2/pkg/werf" - "github.com/werf/werf/v2/pkg/werf/global_warnings" -) - -var cmdData struct { - Tag string - Destination string -} - -var commonCmdData common.CmdData - -func NewCmd(ctx context.Context) *cobra.Command { - ctx = common.NewContextWithCmdData(ctx, &commonCmdData) - cmd := common.SetCommandContext(ctx, &cobra.Command{ - Use: "download", - Short: "Download published bundle into directory", - Hidden: true, // Deprecated command - Long: common.GetLongCommandDescription(`Take latest bundle from the specified container registry using specified version tag or version mask and unpack it into provided directory (or into directory named as a resulting chart in the current working directory).`), - DisableFlagsInUseLine: true, - Annotations: map[string]string{ - common.CmdEnvAnno: common.EnvsDescription(), - }, - RunE: func(cmd *cobra.Command, args []string) error { - ctx := cmd.Context() - - logboek.Context(ctx).Warn().LogF("WARNING: werf bundle download is DEPRECATED!\n") - logboek.Context(ctx).Warn().LogF("WARNING: To download published bundle from the registry and unpack bundle helm chart into directory use following commands:\n") - logboek.Context(ctx).Warn().LogF("WARNING: \n") - logboek.Context(ctx).Warn().LogF("WARNING: 1. Publish bundle into some registry:\n") - logboek.Context(ctx).Warn().LogF("WARNING: werf bundle publish --repo REPO --tag TAG\n") - logboek.Context(ctx).Warn().LogF("WARNING: \n") - logboek.Context(ctx).Warn().LogF("WARNING: 2. Copy published bundle from the registry to bundle archive:\n") - logboek.Context(ctx).Warn().LogF("WARNING: werf bundle copy --from REPO:TAG --to archive:PATH_TO_ARCHIVE.tar.gz\n") - logboek.Context(ctx).Warn().LogF("WARNING: \n") - logboek.Context(ctx).Warn().LogF("WARNING: 3. Unpack bundle archive:\n") - logboek.Context(ctx).Warn().LogF("WARNING: tar xf PATH_TO_ARCHIVE.tar.gz\n") - logboek.Context(ctx).Warn().LogF("WARNING: \n") - logboek.Context(ctx).Warn().LogF("WARNING: 4. Unpack chart archive inside unpacked bundle archive directory:\n") - logboek.Context(ctx).Warn().LogF("WARNING: tar xf chart.tar.gz\n") - - defer global_warnings.PrintGlobalWarnings(ctx) - - if err := common.ProcessLogOptions(&commonCmdData); err != nil { - common.PrintHelp(cmd) - return err - } - - common.LogVersion() - - return common.LogRunningTime(func() error { return runDownload(ctx) }) - }, - }) - - common.SetupTmpDir(&commonCmdData, cmd, common.SetupTmpDirOptions{}) - common.SetupHomeDir(&commonCmdData, cmd, common.SetupHomeDirOptions{}) - - common.SetupInsecureRegistry(&commonCmdData, cmd) - common.SetupInsecureHelmDependencies(&commonCmdData, cmd, false) - common.SetupSkipTlsVerifyRegistry(&commonCmdData, cmd) - - common.SetupRepoOptions(&commonCmdData, cmd, common.RepoDataOptions{}) - - common.SetupLogOptions(&commonCmdData, cmd) - common.SetupLogProjectDir(&commonCmdData, cmd) - common.SetupDockerConfig(&commonCmdData, cmd, "") - - defaultTag := os.Getenv("WERF_TAG") - if defaultTag == "" { - defaultTag = "latest" - } - cmd.Flags().StringVarP(&cmdData.Tag, "tag", "", defaultTag, "Provide exact tag version or semver-based pattern, werf will install or upgrade to the latest version of the specified bundle ($WERF_TAG or latest by default)") - cmd.Flags().StringVarP(&cmdData.Destination, "destination", "d", os.Getenv("WERF_DESTINATION"), "Download bundle into the provided directory ($WERF_DESTINATION or chart-name by default)") - - return cmd -} - -func runDownload(ctx context.Context) error { - if err := werf.Init(*commonCmdData.TmpDir, *commonCmdData.HomeDir); err != nil { - return fmt.Errorf("initialization error: %w", err) - } - - if err := common.DockerRegistryInit(ctx, &commonCmdData); err != nil { - return err - } - - repoAddress, err := commonCmdData.Repo.GetAddress() - if err != nil { - return err - } - - helm_v3.Settings.Debug = *commonCmdData.LogDebug - - bundlesRegistryClient, err := common.NewBundlesRegistryClient(ctx, &commonCmdData) - if err != nil { - return err - } - - return bundles.Pull(ctx, fmt.Sprintf("%s:%s", repoAddress, cmdData.Tag), cmdData.Destination, bundlesRegistryClient) -} diff --git a/cmd/werf/bundle/export/export.go b/cmd/werf/bundle/export/export.go deleted file mode 100644 index 49a236bd1b..0000000000 --- a/cmd/werf/bundle/export/export.go +++ /dev/null @@ -1,396 +0,0 @@ -package export - -import ( - "context" - "fmt" - "os" - "time" - - "github.com/spf13/cobra" - helm_v3 "helm.sh/helm/v3/cmd/helm" - "helm.sh/helm/v3/pkg/chart" - "helm.sh/helm/v3/pkg/chart/loader" - "helm.sh/helm/v3/pkg/cli/values" - - "github.com/werf/logboek" - "github.com/werf/werf/v2/cmd/werf/common" - "github.com/werf/werf/v2/pkg/build" - "github.com/werf/werf/v2/pkg/config" - "github.com/werf/werf/v2/pkg/deploy/helm/chart_extender" - "github.com/werf/werf/v2/pkg/deploy/helm/chart_extender/helpers" - "github.com/werf/werf/v2/pkg/deploy/helm/command_helpers" - "github.com/werf/werf/v2/pkg/deploy/secrets_manager" - "github.com/werf/werf/v2/pkg/git_repo" - "github.com/werf/werf/v2/pkg/git_repo/gitdata" - "github.com/werf/werf/v2/pkg/image" - "github.com/werf/werf/v2/pkg/ssh_agent" - "github.com/werf/werf/v2/pkg/storage/lrumeta" - "github.com/werf/werf/v2/pkg/storage/manager" - "github.com/werf/werf/v2/pkg/tmp_manager" - "github.com/werf/werf/v2/pkg/true_git" - "github.com/werf/werf/v2/pkg/werf" - "github.com/werf/werf/v2/pkg/werf/global_warnings" -) - -var cmdData struct { - Destination string -} - -var commonCmdData common.CmdData - -func NewCmd(ctx context.Context) *cobra.Command { - ctx = common.NewContextWithCmdData(ctx, &commonCmdData) - cmd := common.SetCommandContext(ctx, &cobra.Command{ - Use: "export [IMAGE_NAME...]", - Short: "Export bundle", - Hidden: true, // Deprecated command - Long: common.GetLongCommandDescription(GetBundleExportDocs().Long), - DisableFlagsInUseLine: true, - Annotations: map[string]string{ - common.CmdEnvAnno: common.EnvsDescription(), - common.DocsLongMD: GetBundleExportDocs().LongMD, - }, - RunE: func(cmd *cobra.Command, args []string) error { - ctx := cmd.Context() - - logboek.Context(ctx).Warn().LogF("WARNING: werf bundle export is DEPRECATED!\n") - logboek.Context(ctx).Warn().LogF("WARNING: To create bundle helm chart directory from your git werf project use following commands:\n") - logboek.Context(ctx).Warn().LogF("WARNING: \n") - logboek.Context(ctx).Warn().LogF("WARNING: 1. Publish bundle into some registry:\n") - logboek.Context(ctx).Warn().LogF("WARNING: werf bundle publish --repo REPO --tag TAG\n") - logboek.Context(ctx).Warn().LogF("WARNING: \n") - logboek.Context(ctx).Warn().LogF("WARNING: 2. Copy published bundle from the registry to bundle archive:\n") - logboek.Context(ctx).Warn().LogF("WARNING: werf bundle copy --from REPO:TAG --to archive:PATH_TO_ARCHIVE.tar.gz\n") - logboek.Context(ctx).Warn().LogF("WARNING: \n") - logboek.Context(ctx).Warn().LogF("WARNING: 3. Unpack bundle archive:\n") - logboek.Context(ctx).Warn().LogF("WARNING: tar xf PATH_TO_ARCHIVE.tar.gz\n") - logboek.Context(ctx).Warn().LogF("WARNING: \n") - logboek.Context(ctx).Warn().LogF("WARNING: 4. Unpack chart archive inside unpacked bundle archive directory:\n") - logboek.Context(ctx).Warn().LogF("WARNING: tar xf chart.tar.gz\n") - - defer global_warnings.PrintGlobalWarnings(ctx) - - if err := common.ProcessLogOptions(&commonCmdData); err != nil { - common.PrintHelp(cmd) - return err - } - - common.LogVersion() - - return common.LogRunningTime(func() error { - return runExport(ctx, common.GetImagesToProcess(args, *commonCmdData.WithoutImages)) - }) - }, - }) - - commonCmdData.SetupWithoutImages(cmd) - - common.SetupDir(&commonCmdData, cmd) - common.SetupGitWorkTree(&commonCmdData, cmd) - common.SetupGiterminismOptions(&commonCmdData, cmd) - common.SetupConfigTemplatesDir(&commonCmdData, cmd) - common.SetupConfigPath(&commonCmdData, cmd) - common.SetupGiterminismConfigPath(&commonCmdData, cmd) - common.SetupEnvironment(&commonCmdData, cmd) - - common.SetupTmpDir(&commonCmdData, cmd, common.SetupTmpDirOptions{}) - common.SetupHomeDir(&commonCmdData, cmd, common.SetupHomeDirOptions{}) - common.SetupSSHKey(&commonCmdData, cmd) - - common.SetupIntrospectAfterError(&commonCmdData, cmd) - common.SetupIntrospectBeforeError(&commonCmdData, cmd) - common.SetupIntrospectStage(&commonCmdData, cmd) - - common.SetupSecondaryStagesStorageOptions(&commonCmdData, cmd) - common.SetupCacheStagesStorageOptions(&commonCmdData, cmd) - common.SetupRepoOptions(&commonCmdData, cmd, common.RepoDataOptions{}) - common.SetupFinalRepo(&commonCmdData, cmd) - - common.SetupDockerConfig(&commonCmdData, cmd, "Command needs granted permissions to read, pull and push images into the specified repo and to pull base images") - common.SetupInsecureRegistry(&commonCmdData, cmd) - common.SetupInsecureHelmDependencies(&commonCmdData, cmd, true) - common.SetupSkipTlsVerifyRegistry(&commonCmdData, cmd) - - common.SetupLogOptions(&commonCmdData, cmd) - common.SetupLogProjectDir(&commonCmdData, cmd) - - common.SetupSynchronization(&commonCmdData, cmd) - - common.SetupAddAnnotations(&commonCmdData, cmd) - common.SetupAddLabels(&commonCmdData, cmd) - - common.SetupSet(&commonCmdData, cmd) - common.SetupSetString(&commonCmdData, cmd) - common.SetupSetFile(&commonCmdData, cmd) - common.SetupValues(&commonCmdData, cmd, true) - - commonCmdData.SetupDisableDefaultValues(cmd) - commonCmdData.SetupDisableDefaultSecretValues(cmd) - commonCmdData.SetupSkipDependenciesRepoRefresh(cmd) - common.SetupIgnoreSecretKey(&commonCmdData, cmd) - - common.SetupSaveBuildReport(&commonCmdData, cmd) - common.SetupBuildReportPath(&commonCmdData, cmd) - common.SetupDeprecatedReportPath(&commonCmdData, cmd) - common.SetupDeprecatedReportFormat(&commonCmdData, cmd) - - common.SetupUseCustomTag(&commonCmdData, cmd) - common.SetupVirtualMerge(&commonCmdData, cmd) - - common.SetupParallelOptions(&commonCmdData, cmd, common.DefaultBuildParallelTasksLimit) - - common.SetupSkipBuild(&commonCmdData, cmd) - common.SetupRequireBuiltImages(&commonCmdData, cmd) - commonCmdData.SetupPlatform(cmd) - - common.SetupDisableAutoHostCleanup(&commonCmdData, cmd) - common.SetupAllowedDockerStorageVolumeUsage(&commonCmdData, cmd) - common.SetupAllowedDockerStorageVolumeUsageMargin(&commonCmdData, cmd) - common.SetupAllowedLocalCacheVolumeUsage(&commonCmdData, cmd) - common.SetupAllowedLocalCacheVolumeUsageMargin(&commonCmdData, cmd) - common.SetupDockerServerStoragePath(&commonCmdData, cmd) - - cmd.Flags().StringVarP(&cmdData.Destination, "destination", "d", os.Getenv("WERF_DESTINATION"), "Export bundle into the provided directory ($WERF_DESTINATION or chart-name by default)") - - return cmd -} - -func runExport(ctx context.Context, imagesToProcess build.ImagesToProcess) error { - if err := werf.Init(*commonCmdData.TmpDir, *commonCmdData.HomeDir); err != nil { - return fmt.Errorf("initialization error: %w", err) - } - - containerBackend, processCtx, err := common.InitProcessContainerBackend(ctx, &commonCmdData) - if err != nil { - return err - } - ctx = processCtx - - gitDataManager, err := gitdata.GetHostGitDataManager(ctx) - if err != nil { - return fmt.Errorf("error getting host git data manager: %w", err) - } - - if err := git_repo.Init(gitDataManager); err != nil { - return err - } - - if err := image.Init(); err != nil { - return err - } - - if err := lrumeta.Init(); err != nil { - return err - } - - if err := true_git.Init(ctx, true_git.Options{LiveGitOutput: *commonCmdData.LogDebug}); err != nil { - return err - } - - if err := common.DockerRegistryInit(ctx, &commonCmdData); err != nil { - return err - } - - defer func() { - if err := common.RunAutoHostCleanup(ctx, &commonCmdData, containerBackend); err != nil { - logboek.Context(ctx).Error().LogF("Auto host cleanup failed: %s\n", err) - } - }() - - if err := ssh_agent.Init(ctx, common.GetSSHKey(&commonCmdData)); err != nil { - return fmt.Errorf("cannot initialize ssh agent: %w", err) - } - defer func() { - err := ssh_agent.Terminate() - if err != nil { - logboek.Warn().LogF("WARNING: ssh agent termination failed: %s\n", err) - } - }() - - giterminismManager, err := common.GetGiterminismManager(ctx, &commonCmdData) - if err != nil { - return err - } - - common.ProcessLogProjectDir(&commonCmdData, giterminismManager.ProjectDir()) - - werfConfigPath, werfConfig, err := common.GetRequiredWerfConfig(ctx, &commonCmdData, giterminismManager, config.WerfConfigOptions{LogRenderedFilePath: true, Env: *commonCmdData.Environment}) - if err != nil { - return fmt.Errorf("unable to load werf config: %w", err) - } - if err := werfConfig.CheckThatImagesExist(imagesToProcess.OnlyImages); err != nil { - return err - } - - projectName := werfConfig.Meta.Project - - chartDir, err := common.GetHelmChartDir(werfConfigPath, werfConfig, giterminismManager) - if err != nil { - return fmt.Errorf("getting helm chart dir failed: %w", err) - } - - projectTmpDir, err := tmp_manager.CreateProjectDir(ctx) - if err != nil { - return fmt.Errorf("getting project tmp dir failed: %w", err) - } - defer tmp_manager.ReleaseProjectDir(projectTmpDir) - - userExtraAnnotations, err := common.GetUserExtraAnnotations(&commonCmdData) - if err != nil { - return err - } - - userExtraLabels, err := common.GetUserExtraLabels(&commonCmdData) - if err != nil { - return err - } - - imageNameList := common.GetImageNameList(imagesToProcess, werfConfig) - buildOptions, err := common.GetBuildOptions(ctx, &commonCmdData, werfConfig, imageNameList) - if err != nil { - return err - } - - logboek.LogOptionalLn() - - var imagesInfoGetters []*image.InfoGetter - var imagesRepo string - - if !imagesToProcess.WithoutImages && (len(werfConfig.StapelImages)+len(werfConfig.ImagesFromDockerfile) > 0) { - stagesStorage, err := common.GetStagesStorage(ctx, containerBackend, &commonCmdData) - if err != nil { - return err - } - finalStagesStorage, err := common.GetOptionalFinalStagesStorage(ctx, containerBackend, &commonCmdData) - if err != nil { - return err - } - synchronization, err := common.GetSynchronization(ctx, &commonCmdData, projectName, stagesStorage) - if err != nil { - return err - } - storageLockManager, err := common.GetStorageLockManager(ctx, synchronization) - if err != nil { - return err - } - secondaryStagesStorageList, err := common.GetSecondaryStagesStorageList(ctx, stagesStorage, containerBackend, &commonCmdData) - if err != nil { - return err - } - cacheStagesStorageList, err := common.GetCacheStagesStorageList(ctx, containerBackend, &commonCmdData) - if err != nil { - return err - } - useCustomTagFunc, err := common.GetUseCustomTagFunc(&commonCmdData, giterminismManager, imageNameList) - if err != nil { - return err - } - - storageManager := manager.NewStorageManager(projectName, stagesStorage, finalStagesStorage, secondaryStagesStorageList, cacheStagesStorageList, storageLockManager) - - imagesRepo = storageManager.GetServiceValuesRepo() - - conveyorOptions, err := common.GetConveyorOptionsWithParallel(ctx, &commonCmdData, imagesToProcess, buildOptions) - if err != nil { - return err - } - - 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 { - if common.GetRequireBuiltImages(ctx, &commonCmdData) { - shouldBeBuiltOptions, err := common.GetShouldBeBuiltOptions(&commonCmdData, imageNameList) - if 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}) - if err != nil { - return err - } - - return nil - }); err != nil { - return err - } - - logboek.LogOptionalLn() - } - - helmRegistryClient, err := common.NewHelmRegistryClient(ctx, *commonCmdData.DockerConfig, *commonCmdData.InsecureHelmDependencies) - if err != nil { - return fmt.Errorf("unable to create helm registry client: %w", err) - } - - wc := chart_extender.NewWerfChart(ctx, giterminismManager, nil, chartDir, helm_v3.Settings, helmRegistryClient, chart_extender.WerfChartOptions{ - BuildChartDependenciesOpts: command_helpers.BuildChartDependenciesOptions{SkipUpdate: *commonCmdData.SkipDependenciesRepoRefresh}, - ExtraAnnotations: userExtraAnnotations, - ExtraLabels: userExtraLabels, - IgnoreInvalidAnnotationsAndLabels: true, - DisableDefaultValues: *commonCmdData.DisableDefaultValues, - DisableDefaultSecretValues: true, - }) - - if err := wc.SetEnv(*commonCmdData.Environment); err != nil { - return err - } - if err := wc.SetWerfConfig(werfConfig); err != nil { - return err - } - - headHash, err := giterminismManager.LocalGitRepo().HeadCommitHash(ctx) - if err != nil { - return fmt.Errorf("getting HEAD commit hash failed: %w", err) - } - - headTime, err := giterminismManager.LocalGitRepo().HeadCommitTime(ctx) - if err != nil { - return fmt.Errorf("getting HEAD commit time failed: %w", err) - } - - if vals, err := helpers.GetServiceValues(ctx, werfConfig.Meta.Project, imagesRepo, imagesInfoGetters, helpers.ServiceValuesOptions{ - Env: *commonCmdData.Environment, - CommitHash: headHash, - CommitDate: headTime, - }); err != nil { - return fmt.Errorf("error creating service values: %w", err) - } else { - wc.SetServiceValues(vals) - } - - helm_v3.Settings.Debug = *commonCmdData.LogDebug - - secretsManager := secrets_manager.NewSecretsManager(secrets_manager.SecretsManagerOptions{DisableSecretsDecryption: *commonCmdData.IgnoreSecretKey}) - - loader.GlobalLoadOptions = &loader.LoadOptions{ - ChartExtender: wc, - SubchartExtenderFactoryFunc: func() chart.ChartExtender { - return chart_extender.NewWerfSubchart(ctx, secretsManager, chart_extender.WerfSubchartOptions{ - DisableDefaultSecretValues: *commonCmdData.DisableDefaultSecretValues, - }) - }, - } - - chartVersion := fmt.Sprintf("0.0.0-%d", time.Now().Unix()) - - if _, err := wc.CreateNewBundle(ctx, cmdData.Destination, chartVersion, &values.Options{ - ValueFiles: common.GetValues(&commonCmdData), - StringValues: common.GetSetString(&commonCmdData), - Values: common.GetSet(&commonCmdData), - FileValues: common.GetSetFile(&commonCmdData), - }); err != nil { - return fmt.Errorf("unable to create bundle: %w", err) - } - - return nil -} diff --git a/cmd/werf/bundle/export/export_docs.go b/cmd/werf/bundle/export/export_docs.go deleted file mode 100644 index 7afb57948c..0000000000 --- a/cmd/werf/bundle/export/export_docs.go +++ /dev/null @@ -1,18 +0,0 @@ -package export - -import ( - "github.com/werf/werf/v2/cmd/werf/docs/structs" -) - -func GetBundleExportDocs() structs.DocsStruct { - var docs structs.DocsStruct - - docs.Long = `Export bundle into the provided directory (or into directory named as a resulting chart in the current working directory). werf bundle contains built images defined in the werf.yaml, Helm chart, Service values which contain built images tags, any custom values and set values params provided during publish invocation, werf service templates and values.` - - docs.LongMD = "Export bundle into the provided directory (or into directory named as a resulting chart " + - "in the current working directory). `werf bundle` contains built images defined in the `werf.yaml`, " + - "Helm chart, Service values which contain built images tags, any custom values and set values params " + - "provided during publish invocation, werf service templates and values." - - return docs -} diff --git a/cmd/werf/root/root.go b/cmd/werf/root/root.go index bf12a73d55..bb5256a9ac 100644 --- a/cmd/werf/root/root.go +++ b/cmd/werf/root/root.go @@ -11,8 +11,6 @@ import ( "github.com/werf/werf/v2/cmd/werf/build" bundle_apply "github.com/werf/werf/v2/cmd/werf/bundle/apply" bundle_copy "github.com/werf/werf/v2/cmd/werf/bundle/copy" - bundle_download "github.com/werf/werf/v2/cmd/werf/bundle/download" - bundle_export "github.com/werf/werf/v2/cmd/werf/bundle/export" bundle_publish "github.com/werf/werf/v2/cmd/werf/bundle/publish" bundle_render "github.com/werf/werf/v2/cmd/werf/bundle/render" "github.com/werf/werf/v2/cmd/werf/ci_env" @@ -164,8 +162,6 @@ func bundleCmd(ctx context.Context) *cobra.Command { cmd.AddCommand( bundle_publish.NewCmd(ctx), bundle_apply.NewCmd(ctx), - bundle_export.NewCmd(ctx), - bundle_download.NewCmd(ctx), bundle_render.NewCmd(ctx), bundle_copy.NewCmd(ctx), )