func()

in controllers/codebase/service/chain/put_deploy_configs.go [51:156]


func (h *PutDeployConfigs) tryToPushConfigs(ctx context.Context, codebase *codebaseApi.Codebase) error {
	log := ctrl.LoggerFrom(ctx)

	if codebase.Status.Git == util.ProjectTemplatesPushedStatus {
		log.Info("Skip pushing templates. Templates already pushed")

		return nil
	}

	gitServer := &codebaseApi.GitServer{}
	if err := h.client.Get(
		ctx,
		client.ObjectKey{Name: codebase.Spec.GitServer, Namespace: codebase.Namespace},
		gitServer,
	); err != nil {
		setFailedFields(codebase, codebaseApi.SetupDeploymentTemplates, err.Error())
		return fmt.Errorf("failed get GitServer: %w", err)
	}

	gitServerSecret := &corev1.Secret{}
	if err := h.client.Get(
		ctx,
		client.ObjectKey{Name: gitServer.Spec.NameSshKeySecret, Namespace: codebase.Namespace},
		gitServerSecret,
	); err != nil {
		return fmt.Errorf("failed to get GitServer secret: %w", err)
	}

	privateSSHKey := string(gitServerSecret.Data[util.PrivateSShKeyName])
	repoSshUrl := util.GetSSHUrl(gitServer, codebase.Spec.GetProjectID())
	wd := util.GetWorkDir(codebase.Name, codebase.Namespace)

	if !util.DoesDirectoryExist(wd) || util.IsDirectoryEmpty(wd) {
		log.Info("Start cloning repository", "url", repoSshUrl)

		if err := h.git.CloneRepositoryBySsh(
			ctx,
			privateSSHKey,
			gitServer.Spec.GitUser,
			repoSshUrl,
			wd,
			gitServer.Spec.SshPort,
		); err != nil {
			return fmt.Errorf("failed to clone git repository: %w", err)
		}

		log.Info("Repository has been cloned", "url", repoSshUrl)
	}

	if gitServer.Spec.GitProvider == codebaseApi.GitProviderGerrit {
		log.Info("Start adding commit hooks")

		if err := h.addCommitHooks(wd); err != nil {
			return fmt.Errorf("failed to add commit hooks: %w", err)
		}

		log.Info("Commit hooks have been added")
	}

	ru, err := util.GetRepoUrl(codebase)
	if err != nil {
		return fmt.Errorf("failed to build repo url: %w", err)
	}

	log.Info("Start checkout default branch", "branch", codebase.Spec.DefaultBranch, "repo", ru)

	err = CheckoutBranch(ru, wd, codebase.Spec.DefaultBranch, h.git, codebase, h.client)
	if err != nil {
		return fmt.Errorf("failed to checkout default branch %v in put_deploy_config has been failed: %w", codebase.Spec.DefaultBranch, err)
	}

	log.Info("Default branch has been checked out", "branch", codebase.Spec.DefaultBranch, "repo", ru)
	log.Info("Start preparing templates")

	err = template.PrepareTemplates(ctx, h.client, codebase, wd)
	if err != nil {
		return fmt.Errorf("failed to prepare template: %w", err)
	}

	log.Info("Templates have been prepared")
	log.Info("Start committing changes")

	err = h.git.CommitChanges(wd, fmt.Sprintf("Add deployment templates for %s", codebase.Name))
	if err != nil {
		return fmt.Errorf("failed to commit changes: %w", err)
	}

	log.Info("Changes have been committed")
	log.Info("Start pushing changes")

	err = h.git.PushChanges(privateSSHKey, gitServer.Spec.GitUser, wd, gitServer.Spec.SshPort, "--all")
	if err != nil {
		return fmt.Errorf("failed to push changes: %w", err)
	}

	log.Info("Changes have been pushed")

	codebase.Status.Git = util.ProjectTemplatesPushedStatus
	if err = h.client.Status().Update(ctx, codebase); err != nil {
		return fmt.Errorf("failed to set git status %s for codebase %s: %w", util.ProjectTemplatesPushedStatus, codebase.Name, err)
	}

	log.Info("Config has been pushed")

	return nil
}