Documentation
¶
Overview ¶
Package deployurls keeps an immutable hostname for each recent successful deploy: a retained service that runs that attempt's pinned image and sleeps when idle, so a past deployment can be opened without rolling back.
Index ¶
Constants ¶
const ( // EnvKeep is how many recent successful deploys per app keep a URL; 0 turns the feature off. EnvKeep = "APP_DEPLOY_URL_KEEP" // EnvIdleMinutes is how long a retained deploy runs without traffic before it sleeps. EnvIdleMinutes = "APP_DEPLOY_URL_IDLE_MINUTES" // EnvInterval is how often the syncer looks for new deploys. EnvInterval = "APP_DEPLOY_URL_INTERVAL" )
Environment variables that tune deploy URLs.
const ( DefaultKeep = 3 DefaultIdleMinutes = 5 DefaultInterval = time.Minute )
Defaults for the variables above.
Variables ¶
This section is empty.
Functions ¶
func Clone ¶
func Clone(app store.DesiredService, w Wanted, host string) store.DesiredService
Clone is the retained service for w: the app's config restored to that attempt, running the pinned image, with no volumes, host ports, hooks or automatic rollback, so an old deploy cannot touch live data or fight the app.
func Key ¶
func Key(a store.DeployAttempt) string
Key is the short, DNS-safe identity of an attempt: the commit when it has one, else its id.
func ServiceName ¶
ServiceName is the retained service for app and key; it doubles as the host label.
Types ¶
type Config ¶
Config is the environment-driven tuning.
func ConfigFromEnv ¶
ConfigFromEnv reads the Env* variables, using defaults for anything missing or malformed.
func FromProcessEnv ¶
func FromProcessEnv() Config
FromProcessEnv is ConfigFromEnv over the process environment.
type Store ¶
type Store interface {
ListDesiredServices(ctx context.Context) ([]store.DesiredService, error)
SaveDesiredService(ctx context.Context, svc store.DesiredService) error
ListDeployAttempts(ctx context.Context, serviceName string) ([]store.DeployAttempt, error)
ListRollbackPins(ctx context.Context, serviceName string) ([]store.RollbackPin, error)
SetAppSleepIdle(ctx context.Context, serviceName string, minutes int, now time.Time) error
SetAppSleepHold(ctx context.Context, serviceName string, hold bool, now time.Time) error
ListDeployURLs(ctx context.Context, appName string) ([]store.DeployURL, error)
SaveDeployURL(ctx context.Context, u store.DeployURL) error
DeleteDeployURL(ctx context.Context, serviceName string) error
}
Store is what the syncer needs; *store.DB satisfies it.
type Syncer ¶
type Syncer struct {
Store Store
Config Config
// HostFor returns the hostname for a retained service, or "" when none can be formed.
HostFor func(ctx context.Context, serviceName string) string
// Remove deletes a retained service and tears its containers down.
Remove func(ctx context.Context, serviceName string) error
// Nudge asks the reconcilers to run now.
Nudge func()
Now func() time.Time
Logger *slog.Logger
// contains filtered or unexported fields
}
Syncer reconciles retained deploy services against each app's recent deploys.
type Wanted ¶
type Wanted struct {
Attempt store.DeployAttempt
Key string
ServiceName string
Pin *store.RollbackPin
Ref string
// Live is true while the attempt is what the app runs now: the app's own URL serves it.
Live bool
}
Wanted is one deploy attempt that should have a URL.
func Plan ¶
func Plan(app store.DesiredService, attempts []store.DeployAttempt, pins []store.RollbackPin, keep int) []Wanted
Plan picks the newest keep successful attempts whose content can still be redeployed (a registry digest or a rollback pin). Two attempts of the same commit share one URL, the newest. Image GC is untouched: it only frees what no pin or running service holds.