deploy

package
v0.23.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 24, 2026 License: MIT Imports: 18 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var DeployCmd = &cobra.Command{
	Use:   "deploy [deploymentId]",
	Short: "Run a deployment",
	Long: `
Run a deployment by ID, or omit it to deploy the development environment.

If no deploymentId is provided, the CLI will use the current project config to
find the development environment deployment. If it doesn't exist yet, it will
be created automatically.

Usage:
  hyphen deploy [deploymentId] [flags]

Examples:
  hyphen deploy                  # deploys the dev environment (auto-detected)
  hyphen deploy depl_abc123      # deploys a specific deployment by ID

Use 'hyphen deploy --help' for more information about available flags.
`,
	Args: cobra.RangeArgs(0, 1),
	PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
		return user.ErrorIfNotAuthenticated()
	},
	RunE: func(cmd *cobra.Command, args []string) error {
		orgId, err := flags.GetOrganizationID()
		if err != nil {
			return err
		}

		printer = cprint.NewCPrinter(flags.VerboseFlag)

		service := Deployment.NewService()

		var selectedDeployment models.Deployment

		if len(args) == 0 {
			cfg, err := config.RestoreLocalConfig()
			if err != nil {
				return fmt.Errorf("failed to restore config: %w", err)
			}

			projectId := projectFlag
			if cfg.ProjectId != nil {
				projectId = *cfg.ProjectId
			}
			if projectId == "" {
				return fmt.Errorf("project id not found in config")
			}

			var envId string
			if envFlag != "" {
				envId = envFlag
			} else {
				envService := env.NewService()
				devEnv, devEnvErr := envService.GetDevelopmentEnvironment(orgId, projectId)
				if errors.Is(devEnvErr, errors.ErrNotFound) {
					return fmt.Errorf("no development environment found for this project")
				}
				if devEnvErr != nil {
					return fmt.Errorf("failed to get development environment: %w", devEnvErr)
				}
				envId = devEnv.ID
			}

			projectService := projects.NewService(orgId)
			deployment, deploymentErr := projectService.GetEnvironmentDeployment(projectId, envId)
			if deploymentErr != nil && !errors.Is(deploymentErr, errors.ErrNotFound) {
				return fmt.Errorf("failed to get deployment for environment: %w", deploymentErr)
			}

			if errors.Is(deploymentErr, errors.ErrNotFound) || deployment.ID == "" {
				project, err := projectService.GetProject(projectId)
				if err != nil {
					return fmt.Errorf("failed to get project: %w", err)
				}
				if cfg.AppId == nil {
					return fmt.Errorf("app id not found in config")
				}

				name := deploymentNamePart(project.AlternateID, 25)

				newDeployment, err := service.CreateEnvironmentDeployment(orgId, projectId, envId, *cfg.AppId, name, name, "")
				if err != nil {
					return fmt.Errorf("failed to create deployment: %w", err)
				}
				selectedDeployment = *newDeployment
			} else {
				selectedDeployment = deployment
			}
		} else {
			deployment, err := service.GetDeployment(orgId, args[0])
			if err != nil {
				return fmt.Errorf("failed to get deployment: %w", err)
			}

			selectedDeployment = *deployment
		}
		if !selectedDeployment.IsReady {
			printer.Print("❌ There are issues blocking this deployment from being run.")
			for _, issue := range selectedDeployment.ReadinessIssues {
				if issue.Cloud != "" {
					printer.Print(fmt.Sprintf("  • %s (%s)", issue.Error, issue.Cloud))
				} else {
					printer.Print(fmt.Sprintf("  • %s", issue.Error))
				}
			}
			return nil
		}

		// Match preview if preview flag is provided
		var previewId string
		if flags.PreviewNameFlag != "" {
			matchedPreviews := []models.DeploymentPreview{}
			for _, p := range selectedDeployment.Previews {
				if p.Name == flags.PreviewNameFlag {

					if flags.PreviewPrefixFlag != "" {
						if p.HostPrefix == flags.PreviewPrefixFlag {
							matchedPreviews = append(matchedPreviews, p)
						}
					} else {
						matchedPreviews = append(matchedPreviews, p)
					}
				}
			}

			if len(matchedPreviews) == 0 {
				if flags.PreviewPrefixFlag == "" {
					return fmt.Errorf("no preview found with name '%s', please specify --prefix flag to create a new preview", flags.PreviewNameFlag)
				}
				newPreview, err := service.CreatePreview(orgId, selectedDeployment, flags.PreviewNameFlag, flags.PreviewPrefixFlag)
				if err != nil {
					return fmt.Errorf("failed to create preview: %w", err)
				}
				previewId = newPreview.ID
			} else if len(matchedPreviews) > 1 {
				return fmt.Errorf("multiple previews found with name '%s', please specify --prefix flag to disambiguate", flags.PreviewNameFlag)
			} else {
				previewId = matchedPreviews[0].ID
			}
		}

		appSources := []Deployment.AppSources{}

		if noBuild {

		} else {

			firstApp := selectedDeployment.Apps[0]

			service := build.NewService()
			result, err := service.RunBuild(cmd, printer, firstApp.DeploymentSettings.ProjectEnvironment.ID, flags.VerboseFlag, flags.DockerfileFlag, flags.PreviewNameFlag)
			if err != nil {
				return err
			}
			appSources = append(appSources, Deployment.AppSources{
				AppId:    result.App.ID,
				Artifact: result.Artifact,
			},
			)
		}

		printer.Print(fmt.Sprintf("Running %s", selectedDeployment.Name))

		run, err := service.CreateRun(orgId, selectedDeployment.ID, appSources, previewId)
		if err != nil {
			return fmt.Errorf("failed to create run: %w", err)
		}

		appUrl := fmt.Sprintf("%s/%s/deploy/%s/runs/%s", apiconf.GetBaseAppUrl(), orgId, selectedDeployment.ID, run.ID)

		if shouldUseTUI() {
			runWithTUI(orgId, selectedDeployment.ID, run, appUrl, service)
		} else {
			runWithoutTUI(orgId, selectedDeployment.ID, run, appUrl, service)
		}

		return nil
	},
}

Functions

This section is empty.

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL