From 833a16554338eb3a5a41b86cd8d4b071544d49de Mon Sep 17 00:00:00 2001 From: Andrew Bayer Date: Fri, 10 Jan 2020 12:10:44 -0500 Subject: [PATCH] fix: Cloning for environments shouldn't leave strange state in JX_HOME Until this, `jx delete app`, `jx add app`, and `jx get apps` all did weird things with/under `~/.jx/environments`. All of them used `ForkAndPullRepo` to clone under there - `jx get apps` directly into `~/.jx/environments`, and `jx add app` and `jx delete app` into `~/.jx/environments/dev`. Literally none of this made sense. =) This reworks not just the app commands, but all commands that create PRs (i.e., gitops) against the dev/prod/staging environments to use temporary directories for the fork/clone/push, with the option, just used in tests, of specifying an existing directory to use instead, while `jx get apps` just clones to a temporary directory as well. Switching all this to temporary directories also really helps users who manage/work with multiple JX clusters from a single laptop/desktop/host, since namespacing `~/.jx/environments` by cluster is basically impossible so far as I can tell. Also adds `--auto-merge` to `jx delete app` because I was here. fixes #6350 Signed-off-by: Andrew Bayer --- pkg/apps/gitops.go | 35 +++++++-- pkg/apps/install.go | 47 +++++++----- pkg/cmd/add/add_app.go | 19 +++-- pkg/cmd/add/add_app_test.go | 75 +++++++++++-------- pkg/cmd/deletecmd/delete_app.go | 24 +++--- pkg/cmd/deletecmd/delete_app_test.go | 18 +++-- pkg/cmd/deletecmd/delete_application.go | 13 ++-- pkg/cmd/get/get_apps.go | 22 +++--- pkg/cmd/promote/promote.go | 12 ++- .../scheduler/step_scheduler_config_apply.go | 10 ++- .../step_scheduler_config_apply_test.go | 20 +++-- .../step_scheduler_config_migrate.go | 10 ++- .../step_scheduler_config_migrate_test.go | 6 +- pkg/cmd/testhelpers/app_test_helpers.go | 6 ++ pkg/cmd/upgrade/upgrade_addon_prow.go | 18 +++-- pkg/cmd/upgrade/upgrade_apps.go | 19 +++-- pkg/cmd/upgrade/upgrade_apps_test.go | 41 ++++++---- pkg/environments/gitops.go | 16 +++- pkg/pipelinescheduler/generator.go | 16 ++-- 19 files changed, 262 insertions(+), 165 deletions(-) diff --git a/pkg/apps/gitops.go b/pkg/apps/gitops.go index c32d3be080..a5d72813d8 100644 --- a/pkg/apps/gitops.go +++ b/pkg/apps/gitops.go @@ -42,7 +42,7 @@ func (o *GitOpsOptions) AddApp(app string, dir string, version string, repositor GitProvider: o.GitProvider, } - info, err := options.Create(o.DevEnv, o.EnvironmentsDir, &details, nil, "", autoMerge) + info, err := options.Create(o.DevEnv, o.EnvironmentCloneDir, &details, nil, "", autoMerge) if err != nil { return errors.Wrapf(err, "creating pr for %s", app) } @@ -104,7 +104,8 @@ func (o *GitOpsOptions) UpgradeApp(app string, version string, repository string o.Helmer, inspectChartFunc, o.Verbose, o.valuesFiles), GitProvider: o.GitProvider, } - _, err = options.Create(o.DevEnv, o.EnvironmentsDir, &details, nil, app, autoMerge) + + _, err = options.Create(o.DevEnv, o.EnvironmentCloneDir, &details, nil, app, autoMerge) if err != nil { return err } @@ -156,7 +157,7 @@ func (o *GitOpsOptions) DeleteApp(app string, alias string, autoMerge bool) erro GitProvider: o.GitProvider, } - info, err := options.Create(o.DevEnv, o.EnvironmentsDir, &details, nil, "", autoMerge) + info, err := options.Create(o.DevEnv, o.EnvironmentCloneDir, &details, nil, "", autoMerge) if err != nil { return err } @@ -166,9 +167,33 @@ func (o *GitOpsOptions) DeleteApp(app string, alias string, autoMerge bool) erro // GetApps retrieves all the apps information for the given appNames from the repository and / or the CRD API func (o *GitOpsOptions) GetApps(appNames map[string]bool, expandFn func([]string) (*v1.AppList, error)) (*v1.AppList, error) { - dir, _, _, _, err := gits.ForkAndPullRepo(o.DevEnv.Spec.Source.URL, o.EnvironmentsDir, o.DevEnv.Spec.Source.Ref, "master", o.GitProvider, o.Gitter, "") + dir := o.EnvironmentCloneDir + if dir == "" { + tmpDir, err := ioutil.TempDir("", "get-apps-") + if err != nil { + return nil, err + } + defer os.RemoveAll(tmpDir) + dir = tmpDir + } + + gitInfo, err := gits.ParseGitURL(o.DevEnv.Spec.Source.URL) + if err != nil { + return nil, errors.Wrapf(err, "parsing dev env repo URL %s", o.DevEnv.Spec.Source.URL) + } + + providerInfo, err := o.GitProvider.GetRepository(gitInfo.Organisation, gitInfo.Name) + if err != nil { + return nil, errors.Wrapf(err, "determining git provider information for %s", o.DevEnv.Spec.Source.URL) + } + cloneUrl := providerInfo.CloneURL + err = o.Gitter.Clone(cloneUrl, dir) + if err != nil { + return nil, errors.Wrapf(err, "failed to clone %s to dir %s", cloneUrl, dir) + } + err = o.Gitter.Checkout(dir, o.DevEnv.Spec.Source.Ref) if err != nil { - return nil, errors.Wrapf(err, "couldn't pull the environment repository from %s", o.DevEnv.Name) + return nil, errors.Wrapf(err, "failed to checkout %s to dir %s", o.DevEnv.Spec.Source.Ref, dir) } envDir := filepath.Join(dir, helm.DefaultEnvironmentChartDir) diff --git a/pkg/apps/install.go b/pkg/apps/install.go index 9110cd0561..6b8435fc56 100644 --- a/pkg/apps/install.go +++ b/pkg/apps/install.go @@ -36,24 +36,24 @@ import ( // InstallOptions are shared options for installing, removing or upgrading apps for either GitOps or HelmOps type InstallOptions struct { - Helmer helm.Helmer - KubeClient kubernetes.Interface - InstallTimeout string - JxClient versioned.Interface - Namespace string - EnvironmentsDir string - GitProvider gits.GitProvider - Gitter gits.Gitter - Verbose bool - DevEnv *jenkinsv1.Environment - BatchMode bool - IOFileHandles util.IOFileHandles - GitOps bool - TeamName string - BasePath string - VaultClient vault.Client - AutoMerge bool - SecretsScheme string + Helmer helm.Helmer + KubeClient kubernetes.Interface + InstallTimeout string + JxClient versioned.Interface + Namespace string + EnvironmentCloneDir string + GitProvider gits.GitProvider + Gitter gits.Gitter + Verbose bool + DevEnv *jenkinsv1.Environment + BatchMode bool + IOFileHandles util.IOFileHandles + GitOps bool + TeamName string + BasePath string + VaultClient vault.Client + AutoMerge bool + SecretsScheme string valuesFiles *environments.ValuesFiles // internal variable used to track, most be passed in } @@ -104,7 +104,7 @@ func (o *InstallOptions) AddApp(app string, version string, repository string, u opts := GitOpsOptions{ InstallOptions: o, } - err := opts.AddApp(chartDetails.Name, dir, chartDetails.Version, repository, alias, o.AutoMerge) + err = opts.AddApp(chartDetails.Name, dir, chartDetails.Version, repository, alias, o.AutoMerge) if err != nil { return errors.Wrapf(err, "adding app %s version %s with alias %s using gitops", chartName, version, alias) } @@ -175,6 +175,12 @@ func (o *InstallOptions) DeleteApp(app string, alias string, releaseName string, Items: make([]string, 0), } + // Make sure that we use a temporary directory for GetApps even if we're not using a temporary directory for DeleteApps + var originalEnvDir string + if o.GitOps { + originalEnvDir = o.EnvironmentCloneDir + o.EnvironmentCloneDir = "" + } apps, err := o.GetApps([]string{app}) if err != nil { return errors.WithStack(err) @@ -185,6 +191,9 @@ func (o *InstallOptions) DeleteApp(app string, alias string, releaseName string, chartName := apps.Items[0].Labels[helm.LabelAppName] if o.GitOps { + if originalEnvDir != "" { + o.EnvironmentCloneDir = originalEnvDir + } opts := GitOpsOptions{ InstallOptions: o, } diff --git a/pkg/cmd/add/add_app.go b/pkg/cmd/add/add_app.go index 3708e8f861..5c43ed644e 100644 --- a/pkg/cmd/add/add_app.go +++ b/pkg/cmd/add/add_app.go @@ -40,6 +40,9 @@ type AddAppOptions struct { ValuesFiles []string HelmUpdate bool AutoMerge bool + + // Used for testing + CloneDir string } const ( @@ -141,11 +144,12 @@ func (o *AddAppOptions) Run() error { AutoMerge: o.AutoMerge, SecretsScheme: "vault", - Helmer: o.Helm(), - Namespace: o.Namespace, - KubeClient: kubeClient, - JxClient: jxClient, - InstallTimeout: opts.DefaultInstallTimeout, + Helmer: o.Helm(), + Namespace: o.Namespace, + KubeClient: kubeClient, + JxClient: jxClient, + InstallTimeout: opts.DefaultInstallTimeout, + EnvironmentCloneDir: o.CloneDir, } if o.GitOps { @@ -163,11 +167,6 @@ func (o *AddAppOptions) Run() error { return util.InvalidOptionf(optionValues, o.SetValues, "no more than one --%s can be specified when using GitOps for your dev environment", optionValues) } - environmentsDir, err := o.EnvironmentsDir() - if err != nil { - return errors.Wrapf(err, "getting environments dir") - } - installOpts.EnvironmentsDir = environmentsDir gitProvider, _, err := o.CreateGitProviderForURLWithoutKind(o.DevEnv.Spec.Source.URL) if err != nil { diff --git a/pkg/cmd/add/add_app_test.go b/pkg/cmd/add/add_app_test.go index f4d750a287..b1d1c17791 100644 --- a/pkg/cmd/add/add_app_test.go +++ b/pkg/cmd/add/add_app_test.go @@ -80,6 +80,11 @@ func TestAddAppForGitOps(t *testing.T) { DevEnv: testOptions.DevEnv, HelmUpdate: true, // Flag default when run on CLI } + envDir, err := o.CommonOptions.EnvironmentsDir() + assert.NoError(r, err) + devEnvDir := testOptions.GetFullDevEnvDir(envDir) + o.CloneDir = devEnvDir + helm_test.StubFetchChart(name, "", kube.DefaultChartMuseumURL, &chart.Chart{ Metadata: &chart.Metadata{ Name: name, @@ -96,9 +101,6 @@ func TestAddAppForGitOps(t *testing.T) { assert.Equal(r, fmt.Sprintf("Add %s %s", name, version), pr.Title) assert.Equal(r, fmt.Sprintf("Add app %s %s", name, version), pr.Body) // Validate the branch name - envDir, err := o.CommonOptions.EnvironmentsDir() - assert.NoError(r, err) - devEnvDir := testOptions.GetFullDevEnvDir(envDir) branchName, err := o.Git().Branch(devEnvDir) assert.NoError(r, err) assert.Equal(r, fmt.Sprintf("add-app-%s-%s", name, version), branchName) @@ -153,6 +155,11 @@ func TestAddAppForGitOpsWithShortName(t *testing.T) { DevEnv: testOptions.DevEnv, HelmUpdate: true, // Flag default when run on CLI } + envDir, err := o.CommonOptions.EnvironmentsDir() + assert.NoError(r, err) + devEnvDir := testOptions.GetFullDevEnvDir(envDir) + o.CloneDir = devEnvDir + pegomock.When(testOptions.MockHelmer.ListRepos()).ThenReturn( map[string]string{ "repo1": kube.DefaultChartMuseumURL, @@ -181,9 +188,6 @@ func TestAddAppForGitOpsWithShortName(t *testing.T) { assert.Equal(r, fmt.Sprintf("Add %s %s", name, version), pr.Title) assert.Equal(r, fmt.Sprintf("Add app %s %s", name, version), pr.Body) // Validate the branch name - envDir, err := o.CommonOptions.EnvironmentsDir() - assert.NoError(r, err) - devEnvDir := testOptions.GetFullDevEnvDir(envDir) branchName, err := o.Git().Branch(devEnvDir) assert.NoError(r, err) assert.Equal(r, fmt.Sprintf("add-app-%s-%s", name, version), branchName) @@ -608,6 +612,10 @@ func TestAddAppForGitOpsWithSecrets(t *testing.T) { } o.Args = []string{name} o.BatchMode = false + envDir, err := o.CommonOptions.EnvironmentsDir() + assert.NoError(r, err) + devEnvDir := testOptions.GetFullDevEnvDir(envDir) + o.CloneDir = devEnvDir helm_test.StubFetchChart(name, "", kube.DefaultChartMuseumURL, &chart.Chart{ Metadata: &chart.Metadata{ @@ -651,9 +659,7 @@ func TestAddAppForGitOpsWithSecrets(t *testing.T) { r.Logf(expect.StripTrailingEmptyLines(console.CurrentState())) // Validate that the secret reference is generated - envDir, err := o.CommonOptions.EnvironmentsDir() - assert.NoError(r, err) - valuesFromPrPath := filepath.Join(testOptions.GetFullDevEnvDir(envDir), name, helm.ValuesFileName) + valuesFromPrPath := filepath.Join(devEnvDir, name, helm.ValuesFileName) _, err = os.Stat(valuesFromPrPath) assert.NoError(r, err) data, err := ioutil.ReadFile(valuesFromPrPath) @@ -961,12 +967,13 @@ func TestAddAppWithValuesFileForGitOps(t *testing.T) { ValuesFiles: []string{file.Name()}, } o.Args = []string{name} - err = o.Run() - assert.NoError(t, err) - // Validate that the values.yaml file is in the right place envDir, err := o.CommonOptions.EnvironmentsDir() assert.NoError(t, err) devEnvDir := testOptions.GetFullDevEnvDir(envDir) + o.CloneDir = devEnvDir + err = o.Run() + assert.NoError(t, err) + // Validate that the values.yaml file is in the right place valuesFromPrPath := filepath.Join(devEnvDir, name, helm.ValuesFileName) _, err = os.Stat(valuesFromPrPath) assert.NoError(t, err) @@ -1017,6 +1024,10 @@ func TestAddAppWithReadmeForGitOps(t *testing.T) { HelmUpdate: true, // Flag default when run on CLI } o.Args = []string{name} + envDir, err := o.CommonOptions.EnvironmentsDir() + assert.NoError(t, err) + devEnvDir := testOptions.GetFullDevEnvDir(envDir) + o.CloneDir = devEnvDir helm_test.StubFetchChart(name, "", kube.DefaultChartMuseumURL, &chart.Chart{ Metadata: &chart.Metadata{ Name: name, @@ -1033,9 +1044,6 @@ func TestAddAppWithReadmeForGitOps(t *testing.T) { err = o.Run() assert.NoError(t, err) // Validate that the README.md file is in the right place - envDir, err := o.CommonOptions.EnvironmentsDir() - assert.NoError(t, err) - devEnvDir := testOptions.GetFullDevEnvDir(envDir) readmeFromPrPath := filepath.Join(devEnvDir, name, "README.MD") _, err = os.Stat(readmeFromPrPath) assert.NoError(t, err) @@ -1090,6 +1098,10 @@ func TestAddAppWithCustomReadmeForGitOps(t *testing.T) { } o.Verbose = true o.Args = []string{name} + envDir, err := o.CommonOptions.EnvironmentsDir() + assert.NoError(t, err) + devEnvDir := testOptions.GetFullDevEnvDir(envDir) + o.CloneDir = devEnvDir readmeFileName := "README.MD" readme := "Tasty Cheese!\n" helm_test.StubFetchChart(name, "", kube.DefaultChartMuseumURL, &chart.Chart{ @@ -1107,9 +1119,6 @@ func TestAddAppWithCustomReadmeForGitOps(t *testing.T) { err = o.Run() assert.NoError(t, err) // Validate that the README.md file is in the right place - envDir, err := o.CommonOptions.EnvironmentsDir() - assert.NoError(t, err) - devEnvDir := testOptions.GetFullDevEnvDir(envDir) readmeFromPrPath := filepath.Join(devEnvDir, name, readmeFileName) _, err = os.Stat(readmeFromPrPath) assert.NoError(t, err) @@ -1154,6 +1163,10 @@ func TestAddLatestAppForGitOps(t *testing.T) { } o.Args = []string{name} o.Verbose = true + envDir, err := o.CommonOptions.EnvironmentsDir() + assert.NoError(t, err) + devEnvDir := testOptions.GetFullDevEnvDir(envDir) + o.CloneDir = devEnvDir helm_test.StubFetchChart(name, "", kube.DefaultChartMuseumURL, &chart.Chart{ Metadata: &chart.Metadata{ @@ -1170,9 +1183,6 @@ func TestAddLatestAppForGitOps(t *testing.T) { assert.Equal(t, fmt.Sprintf("Add %s %s", name, version), pr.Title) assert.Equal(t, fmt.Sprintf("Add app %s %s", name, version), pr.Body) // Validate the branch name - envDir, err := o.CommonOptions.EnvironmentsDir() - assert.NoError(t, err) - devEnvDir := testOptions.GetFullDevEnvDir(envDir) branchName, err := o.Git().Branch(devEnvDir) assert.NoError(t, err) assert.Equal(t, fmt.Sprintf("add-app-%s-%s", name, version), branchName) @@ -1224,6 +1234,10 @@ func TestAddAppIncludingConditionalQuestionsForGitOps(t *testing.T) { } o.Args = []string{name} o.BatchMode = false + envDir, err := o.CommonOptions.EnvironmentsDir() + assert.NoError(t, err) + devEnvDir := testOptions.GetFullDevEnvDir(envDir) + o.CloneDir = devEnvDir helm_test.StubFetchChart(name, "", kube.DefaultChartMuseumURL, &chart.Chart{ Metadata: &chart.Metadata{ @@ -1275,9 +1289,7 @@ func TestAddAppIncludingConditionalQuestionsForGitOps(t *testing.T) { <-donec r.Logf(expect.StripTrailingEmptyLines(console.CurrentState())) - envDir, err := o.CommonOptions.EnvironmentsDir() - assert.NoError(r, err) - valuesFromPrPath := filepath.Join(testOptions.GetFullDevEnvDir(envDir), name, helm.ValuesFileName) + valuesFromPrPath := filepath.Join(devEnvDir, name, helm.ValuesFileName) _, err = os.Stat(valuesFromPrPath) assert.NoError(r, err) data, err := ioutil.ReadFile(valuesFromPrPath) @@ -1333,6 +1345,10 @@ func TestAddAppExcludingConditionalQuestionsForGitOps(t *testing.T) { } o.Args = []string{name} o.BatchMode = false + envDir, err := o.CommonOptions.EnvironmentsDir() + assert.NoError(t, err) + devEnvDir := testOptions.GetFullDevEnvDir(envDir) + o.CloneDir = devEnvDir helm_test.StubFetchChart(name, "", kube.DefaultChartMuseumURL, &chart.Chart{ Metadata: &chart.Metadata{ @@ -1375,9 +1391,7 @@ func TestAddAppExcludingConditionalQuestionsForGitOps(t *testing.T) { <-donec r.Logf(expect.StripTrailingEmptyLines(console.CurrentState())) - envDir, err := o.CommonOptions.EnvironmentsDir() - assert.NoError(r, err) - valuesFromPrPath := filepath.Join(testOptions.GetFullDevEnvDir(envDir), name, helm.ValuesFileName) + valuesFromPrPath := filepath.Join(devEnvDir, name, helm.ValuesFileName) _, err = os.Stat(valuesFromPrPath) assert.NoError(r, err) data, err := ioutil.ReadFile(valuesFromPrPath) @@ -1415,6 +1429,10 @@ func TestAddAppForGitOpsWithSNAPSHOTVersion(t *testing.T) { DevEnv: testOptions.DevEnv, HelmUpdate: true, // Flag default when run on CLI } + envDir, err := o.CommonOptions.EnvironmentsDir() + assert.NoError(r, err) + devEnvDir := testOptions.GetFullDevEnvDir(envDir) + o.CloneDir = devEnvDir pegomock.When(testOptions.MockHelmer.ListRepos()).ThenReturn( map[string]string{ "repo1": kube.DefaultChartMuseumURL, @@ -1443,9 +1461,6 @@ func TestAddAppForGitOpsWithSNAPSHOTVersion(t *testing.T) { assert.Equal(r, fmt.Sprintf("Add %s %s", name, version), pr.Title) assert.Equal(r, fmt.Sprintf("Add app %s %s", name, version), pr.Body) // Validate the branch name - envDir, err := o.CommonOptions.EnvironmentsDir() - assert.NoError(r, err) - devEnvDir := testOptions.GetFullDevEnvDir(envDir) branchName, err := o.Git().Branch(devEnvDir) assert.NoError(r, err) assert.Equal(r, fmt.Sprintf("add-app-%s-%s", name, version), branchName) diff --git a/pkg/cmd/deletecmd/delete_app.go b/pkg/cmd/deletecmd/delete_app.go index e06e7b032f..cecf8709a9 100644 --- a/pkg/cmd/deletecmd/delete_app.go +++ b/pkg/cmd/deletecmd/delete_app.go @@ -45,6 +45,10 @@ type DeleteAppOptions struct { Namespace string Purge bool Alias string + AutoMerge bool + + // Used for testing + CloneDir string } // NewCmdDeleteApp creates a command object for this command @@ -73,6 +77,7 @@ func NewCmdDeleteApp(commonOpts *opts.CommonOptions) *cobra.Command { cmd.Flags().StringVarP(&o.Namespace, opts.OptionNamespace, "n", defaultNamespace, "The Namespace to install into (available when NOT using GitOps for your dev environment)") cmd.Flags().StringVarP(&o.Alias, opts.OptionAlias, "", "", "An alias to use for the app (available when using GitOps for your dev environment)") + cmd.Flags().BoolVarP(&o.AutoMerge, "auto-merge", "", false, "Automatically merge GitOps pull requests that pass CI") return cmd } @@ -82,12 +87,14 @@ func (o *DeleteAppOptions) Run() error { o.GitOps, o.DevEnv = o.GetDevEnv() installOptions := apps.InstallOptions{ - IOFileHandles: o.GetIOFileHandles(), - DevEnv: o.DevEnv, - Verbose: o.Verbose, - GitOps: o.GitOps, - BatchMode: o.BatchMode, - Helmer: o.Helm(), + IOFileHandles: o.GetIOFileHandles(), + DevEnv: o.DevEnv, + Verbose: o.Verbose, + GitOps: o.GitOps, + BatchMode: o.BatchMode, + Helmer: o.Helm(), + AutoMerge: o.AutoMerge, + EnvironmentCloneDir: o.CloneDir, } if o.GitOps { @@ -102,13 +109,8 @@ func (o *DeleteAppOptions) Run() error { if err != nil { return errors.Wrapf(err, "creating git provider for %s", o.DevEnv.Spec.Source.URL) } - environmentsDir, err := o.EnvironmentsDir() - if err != nil { - return errors.Wrapf(err, "getting environments dir") - } installOptions.GitProvider = gitProvider installOptions.Gitter = o.Git() - installOptions.EnvironmentsDir = environmentsDir } if !o.GitOps { err := o.EnsureHelm() diff --git a/pkg/cmd/deletecmd/delete_app_test.go b/pkg/cmd/deletecmd/delete_app_test.go index 9c3cf24584..b62a143ca0 100644 --- a/pkg/cmd/deletecmd/delete_app_test.go +++ b/pkg/cmd/deletecmd/delete_app_test.go @@ -44,6 +44,11 @@ func TestDeleteAppForGitOps(t *testing.T) { Alias: alias, } o.Args = []string{name} + // Validate the branch name + envDir, err := o.CommonOptions.EnvironmentsDir() + assert.NoError(t, err) + devEnvDir := testOptions.GetFullDevEnvDir(envDir) + o.CloneDir = devEnvDir err = o.Run() assert.NoError(t, err) @@ -53,10 +58,6 @@ func TestDeleteAppForGitOps(t *testing.T) { // Validate the PR has the right title, message assert.Equal(t, fmt.Sprintf("Delete %s", name), pr.Title) assert.Equal(t, fmt.Sprintf("Delete app %s", name), pr.Body) - // Validate the branch name - envDir, err := o.CommonOptions.EnvironmentsDir() - assert.NoError(t, err) - devEnvDir := testOptions.GetFullDevEnvDir(envDir) branchName, err := o.Git().Branch(devEnvDir) assert.NoError(t, err) assert.Equal(t, fmt.Sprintf("delete-app-%s", name), branchName) @@ -89,6 +90,11 @@ func TestDeleteAppWithShortNameForGitOps(t *testing.T) { Alias: alias, } o.Args = []string{shortName} + // Validate the branch name + envDir, err := o.CommonOptions.EnvironmentsDir() + assert.NoError(t, err) + devEnvDir := testOptions.GetFullDevEnvDir(envDir) + o.CloneDir = devEnvDir err = o.Run() assert.NoError(t, err) @@ -98,10 +104,6 @@ func TestDeleteAppWithShortNameForGitOps(t *testing.T) { // Validate the PR has the right title, message assert.Equal(t, fmt.Sprintf("Delete %s", name), pr.Title) assert.Equal(t, fmt.Sprintf("Delete app %s", name), pr.Body) - // Validate the branch name - envDir, err := o.CommonOptions.EnvironmentsDir() - assert.NoError(t, err) - devEnvDir := testOptions.GetFullDevEnvDir(envDir) branchName, err := o.Git().Branch(devEnvDir) assert.NoError(t, err) assert.Equal(t, fmt.Sprintf("delete-app-%s", name), branchName) diff --git a/pkg/cmd/deletecmd/delete_application.go b/pkg/cmd/deletecmd/delete_application.go index df815fee93..9135f157cc 100644 --- a/pkg/cmd/deletecmd/delete_application.go +++ b/pkg/cmd/deletecmd/delete_application.go @@ -75,6 +75,9 @@ type DeleteApplicationOptions struct { // calculated fields TimeoutDuration *time.Duration PullRequestPollDuration *time.Duration + + // Used for testing + CloneDir string } // NewCmdDeleteApplication creates a command object for this command @@ -406,11 +409,11 @@ func (o *DeleteApplicationOptions) deleteApplicationFromEnvironment(env *v1.Envi if err != nil { return errors.Wrapf(err, "creating git provider for %s", env.Spec.Source.URL) } - environmentsDir, err := o.EnvironmentsDir() - if err != nil { - return errors.Wrapf(err, "getting environments dir") - } + envDir := "" + if o.CloneDir != "" { + envDir = o.CloneDir + } details := gits.PullRequestDetails{ BranchName: "delete-" + applicationName, Title: "Delete application " + applicationName + " from this environment", @@ -421,7 +424,7 @@ func (o *DeleteApplicationOptions) deleteApplicationFromEnvironment(env *v1.Envi ModifyChartFn: modifyChartFn, GitProvider: gitProvider, } - info, err := options.Create(env, environmentsDir, &details, nil, "", o.AutoMerge) + info, err := options.Create(env, envDir, &details, nil, "", o.AutoMerge) if err != nil { return err } diff --git a/pkg/cmd/get/get_apps.go b/pkg/cmd/get/get_apps.go index 570017cd30..210be8fa8a 100644 --- a/pkg/cmd/get/get_apps.go +++ b/pkg/cmd/get/get_apps.go @@ -26,6 +26,9 @@ type GetAppsOptions struct { ShowStatus bool GitOps bool DevEnv *v1.Environment + + // Used for testing + CloneDir string } type appsResult struct { @@ -118,14 +121,14 @@ func (o *GetAppsOptions) Run() error { return errors.Wrap(err, "getting the the GitOps environments dir") } installOptions := apps.InstallOptions{ - IOFileHandles: o.GetIOFileHandles(), - DevEnv: o.DevEnv, - Verbose: o.Verbose, - GitOps: o.GitOps, - BatchMode: o.BatchMode, - Helmer: o.Helm(), - JxClient: jxClient, - EnvironmentsDir: envsDir, + IOFileHandles: o.GetIOFileHandles(), + DevEnv: o.DevEnv, + Verbose: o.Verbose, + GitOps: o.GitOps, + BatchMode: o.BatchMode, + Helmer: o.Helm(), + JxClient: jxClient, + EnvironmentCloneDir: envsDir, } if o.GetSecretsLocation() == secrets.VaultLocationKind { @@ -150,10 +153,9 @@ func (o *GetAppsOptions) Run() error { if err != nil { return errors.Wrapf(err, "creating git provider for %s", o.DevEnv.Spec.Source.URL) } - environmentsDir := envsDir installOptions.GitProvider = gitProvider installOptions.Gitter = o.Git() - installOptions.EnvironmentsDir = environmentsDir + installOptions.EnvironmentCloneDir = o.CloneDir } apps, err := installOptions.GetApps(o.Args) diff --git a/pkg/cmd/promote/promote.go b/pkg/cmd/promote/promote.go index 0637681e6c..0eebe7d130 100644 --- a/pkg/cmd/promote/promote.go +++ b/pkg/cmd/promote/promote.go @@ -80,6 +80,9 @@ type PromoteOptions struct { releaseResource *v1.Release ReleaseInfo *ReleaseInfo prow bool + + // Used for testing + CloneDir string } type ReleaseInfo struct { @@ -560,9 +563,10 @@ func (o *PromoteOptions) PromoteViaPullRequest(env *v1.Environment, releaseInfo if err != nil { return errors.Wrapf(err, "creating git provider for %s", env.Spec.Source.URL) } - environmentsDir, err := o.EnvironmentsDir() - if err != nil { - return errors.Wrapf(err, "getting environments dir") + + envDir := "" + if o.CloneDir != "" { + envDir = o.CloneDir } options := environments.EnvironmentPullRequestOptions{ @@ -574,7 +578,7 @@ func (o *PromoteOptions) PromoteViaPullRequest(env *v1.Environment, releaseInfo if releaseInfo.PullRequestInfo != nil && releaseInfo.PullRequestInfo.PullRequest != nil { filter.Number = releaseInfo.PullRequestInfo.PullRequest.Number } - info, err := options.Create(env, environmentsDir, &details, filter, "", true) + info, err := options.Create(env, envDir, &details, filter, "", true) releaseInfo.PullRequestInfo = info return err } diff --git a/pkg/cmd/step/scheduler/step_scheduler_config_apply.go b/pkg/cmd/step/scheduler/step_scheduler_config_apply.go index 3c02e68326..a5cc32ddc5 100644 --- a/pkg/cmd/step/scheduler/step_scheduler_config_apply.go +++ b/pkg/cmd/step/scheduler/step_scheduler_config_apply.go @@ -15,6 +15,9 @@ type StepSchedulerConfigApplyOptions struct { step.StepOptions Agent string ApplyDirectly bool + + // Used for testing + CloneDir string } var ( @@ -81,11 +84,10 @@ func (o *StepSchedulerConfigApplyOptions) Run() error { Verbose: o.Verbose, DevEnv: devEnv, } - environmentsDir, err := o.EnvironmentsDir() - if err != nil { - return errors.Wrapf(err, "getting environments dir") + opts.PullRequestCloneDir = "" + if o.CloneDir != "" { + opts.PullRequestCloneDir = o.CloneDir } - opts.EnvironmentsDir = environmentsDir gitProvider, _, err := o.CreateGitProviderForURLWithoutKind(devEnv.Spec.Source.URL) if err != nil { diff --git a/pkg/cmd/step/scheduler/step_scheduler_config_apply_test.go b/pkg/cmd/step/scheduler/step_scheduler_config_apply_test.go index a7b74c3770..3d3dfc63cb 100644 --- a/pkg/cmd/step/scheduler/step_scheduler_config_apply_test.go +++ b/pkg/cmd/step/scheduler/step_scheduler_config_apply_test.go @@ -98,11 +98,12 @@ func TestStepSchedulerConfigApplyGitopsAll(t *testing.T) { err := testhelpers.CleanupTestKubeConfigDir(originalKubeCfg, tempKubeCfg) assert.NoError(t, err) }() - err = testOptions.StepSchedulerConfigApplyOptions.Run() - assert.NoError(t, err) envDir, err := testOptions.StepSchedulerConfigApplyOptions.CommonOptions.EnvironmentsDir() assert.NoError(t, err) devEnvDir := filepath.Join(envDir, testOptions.DevEnvName) + testOptions.StepSchedulerConfigApplyOptions.CloneDir = devEnvDir + err = testOptions.StepSchedulerConfigApplyOptions.Run() + assert.NoError(t, err) verifyProwGitopsConfig(err, testOptions, devEnvDir, t) } @@ -123,11 +124,12 @@ func TestStepSchedulerConfigApplyGitopsDefaultScheduler(t *testing.T) { err := testhelpers.CleanupTestKubeConfigDir(originalKubeCfg, tempKubeCfg) assert.NoError(t, err) }() - err = testOptions.StepSchedulerConfigApplyOptions.Run() - assert.NoError(t, err) envDir, err := testOptions.StepSchedulerConfigApplyOptions.CommonOptions.EnvironmentsDir() assert.NoError(t, err) devEnvDir := filepath.Join(envDir, testOptions.DevEnvName) + testOptions.StepSchedulerConfigApplyOptions.CloneDir = devEnvDir + err = testOptions.StepSchedulerConfigApplyOptions.Run() + assert.NoError(t, err) verifyProwGitopsConfig(err, testOptions, devEnvDir, t) } @@ -148,11 +150,12 @@ func TestStepSchedulerConfigApplyGitopsRepoScheduler(t *testing.T) { err := testhelpers.CleanupTestKubeConfigDir(originalKubeCfg, tempKubeCfg) assert.NoError(t, err) }() - err = testOptions.StepSchedulerConfigApplyOptions.Run() - assert.NoError(t, err) envDir, err := testOptions.StepSchedulerConfigApplyOptions.CommonOptions.EnvironmentsDir() assert.NoError(t, err) devEnvDir := filepath.Join(envDir, testOptions.DevEnvName) + testOptions.StepSchedulerConfigApplyOptions.CloneDir = devEnvDir + err = testOptions.StepSchedulerConfigApplyOptions.Run() + assert.NoError(t, err) verifyProwGitopsConfig(err, testOptions, devEnvDir, t) } @@ -173,11 +176,12 @@ func TestStepSchedulerConfigApplyGitopsRepoGroupScheduler(t *testing.T) { err := testhelpers.CleanupTestKubeConfigDir(originalKubeCfg, tempKubeCfg) assert.NoError(t, err) }() - err = testOptions.StepSchedulerConfigApplyOptions.Run() - assert.NoError(t, err) envDir, err := testOptions.StepSchedulerConfigApplyOptions.CommonOptions.EnvironmentsDir() assert.NoError(t, err) devEnvDir := filepath.Join(envDir, testOptions.DevEnvName) + testOptions.StepSchedulerConfigApplyOptions.CloneDir = devEnvDir + err = testOptions.StepSchedulerConfigApplyOptions.Run() + assert.NoError(t, err) verifyProwGitopsConfig(err, testOptions, devEnvDir, t) } diff --git a/pkg/cmd/step/scheduler/step_scheduler_config_migrate.go b/pkg/cmd/step/scheduler/step_scheduler_config_migrate.go index d40aefc0d7..74fc09822f 100644 --- a/pkg/cmd/step/scheduler/step_scheduler_config_migrate.go +++ b/pkg/cmd/step/scheduler/step_scheduler_config_migrate.go @@ -19,6 +19,9 @@ type StepSchedulerConfigMigrateOptions struct { ProwPluginsFileLocation string SkipVerification bool DryRun bool + + // Used for testing + CloneDir string } var ( @@ -98,11 +101,10 @@ func (o *StepSchedulerConfigMigrateOptions) Run() error { Verbose: o.Verbose, DevEnv: devEnv, } - environmentsDir, err := o.EnvironmentsDir() - if err != nil { - return errors.Wrapf(err, "getting environments dir") + opts.PullRequestCloneDir = "" + if o.CloneDir != "" { + opts.PullRequestCloneDir = o.CloneDir } - opts.EnvironmentsDir = environmentsDir gitProvider, _, err := o.CreateGitProviderForURLWithoutKind(devEnv.Spec.Source.URL) if err != nil { diff --git a/pkg/cmd/step/scheduler/step_scheduler_config_migrate_test.go b/pkg/cmd/step/scheduler/step_scheduler_config_migrate_test.go index 5487c73550..7960e9d9a7 100644 --- a/pkg/cmd/step/scheduler/step_scheduler_config_migrate_test.go +++ b/pkg/cmd/step/scheduler/step_scheduler_config_migrate_test.go @@ -67,10 +67,12 @@ func TestStepSchedulerConfigMigrateGitopsBasic(t *testing.T) { testOptions.createSchedulerMigrateTestOptions("gitops_basic", true, t) testOptions.StepSchedulerConfigMigrateOptions.ProwConfigFileLocation = "test_data/step_scheduler_config_migrate/" + testOptions.TestType + "/config.yaml" testOptions.StepSchedulerConfigMigrateOptions.ProwPluginsFileLocation = "test_data/step_scheduler_config_migrate/" + testOptions.TestType + "/plugins.yaml" - err := testOptions.StepSchedulerConfigMigrateOptions.Run() - assert.NoError(t, err) envDir, err := testOptions.StepSchedulerConfigMigrateOptions.CommonOptions.EnvironmentsDir() + assert.NoError(t, err) devEnvDir := filepath.Join(envDir, testOptions.DevEnvName) + testOptions.StepSchedulerConfigMigrateOptions.CloneDir = devEnvDir + err = testOptions.StepSchedulerConfigMigrateOptions.Run() + assert.NoError(t, err) verifySchedulerGitOps(err, t, testOptions, devEnvDir, "cb-kubecd-jx-scheduler-test-group-repo-scheduler") verifySchedulerGitOps(err, t, testOptions, devEnvDir, "cb-kubecd-jx-scheduler-test-repo-scheduler") verifySchedulerGitOps(err, t, testOptions, devEnvDir, "default-scheduler") diff --git a/pkg/cmd/testhelpers/app_test_helpers.go b/pkg/cmd/testhelpers/app_test_helpers.go index a09bba9e67..7b08ac67dc 100644 --- a/pkg/cmd/testhelpers/app_test_helpers.go +++ b/pkg/cmd/testhelpers/app_test_helpers.go @@ -87,6 +87,12 @@ func (o *AppTestOptions) AddApp(values map[string]interface{}, prefix string) (s }, }, o.MockHelmer) installOpts.Args = []string{name} + envDir, err := o.CommonOptions.EnvironmentsDir() + if err != nil { + return "", "", "", errors.WithStack(err) + } + devEnvDir := o.GetFullDevEnvDir(envDir) + installOpts.CloneDir = devEnvDir err = installOpts.Run() if err != nil { return "", "", "", errors.WithStack(err) diff --git a/pkg/cmd/upgrade/upgrade_addon_prow.go b/pkg/cmd/upgrade/upgrade_addon_prow.go index 58b33404b2..3fd4624cf7 100644 --- a/pkg/cmd/upgrade/upgrade_addon_prow.go +++ b/pkg/cmd/upgrade/upgrade_addon_prow.go @@ -42,6 +42,9 @@ type UpgradeAddonProwOptions struct { newKnativeBuildVersion string Tekton bool ExternalDNS bool + + // Used for testing + CloneDir string } // NewCmdUpgradeAddonProw defines the command @@ -189,11 +192,6 @@ func (o *UpgradeAddonProwOptions) Upgrade() error { // UpgradeViaGitOps func (o *UpgradeAddonProwOptions) UpgradeViaGitOps(devEnv *jenkinsv1.Environment) error { - environmentsDir, err := o.EnvironmentsDir() - if err != nil { - return errors.Wrapf(err, "getting environments dir") - } - gitProvider, _, err := o.CreateGitProviderForURLWithoutKind(devEnv.Spec.Source.URL) if err != nil { return errors.Wrapf(err, "creating git provider for %s", devEnv.Spec.Source.URL) @@ -201,8 +199,6 @@ func (o *UpgradeAddonProwOptions) UpgradeViaGitOps(devEnv *jenkinsv1.Environment log.Logger().Debugf("Git URL %s", devEnv.Spec.Source.URL) - log.Logger().Debugf("Environment Dir %s", environmentsDir) - prowVersion, err := o.GetVersionNumber(versionstream.KindChart, "jenkins-x/prow", "", "") log.Logger().Infof("About to upgrade prow to version %s", prowVersion) @@ -243,12 +239,18 @@ func (o *UpgradeAddonProwOptions) UpgradeViaGitOps(devEnv *jenkinsv1.Environment return nil } + envDir := "" + + if o.CloneDir != "" { + envDir = o.CloneDir + } + options := environments.EnvironmentPullRequestOptions{ Gitter: o.Git(), ModifyChartFn: modifyChartFn, GitProvider: gitProvider, } - _, err = options.Create(devEnv, environmentsDir, details, nil, "", false) + _, err = options.Create(devEnv, envDir, details, nil, "", false) if err != nil { return errors.Wrapf(err, "failed to create a pull request to update prow version") } diff --git a/pkg/cmd/upgrade/upgrade_apps.go b/pkg/cmd/upgrade/upgrade_apps.go index ae4a9316b0..508379c7ab 100644 --- a/pkg/cmd/upgrade/upgrade_apps.go +++ b/pkg/cmd/upgrade/upgrade_apps.go @@ -60,6 +60,9 @@ type UpgradeAppsOptions struct { Namespace string Set []string + + // Used for testing + CloneDir string } // NewCmdUpgradeApps defines the command @@ -132,11 +135,12 @@ func (o *UpgradeAppsOptions) Run() error { AutoMerge: o.AutoMerge, SecretsScheme: "vault", - Helmer: o.Helm(), - Namespace: o.Namespace, - KubeClient: kubeClient, - JxClient: jxClient, - InstallTimeout: opts.DefaultInstallTimeout, + Helmer: o.Helm(), + Namespace: o.Namespace, + KubeClient: kubeClient, + JxClient: jxClient, + InstallTimeout: opts.DefaultInstallTimeout, + EnvironmentCloneDir: o.CloneDir, } if o.Namespace != "" { installOpts.Namespace = o.Namespace @@ -158,11 +162,6 @@ func (o *UpgradeAppsOptions) Run() error { if !o.HelmUpdate { return util.InvalidOptionf(optionHelmUpdate, o.HelmUpdate, msg, optionHelmUpdate) } - environmentsDir, err := o.EnvironmentsDir() - if err != nil { - return errors.Wrapf(err, "getting environments dir") - } - installOpts.EnvironmentsDir = environmentsDir gitProvider, _, err := o.CreateGitProviderForURLWithoutKind(o.DevEnv.Spec.Source.URL) if err != nil { diff --git a/pkg/cmd/upgrade/upgrade_apps_test.go b/pkg/cmd/upgrade/upgrade_apps_test.go index 02bef137fe..6ebf7e51ce 100644 --- a/pkg/cmd/upgrade/upgrade_apps_test.go +++ b/pkg/cmd/upgrade/upgrade_apps_test.go @@ -58,6 +58,10 @@ func TestUpgradeAppForGitOps(t *testing.T) { DevEnv: testOptions.DevEnv, } o.Args = []string{name} + envDir, err := o.CommonOptions.EnvironmentsDir() + assert.NoError(t, err) + devEnvDir := testOptions.GetFullDevEnvDir(envDir) + o.CloneDir = devEnvDir helm_test.StubFetchChart(name, newVersion.String(), helm.FakeChartmusuem, &chart.Chart{ Metadata: &chart.Metadata{ @@ -75,9 +79,6 @@ func TestUpgradeAppForGitOps(t *testing.T) { assert.Equal(t, fmt.Sprintf("Upgrade %s to %s", name, newVersion.String()), pr.Title) assert.Equal(t, fmt.Sprintf("Upgrade %s from %s to %s", name, version, newVersion.String()), pr.Body) // Validate the branch name - envDir, err := o.CommonOptions.EnvironmentsDir() - assert.NoError(t, err) - devEnvDir := testOptions.GetFullDevEnvDir(envDir) branchName, err := o.Git().Branch(devEnvDir) assert.NoError(t, err) assert.Equal(t, fmt.Sprintf("upgrade-app-%s-%s", name, newVersion.String()), branchName[:len(branchName)-6]) @@ -121,6 +122,11 @@ func TestUpgradeAppWithShortNameForGitOps(t *testing.T) { HelmUpdate: true, DevEnv: testOptions.DevEnv, } + envDir, err := o.CommonOptions.EnvironmentsDir() + assert.NoError(t, err) + devEnvDir := testOptions.GetFullDevEnvDir(envDir) + o.CloneDir = devEnvDir + pegomock.When(testOptions.MockHelmer.ListRepos()).ThenReturn( map[string]string{ "repo1": kube.DefaultChartMuseumURL, @@ -153,9 +159,6 @@ func TestUpgradeAppWithShortNameForGitOps(t *testing.T) { assert.Equal(t, fmt.Sprintf("Upgrade %s to %s", name, newVersion.String()), pr.Title) assert.Equal(t, fmt.Sprintf("Upgrade %s from %s to %s", name, version, newVersion.String()), pr.Body) // Validate the branch name - envDir, err := o.CommonOptions.EnvironmentsDir() - assert.NoError(t, err) - devEnvDir := testOptions.GetFullDevEnvDir(envDir) branchName, err := o.Git().Branch(devEnvDir) assert.NoError(t, err) assert.Equal(t, fmt.Sprintf("upgrade-app-%s-%s", name, newVersion.String()), branchName[:len(branchName)-6]) @@ -196,7 +199,8 @@ func TestUpgradeAppWithExistingAndDefaultAnswersForGitOpsInBatchMode(t *testing. envDir, err := testOptions.CommonOptions.EnvironmentsDir() assert.NoError(r, err) - appDir := filepath.Join(testOptions.GetFullDevEnvDir(envDir), name) + devEnvDir := testOptions.GetFullDevEnvDir(envDir) + appDir := filepath.Join(devEnvDir, name) // Now let's upgrade @@ -214,6 +218,7 @@ func TestUpgradeAppWithExistingAndDefaultAnswersForGitOpsInBatchMode(t *testing. HelmUpdate: true, DevEnv: testOptions.DevEnv, } + o.CloneDir = devEnvDir o.Args = []string{name} helm_test.StubFetchChart(name, newVersion.String(), @@ -282,7 +287,8 @@ func TestUpgradeAppWithExistingAndDefaultAnswersForGitOps(t *testing.T) { envDir, err := testOptions.CommonOptions.EnvironmentsDir() assert.NoError(r, err) - appDir := filepath.Join(testOptions.GetFullDevEnvDir(envDir), name) + devEnvDir := testOptions.GetFullDevEnvDir(envDir) + appDir := filepath.Join(devEnvDir, name) // Now let's upgrade newVersion, err := semver.Parse(version) @@ -299,6 +305,7 @@ func TestUpgradeAppWithExistingAndDefaultAnswersForGitOps(t *testing.T) { HelmUpdate: true, DevEnv: testOptions.DevEnv, } + o.CloneDir = devEnvDir o.Args = []string{name} o.BatchMode = false @@ -380,7 +387,8 @@ func TestUpgradeAppWithExistingAndDefaultAnswersAndAskAllForGitOps(t *testing.T) envDir, err := testOptions.CommonOptions.EnvironmentsDir() assert.NoError(r, err) - appDir := filepath.Join(testOptions.GetFullDevEnvDir(envDir), name) + devEnvDir := testOptions.GetFullDevEnvDir(envDir) + appDir := filepath.Join(devEnvDir, name) // Now let's upgrade @@ -399,6 +407,7 @@ func TestUpgradeAppWithExistingAndDefaultAnswersAndAskAllForGitOps(t *testing.T) DevEnv: testOptions.DevEnv, AskAll: true, } + o.CloneDir = devEnvDir o.Args = []string{name} o.BatchMode = false @@ -562,6 +571,10 @@ func TestUpgradeAppToLatestForGitOps(t *testing.T) { DevEnv: testOptions.DevEnv, } o.Args = []string{name} + envDir, err := o.CommonOptions.EnvironmentsDir() + assert.NoError(t, err) + devEnvDir := testOptions.GetFullDevEnvDir(envDir) + o.CloneDir = devEnvDir helm_test.StubFetchChart(name, "", helm.FakeChartmusuem, &chart.Chart{ Metadata: &chart.Metadata{ @@ -579,9 +592,6 @@ func TestUpgradeAppToLatestForGitOps(t *testing.T) { assert.Equal(t, fmt.Sprintf("Upgrade %s to %s", name, newVersion.String()), pr.Title) assert.Equal(t, fmt.Sprintf("Upgrade %s from %s to %s", name, version, newVersion.String()), pr.Body) // Validate the branch name - envDir, err := o.CommonOptions.EnvironmentsDir() - assert.NoError(t, err) - devEnvDir := testOptions.GetFullDevEnvDir(envDir) branchName, err := o.Git().Branch(devEnvDir) assert.NoError(t, err) assert.Equal(t, fmt.Sprintf("upgrade-app-%s-%s", name, newVersion.String()), branchName[:len(branchName)-6]) @@ -628,6 +638,10 @@ func TestUpgradeAllAppsForGitOps(t *testing.T) { HelmUpdate: true, DevEnv: testOptions.DevEnv, } + envDir, err := o.CommonOptions.EnvironmentsDir() + assert.NoError(t, err) + devEnvDir := testOptions.GetFullDevEnvDir(envDir) + o.CloneDir = devEnvDir helm_test.StubFetchChart(name1, "", helm.FakeChartmusuem, &chart.Chart{ Metadata: &chart.Metadata{ @@ -656,9 +670,6 @@ func TestUpgradeAllAppsForGitOps(t *testing.T) { version1, newVersion1.String(), name2, version2, newVersion2.String()), pr.Body) // Validate the branch name1 - envDir, err := o.CommonOptions.EnvironmentsDir() - assert.NoError(t, err) - devEnvDir := testOptions.GetFullDevEnvDir(envDir) branchName, err := o.Git().Branch(devEnvDir) assert.NoError(t, err) assert.Equal(t, fmt.Sprintf("upgrade-all-apps"), branchName[:len(branchName)-6]) diff --git a/pkg/environments/gitops.go b/pkg/environments/gitops.go index f6f8c42c64..62e6e08662 100644 --- a/pkg/environments/gitops.go +++ b/pkg/environments/gitops.go @@ -53,14 +53,22 @@ type EnvironmentPullRequestOptions struct { // the message as the body for both the commit and the pull request, // and the pullRequestInfo for any existing PR that exists to modify the environment that we want to merge these // changes into. -func (o *EnvironmentPullRequestOptions) Create(env *jenkinsv1.Environment, environmentsDir string, +func (o *EnvironmentPullRequestOptions) Create(env *jenkinsv1.Environment, prDir string, pullRequestDetails *gits.PullRequestDetails, filter *gits.PullRequestFilter, chartName string, autoMerge bool) (*gits.PullRequestInfo, error) { - dir := filepath.Join(environmentsDir, env.Name) - dir, base, upstreamRepo, forkURL, err := gits.ForkAndPullRepo(env.Spec.Source.URL, dir, env.Spec.Source.Ref, pullRequestDetails.BranchName, o.GitProvider, o.Gitter, "") + if prDir == "" { + tempDir, err := ioutil.TempDir("", "create-pr") + if err != nil { + return nil, err + } + prDir = tempDir + defer os.RemoveAll(tempDir) + } + + dir, base, upstreamRepo, forkURL, err := gits.ForkAndPullRepo(env.Spec.Source.URL, prDir, env.Spec.Source.Ref, pullRequestDetails.BranchName, o.GitProvider, o.Gitter, "") if err != nil { return nil, errors.Wrapf(err, "pulling environment repo %s into %s", env.Spec.Source.URL, - environmentsDir) + prDir) } err = ModifyChartFiles(dir, pullRequestDetails, o.ModifyChartFn, chartName) diff --git a/pkg/pipelinescheduler/generator.go b/pkg/pipelinescheduler/generator.go index c01b198e48..c54a883bf2 100644 --- a/pkg/pipelinescheduler/generator.go +++ b/pkg/pipelinescheduler/generator.go @@ -517,12 +517,12 @@ func ApplySchedulersDirectly(jxClient versioned.Interface, namespace string, sou //GitOpsOptions are options for running AddToEnvironmentRepo type GitOpsOptions struct { - Gitter gits.Gitter - Verbose bool - Helmer helm.Helmer - GitProvider gits.GitProvider - DevEnv *jenkinsv1.Environment - EnvironmentsDir string + Gitter gits.Gitter + Verbose bool + Helmer helm.Helmer + GitProvider gits.GitProvider + DevEnv *jenkinsv1.Environment + PullRequestCloneDir string } // AddToEnvironmentRepo adds the prow config to the gitops environment repo @@ -574,7 +574,7 @@ func (o *GitOpsOptions) AddToEnvironmentRepo(cfg *config.Config, plugs *plugins. GitProvider: o.GitProvider, } - info, err := options.Create(o.DevEnv, o.EnvironmentsDir, &details, nil, "", false) + info, err := options.Create(o.DevEnv, o.PullRequestCloneDir, &details, nil, "", false) if err != nil { return errors.Wrapf(err, "creating pr for prow config") @@ -709,7 +709,7 @@ func (o *GitOpsOptions) AddSchedulersToEnvironmentRepo(sourceRepositoryGroups [] GitProvider: o.GitProvider, } - info, err := options.Create(o.DevEnv, o.EnvironmentsDir, &details, nil, "", false) + info, err := options.Create(o.DevEnv, o.PullRequestCloneDir, &details, nil, "", false) if err != nil { return errors.Wrapf(err, "creating pr for scheduler config")