func()

in internal/pkg/cli/env_deploy.go [174:264]


func (o *deployEnvOpts) Execute() error {
	if !o.allowEnvDowngrade {
		envVersionGetter, err := o.newEnvVersionGetter(o.appName, o.name)
		if err != nil {
			return err
		}
		if err := validateEnvVersion(envVersionGetter, o.name, o.templateVersion); err != nil {
			return err
		}
	}
	mft, interpolated, err := environmentManifest(o.name, o.ws, o.newInterpolator(o.appName, o.name))
	if err != nil {
		return err
	}
	caller, err := o.identity.Get()
	if err != nil {
		return fmt.Errorf("get identity: %w", err)
	}
	deployer, err := o.newEnvDeployer()
	if err != nil {
		return err
	}
	if err := deployer.Validate(mft); err != nil {
		return err
	}
	artifacts, err := deployer.UploadArtifacts()
	if err != nil {
		return fmt.Errorf("upload artifacts for environment %s: %w", o.name, err)
	}
	deployInput := &deploy.DeployEnvironmentInput{
		RootUserARN:         caller.RootUserARN,
		AddonsURL:           artifacts.AddonsURL,
		CustomResourcesURLs: artifacts.CustomResourceURLs,
		Manifest:            mft,
		RawManifest:         interpolated,
		PermissionsBoundary: o.targetApp.PermissionsBoundary,
		ForceNewUpdate:      o.forceNewUpdate,
		DisableRollback:     o.disableRollback,
		Version:             o.templateVersion,
		Detach:              o.detach,
	}
	if o.showDiff {
		contd, err := o.showDiffAndConfirmDeployment(deployer, deployInput)
		if err != nil {
			return err
		}
		if !contd {
			return nil
		}
	}
	err = deployer.DeployEnvironment(deployInput)
	if err == nil {
		if o.detach {
			return nil
		}
		log.Successf("Successfully deployed environment %s", o.name)
		return nil
	}
	var errStackDeletedOnInterrupt *deploycfn.ErrStackDeletedOnInterrupt
	var errStackUpdateCanceledOnInterrupt *deploycfn.ErrStackUpdateCanceledOnInterrupt
	var errEmptyChangeSet *awscfn.ErrChangeSetEmpty
	switch {
	case errors.As(err, &errStackDeletedOnInterrupt):
		return nil

	case errors.As(err, &errStackUpdateCanceledOnInterrupt):
		log.Successf("Successfully rolled back service %s to the previous configuration.\n", color.HighlightUserInput(o.name))
		return nil
	case errors.As(err, &errEmptyChangeSet):
		log.Errorf(`Your update does not introduce immediate resource changes. 
This may be because the resources are not created until they are deemed 
necessary by a service deployment.

In this case, you can run %s to push a modified template, even if there are no immediate changes.
`, color.HighlightCode("copilot env deploy --force"))
		if o.disableRollback {
			stackName := stack.NameForEnv(o.targetApp.Name, o.targetEnv.Name)
			rollbackCmd := fmt.Sprintf("aws cloudformation rollback-stack --stack-name %s --role-arn %s", stackName, o.targetEnv.ExecutionRoleARN)
			log.Infof(`It seems like you have disabled automatic stack rollback for this deployment.
To debug, you can visit the AWS console to inspect the errors.
After fixing the deployment, you can:
1. Run %s to rollback the deployment.
2. Run %s to make a new deployment.
`, color.HighlightCode(rollbackCmd), color.HighlightCode("copilot env deploy"))
		}
	}
	if errors.As(err, &errEmptyChangeSet) {
		return &errNoInfrastructureChanges{parentErr: err}
	}
	return fmt.Errorf("deploy environment %s: %w", o.name, err)
}