cli/common.go
cli/common.goBrowse 1970 files
968 tokens
3,540 bytes
Token encoding: o200k_base
Snapshot 21a254f
← Back to SKILL.md
1package cli2 3import (4 "encoding/json"5 "fmt"6 7 "github.com/charmbracelet/log"8 "github.com/railwayapp/railpack/core"9 a "github.com/railwayapp/railpack/core/app"10 "github.com/railwayapp/railpack/core/config"11 "github.com/railwayapp/railpack/core/mise"12 "github.com/railwayapp/railpack/core/plan"13 "github.com/railwayapp/railpack/internal/utils"14 "github.com/urfave/cli/v3"15)16 17var Version string // This will be set by main18 19const (20 // the command failed for a reason that will not change on a retry21 ExitCodeFailure = 122 23 // EX_TEMPFAIL: the command failed for a transient reason (e.g. a network error24 // downloading mise) and is worth retrying. Platforms that run Railpack in a25 // build pipeline key their retry logic on this.26 ExitCodeTransient = 7527)28 29func exitCodeForError(err error) int {30 if mise.IsTemporary(err) {31 return ExitCodeTransient32 }33 34 return ExitCodeFailure35}36 37func commonPlanFlags() []cli.Flag {38 return []cli.Flag{39 &cli.StringSliceFlag{40 Name: "env",41 Aliases: []string{"e"},42 Usage: "environment variables to set",43 },44 &cli.StringSliceFlag{45 Name: "previous",46 Usage: "versions of packages used for previous builds (e.g. 'package@version')",47 },48 &cli.StringFlag{49 Name: "build-cmd",50 Usage: "build command to use",51 },52 &cli.StringFlag{53 Name: "start-cmd",54 Usage: "start command to use",55 },56 &cli.StringFlag{57 Name: "config-file",58 Usage: "relative path to railpack config file (default: railpack.json)",59 },60 &cli.BoolFlag{61 Name: "error-missing-start",62 Usage: "error if no start command is found",63 },64 }65}66 67func GenerateBuildResultForCommand(cmd *cli.Command) (*core.BuildResult, *a.App, *a.Environment, error) {68 directory := cmd.Args().First()69 70 if directory == "" {71 return nil, nil, nil, cli.Exit("directory argument is required", ExitCodeFailure)72 }73 74 app, err := a.NewApp(directory)75 if err != nil {76 return nil, nil, nil, fmt.Errorf("error creating app: %w", err)77 }78 79 log.Debugf("Building %s", app.Source)80 81 envsArgs := cmd.StringSlice("env")82 83 env, err := a.FromEnvs(envsArgs)84 if err != nil {85 return nil, nil, nil, fmt.Errorf("error creating env: %w", err)86 }87 88 // if --verbose is passed as a CLI global argument, enable verbose mise logging so the user don't have to understand89 // the railpack build system deeply to get this debugging information.90 if cmd.Bool("verbose") && env.GetVariable("MISE_VERBOSE") == "" {91 env.SetVariable("MISE_VERBOSE", "1")92 }93 94 previousVersions := utils.ParsePackageWithVersion(cmd.StringSlice("previous"))95 96 generateOptions := &core.GenerateBuildPlanOptions{97 RailpackVersion: Version,98 BuildCommand: cmd.String("build-cmd"),99 StartCommand: cmd.String("start-cmd"),100 PreviousVersions: previousVersions,101 ConfigFilePath: cmd.String("config-file"),102 ErrorMissingStartCommand: cmd.Bool("error-missing-start"),103 }104 105 buildResult, err := core.GenerateBuildPlan(app, env, generateOptions)106 if err != nil {107 return nil, nil, nil, err108 }109 110 return buildResult, app, env, nil111}112 113// add $schema link to resulting map JSON for improved IDE experience when manually editing114func addSchemaToPlanMap(p *plan.BuildPlan) (map[string]any, error) {115 if p == nil {116 return map[string]any{"$schema": config.SchemaUrl}, nil117 }118 planBytes, err := json.Marshal(p)119 if err != nil {120 return nil, err121 }122 var planMap map[string]any123 if err := json.Unmarshal(planBytes, &planMap); err != nil {124 return nil, err125 }126 planMap["$schema"] = config.SchemaUrl127 return planMap, nil128}129