diff --git a/cmd/external-app/wire_gen.go b/cmd/external-app/wire_gen.go index c05e0602b3..f9d11c04b7 100644 --- a/cmd/external-app/wire_gen.go +++ b/cmd/external-app/wire_gen.go @@ -1,8 +1,7 @@ // Code generated by Wire. DO NOT EDIT. -//go:generate go run github.com/google/wire/cmd/wire -//go:build !wireinject -// +build !wireinject +//go:generate wire +//+build !wireinject package main diff --git a/internal/util/GitCliUtil.go b/internal/util/GitCliUtil.go index 3edef952a7..6f6671e77d 100644 --- a/internal/util/GitCliUtil.go +++ b/internal/util/GitCliUtil.go @@ -102,7 +102,7 @@ func (impl *GitCliUtil) Init(rootDir string, remoteUrl string, isBare bool) erro } func (impl *GitCliUtil) Clone(rootDir string, remoteUrl string, username string, password string) (response, errMsg string, err error) { - impl.logger.Infow("input", rootDir, remoteUrl, username) + impl.logger.Infow("git clone request", "rootDir", rootDir, "remoteUrl", remoteUrl, "username", username) err = impl.Init(rootDir, remoteUrl, false) if err != nil { return "", "", err @@ -111,24 +111,30 @@ func (impl *GitCliUtil) Clone(rootDir string, remoteUrl string, username string, if err == nil && errMsg == "" { impl.logger.Warn("git fetch completed, pulling master branch data from remote origin") response, errMsg, err = impl.ListBranch(rootDir, username, password) + if err != nil { + impl.logger.Errorw("error on git pull", "response", response, "errMsg", errMsg, "err", err) + return response, errMsg, err + } branches := strings.Split(response, "\n") - impl.logger.Info(branches) + impl.logger.Infow("total branch available in git repo", "branches", branches) branch := "" for _, item := range branches { if strings.TrimSpace(item) == "origin/master" { branch = Branch_Master } } - if len(branch) == 0 && len(branches) > 0 { + //if git repo has some branch take pull of the first branch, but eventually proxy chart will push into master branch + if len(branch) == 0 && branches != nil && len(branches[0]) > 0 { branch = strings.ReplaceAll(branches[0], "origin/", "") - } else if len(branch) == 0 { - // only fetch will work, as we don't have any branch for pull - return "", "", nil + } + if branch == "" { + impl.logger.Warnw("no branch found in git repo", "remoteUrl", remoteUrl, "response", response) + return response, "", nil } response, errMsg, err = impl.Pull(rootDir, username, password, branch) if err != nil { impl.logger.Errorw("error on git pull", "branch", branch, "err", err) - return "", "", err + return response, errMsg, err } } return response, errMsg, err diff --git a/pkg/appStore/deployment/common/AppStoreDeploymentCommonService.go b/pkg/appStore/deployment/common/AppStoreDeploymentCommonService.go index bde48e37f4..fda6a05c3c 100644 --- a/pkg/appStore/deployment/common/AppStoreDeploymentCommonService.go +++ b/pkg/appStore/deployment/common/AppStoreDeploymentCommonService.go @@ -18,15 +18,21 @@ package appStoreDeploymentCommon import ( + "github.com/devtron-labs/devtron/internal/util" appStoreBean "github.com/devtron-labs/devtron/pkg/appStore/bean" "github.com/devtron-labs/devtron/pkg/appStore/deployment/repository" "github.com/go-pg/pg" + "github.com/google/go-github/github" + "github.com/microsoft/azure-devops-go-api/azuredevops" + "github.com/xanzy/go-gitlab" "go.uber.org/zap" + "net/http" ) type AppStoreDeploymentCommonService interface { GetInstalledAppByClusterNamespaceAndName(clusterId int, namespace string, appName string) (*appStoreBean.InstallAppVersionDTO, error) GetInstalledAppByInstalledAppId(installedAppId int) (*appStoreBean.InstallAppVersionDTO, error) + ParseGitRepoErrorResponse(err error) (bool, error) } type AppStoreDeploymentCommonServiceImpl struct { @@ -101,3 +107,31 @@ func (impl AppStoreDeploymentCommonServiceImpl) convert(chart *repository.Instal }, } } + +func (impl AppStoreDeploymentCommonServiceImpl) ParseGitRepoErrorResponse(err error) (bool, error) { + //update values yaml in chart + noTargetFound := false + if err != nil { + if errorResponse, ok := err.(*github.ErrorResponse); ok && errorResponse.Response.StatusCode == http.StatusNotFound { + impl.logger.Errorw("no content found while updating git repo on github, do auto fix", "error", err) + noTargetFound = true + } + if errorResponse, ok := err.(azuredevops.WrappedError); ok && *errorResponse.StatusCode == http.StatusNotFound { + impl.logger.Errorw("no content found while updating git repo on azure, do auto fix", "error", err) + noTargetFound = true + } + if errorResponse, ok := err.(*azuredevops.WrappedError); ok && *errorResponse.StatusCode == http.StatusNotFound { + impl.logger.Errorw("no content found while updating git repo on azure, do auto fix", "error", err) + noTargetFound = true + } + if errorResponse, ok := err.(*gitlab.ErrorResponse); ok && errorResponse.Response.StatusCode == http.StatusNotFound { + impl.logger.Errorw("no content found while updating git repo gitlab, do auto fix", "error", err) + noTargetFound = true + } + if err.Error() == util.BITBUCKET_REPO_NOT_FOUND_ERROR { + impl.logger.Errorw("no content found while updating git repo bitbucket, do auto fix", "error", err) + noTargetFound = true + } + } + return noTargetFound, err +} diff --git a/pkg/appStore/deployment/service/AppStoreDeploymentService.go b/pkg/appStore/deployment/service/AppStoreDeploymentService.go index 5dca7017c7..2c192e4f09 100644 --- a/pkg/appStore/deployment/service/AppStoreDeploymentService.go +++ b/pkg/appStore/deployment/service/AppStoreDeploymentService.go @@ -995,7 +995,17 @@ func (impl AppStoreDeploymentServiceImpl) UpdateInstalledApp(ctx context.Context err = impl.appStoreDeploymentArgoCdService.UpdateRequirementDependencies(environment, installedAppVersion, installAppVersionRequest, appStoreAppVersion) if err != nil { impl.logger.Errorw("error while commit required dependencies to git", "error", err) - return nil, err + noTargetFound, _ := impl.appStoreDeploymentCommonService.ParseGitRepoErrorResponse(err) + if noTargetFound { + //if by mistake no content found while updating git repo, do auto fix + installAppVersionRequest, err = impl.appStoreDeploymentArgoCdService.OnUpdateRepoInInstalledApp(ctx, installAppVersionRequest) + if err != nil { + impl.logger.Errorw("error while update repo on helm update", "error", err) + return nil, err + } + } else { + return nil, err + } } } installAppVersionRequest.Id = installedAppVersion.Id diff --git a/pkg/appStore/deployment/tool/gitops/AppStoreDeploymentArgoCdService.go b/pkg/appStore/deployment/tool/gitops/AppStoreDeploymentArgoCdService.go index becc775a8e..b7f5a1fba5 100644 --- a/pkg/appStore/deployment/tool/gitops/AppStoreDeploymentArgoCdService.go +++ b/pkg/appStore/deployment/tool/gitops/AppStoreDeploymentArgoCdService.go @@ -13,6 +13,7 @@ import ( "github.com/devtron-labs/devtron/internal/constants" "github.com/devtron-labs/devtron/internal/util" appStoreBean "github.com/devtron-labs/devtron/pkg/appStore/bean" + appStoreDeploymentCommon "github.com/devtron-labs/devtron/pkg/appStore/deployment/common" appStoreDeploymentFullMode "github.com/devtron-labs/devtron/pkg/appStore/deployment/fullMode" "github.com/devtron-labs/devtron/pkg/appStore/deployment/repository" appStoreDiscoverRepository "github.com/devtron-labs/devtron/pkg/appStore/discover/repository" @@ -50,12 +51,13 @@ type AppStoreDeploymentArgoCdServiceImpl struct { chartTemplateService util.ChartTemplateService gitFactory *util.GitFactory argoUserService argo.ArgoUserService + appStoreDeploymentCommonService appStoreDeploymentCommon.AppStoreDeploymentCommonService } func NewAppStoreDeploymentArgoCdServiceImpl(logger *zap.SugaredLogger, appStoreDeploymentFullModeService appStoreDeploymentFullMode.AppStoreDeploymentFullModeService, acdClient application2.ServiceClient, chartGroupDeploymentRepository repository.ChartGroupDeploymentRepository, installedAppRepository repository.InstalledAppRepository, installedAppRepositoryHistory repository.InstalledAppVersionHistoryRepository, chartTemplateService util.ChartTemplateService, - gitFactory *util.GitFactory, argoUserService argo.ArgoUserService) *AppStoreDeploymentArgoCdServiceImpl { + gitFactory *util.GitFactory, argoUserService argo.ArgoUserService, appStoreDeploymentCommonService appStoreDeploymentCommon.AppStoreDeploymentCommonService) *AppStoreDeploymentArgoCdServiceImpl { return &AppStoreDeploymentArgoCdServiceImpl{ Logger: logger, appStoreDeploymentFullModeService: appStoreDeploymentFullModeService, @@ -66,6 +68,7 @@ func NewAppStoreDeploymentArgoCdServiceImpl(logger *zap.SugaredLogger, appStoreD chartTemplateService: chartTemplateService, gitFactory: gitFactory, argoUserService: argoUserService, + appStoreDeploymentCommonService: appStoreDeploymentCommonService, } } @@ -385,7 +388,17 @@ func (impl AppStoreDeploymentArgoCdServiceImpl) UpdateInstalledApp(ctx context.C installAppVersionRequest, err := impl.updateValuesYaml(environment, installedAppVersion, installAppVersionRequest) if err != nil { impl.Logger.Errorw("error while commit values to git", "error", err) - return nil, err + noTargetFound, _ := impl.appStoreDeploymentCommonService.ParseGitRepoErrorResponse(err) + if noTargetFound { + //if by mistake no content found while updating git repo, do auto fix + installAppVersionRequest, err = impl.OnUpdateRepoInInstalledApp(ctx, installAppVersionRequest) + if err != nil { + impl.Logger.Errorw("error while update repo on helm update", "error", err) + return nil, err + } + } else { + return nil, err + } } installAppVersionRequest.Environment = environment diff --git a/wire_gen.go b/wire_gen.go index 8c1efc70df..fd7fe5b1e8 100644 --- a/wire_gen.go +++ b/wire_gen.go @@ -427,8 +427,8 @@ func InitializeApp() (*App, error) { clusterInstalledAppsRepositoryImpl := repository3.NewClusterInstalledAppsRepositoryImpl(db, sugaredLogger) appStoreDeploymentHelmServiceImpl := appStoreDeploymentTool.NewAppStoreDeploymentHelmServiceImpl(sugaredLogger, helmAppServiceImpl, appStoreApplicationVersionRepositoryImpl, environmentRepositoryImpl, helmAppClientImpl, installedAppRepositoryImpl) installedAppVersionHistoryRepositoryImpl := repository3.NewInstalledAppVersionHistoryRepositoryImpl(sugaredLogger, db) - appStoreDeploymentArgoCdServiceImpl := appStoreDeploymentGitopsTool.NewAppStoreDeploymentArgoCdServiceImpl(sugaredLogger, appStoreDeploymentFullModeServiceImpl, applicationServiceClientImpl, chartGroupDeploymentRepositoryImpl, installedAppRepositoryImpl, installedAppVersionHistoryRepositoryImpl, chartTemplateServiceImpl, gitFactory, argoUserServiceImpl) appStoreDeploymentCommonServiceImpl := appStoreDeploymentCommon.NewAppStoreDeploymentCommonServiceImpl(sugaredLogger, installedAppRepositoryImpl) + appStoreDeploymentArgoCdServiceImpl := appStoreDeploymentGitopsTool.NewAppStoreDeploymentArgoCdServiceImpl(sugaredLogger, appStoreDeploymentFullModeServiceImpl, applicationServiceClientImpl, chartGroupDeploymentRepositoryImpl, installedAppRepositoryImpl, installedAppVersionHistoryRepositoryImpl, chartTemplateServiceImpl, gitFactory, argoUserServiceImpl, appStoreDeploymentCommonServiceImpl) serviceDeploymentServiceTypeConfig, err := service2.GetDeploymentServiceTypeConfig() if err != nil { return nil, err