core/generate/install_bin_builder.go
core/generate/install_bin_builder.goBrowse 1970 files
700 tokens
2,802 bytes
Token encoding: o200k_base
Snapshot 21a254f
← Back to SKILL.md
1// Unlike the mise step builder, this builder uses mise to install a binary, but throws away all of the mise installation cruft2// this reduces the image size considerably. Image sizes are important: performance is a feature and smaller images perform better.3// They are easier to move around, debug, use less storage, etc. This is why we have this step in use on particular high-volume build paths.4 5// TODO this builder is not exposed to the user right now via railpack.json6 7package generate8 9import (10 "fmt"11 12 "github.com/railwayapp/railpack/core/plan"13 "github.com/railwayapp/railpack/core/resolver"14)15 16const (17 BinDir = "/railpack"18)19 20type InstallBinStepBuilder struct {21 DisplayName string22 Resolver *resolver.Resolver23 SupportingAptPackages []string24 Package resolver.PackageRef25}26 27func (c *GenerateContext) NewInstallBinStepBuilder(name string) *InstallBinStepBuilder {28 step := &InstallBinStepBuilder{29 DisplayName: c.GetStepName(name),30 Resolver: c.Resolver,31 Package: resolver.PackageRef{},32 }33 34 c.Steps = append(c.Steps, step)35 36 return step37}38 39func (b *InstallBinStepBuilder) Name() string {40 return b.DisplayName41}42 43func (b *InstallBinStepBuilder) Default(name string, defaultVersion string) resolver.PackageRef {44 b.Package = b.Resolver.Default(name, defaultVersion)45 return b.Package46}47 48func (b *InstallBinStepBuilder) GetOutputPaths() []string {49 return []string{b.getBinPath()}50}51 52func (b *InstallBinStepBuilder) Version(name resolver.PackageRef, version string, source string) {53 b.Resolver.Version(name, version, source)54}55 56func (b *InstallBinStepBuilder) GetLayer() plan.Layer {57 return plan.NewStepLayer(b.Name(), plan.Filter{58 Include: b.GetOutputPaths(),59 })60}61 62func (b *InstallBinStepBuilder) Build(p *plan.BuildPlan, options *BuildStepOptions) error {63 packageVersion := options.ResolvedPackages[b.Package.Name].ResolvedVersion64 if packageVersion == nil {65 return fmt.Errorf("package %s not found", b.Package.Name)66 }67 68 step := plan.NewStep(b.DisplayName)69 step.Secrets = []string{}70 // take a look at mise_step_builder for any config that would be useful here71 step.Variables = map[string]string{72 // Enforces HTTPS and stricter security73 "MISE_PARANOID": "1",74 }75 step.Inputs = []plan.Layer{76 plan.NewImageLayer(RailpackBuilderImage),77 }78 79 // TODO copy MISE_VERBOSE from the environment if it's set80 81 binPath := b.getBinPath()82 83 step.AddCommands([]plan.Command{84 plan.NewExecCommand(fmt.Sprintf("mise install-into %s@%s %s", b.Package.Name, *packageVersion, binPath)),85 plan.NewPathCommand(binPath),86 plan.NewPathCommand(fmt.Sprintf("%s/bin", binPath)),87 })88 89 p.Steps = append(p.Steps, *step)90 91 return nil92}93 94func (b *InstallBinStepBuilder) getBinPath() string {95 return fmt.Sprintf("%s/%s", BinDir, b.Package.Name)96}97