feat: support per-app onboarding overrides

This commit is contained in:
eding 2026-09-13 10:40:55 +02:00
parent 7d1cf8ae6d
commit 45f16ab9bc
2 changed files with 21 additions and 2 deletions

View file

@ -9,6 +9,7 @@ import (
) )
var freshConfigPath, freshOrganization, onboardConfigPath, onboardFrom string var freshConfigPath, freshOrganization, onboardConfigPath, onboardFrom string
var onboardAppName, onboardAppRepoURL, onboardImageRepository string
var freshCreateOrganization, freshEnableDelivery, freshYes bool var freshCreateOrganization, freshEnableDelivery, freshYes bool
var freshMode string var freshMode string
@ -50,6 +51,9 @@ func init() {
appCmd.AddCommand(appOnboardCmd) appCmd.AddCommand(appOnboardCmd)
appOnboardCmd.Flags().StringVar(&onboardConfigPath, "config", "", "Path to private bootstrap config YAML") appOnboardCmd.Flags().StringVar(&onboardConfigPath, "config", "", "Path to private bootstrap config YAML")
appOnboardCmd.Flags().StringVar(&onboardFrom, "from", "", "Clean application checkout to scaffold") appOnboardCmd.Flags().StringVar(&onboardFrom, "from", "", "Clean application checkout to scaffold")
appOnboardCmd.Flags().StringVar(&onboardAppName, "app-name", "", "Application name override")
appOnboardCmd.Flags().StringVar(&onboardAppRepoURL, "app-repo-url", "", "Application repository URL override")
appOnboardCmd.Flags().StringVar(&onboardImageRepository, "image-repository", "", "OCI image repository override")
_ = appOnboardCmd.MarkFlagRequired("config") _ = appOnboardCmd.MarkFlagRequired("config")
_ = appOnboardCmd.MarkFlagRequired("from") _ = appOnboardCmd.MarkFlagRequired("from")
} }
@ -74,6 +78,15 @@ func runAppOnboard(_ *cobra.Command, _ []string) error {
if err != nil { if err != nil {
return err return err
} }
if onboardAppName != "" {
cfg.Delivery.AppName = onboardAppName
}
if onboardAppRepoURL != "" {
cfg.Delivery.AppRepoURL = onboardAppRepoURL
}
if onboardImageRepository != "" {
cfg.Delivery.ImageRepository = onboardImageRepository
}
cfg, err = resolveAppOnboarding(cfg) cfg, err = resolveAppOnboarding(cfg)
if err != nil { if err != nil {
return err return err

View file

@ -65,9 +65,11 @@ func TestBootstrapInitAppliesFluxDefaultsBeforeFreshValidation(t *testing.T) {
func TestAppOnboardValidatesConfigBeforeExternalWork(t *testing.T) { func TestAppOnboardValidatesConfigBeforeExternalWork(t *testing.T) {
originalConfig, originalResolve, originalOnboard := loadAppOnboardConfig, resolveAppOnboarding, onboardApp originalConfig, originalResolve, originalOnboard := loadAppOnboardConfig, resolveAppOnboarding, onboardApp
originalConfigPath, originalFrom := onboardConfigPath, onboardFrom originalConfigPath, originalFrom := onboardConfigPath, onboardFrom
originalName, originalRepo, originalImage := onboardAppName, onboardAppRepoURL, onboardImageRepository
t.Cleanup(func() { t.Cleanup(func() {
loadAppOnboardConfig, resolveAppOnboarding, onboardApp = originalConfig, originalResolve, originalOnboard loadAppOnboardConfig, resolveAppOnboarding, onboardApp = originalConfig, originalResolve, originalOnboard
onboardConfigPath, onboardFrom = originalConfigPath, originalFrom onboardConfigPath, onboardFrom = originalConfigPath, originalFrom
onboardAppName, onboardAppRepoURL, onboardImageRepository = originalName, originalRepo, originalImage
}) })
loadAppOnboardConfig = func(string) (config.Config, error) { return config.Config{}, nil } loadAppOnboardConfig = func(string) (config.Config, error) { return config.Config{}, nil }
resolveAppOnboarding = func(config.Config) (config.Config, error) { return config.Config{}, errors.New("incomplete delivery") } resolveAppOnboarding = func(config.Config) (config.Config, error) { return config.Config{}, errors.New("incomplete delivery") }
@ -76,6 +78,7 @@ func TestAppOnboardValidatesConfigBeforeExternalWork(t *testing.T) {
return nil return nil
} }
onboardConfigPath, onboardFrom = "private.yaml", "app-checkout" onboardConfigPath, onboardFrom = "private.yaml", "app-checkout"
onboardAppName, onboardAppRepoURL, onboardImageRepository = "", "", ""
if err := runAppOnboard(nil, nil); err == nil { if err := runAppOnboard(nil, nil); err == nil {
t.Fatal("onboarding accepted invalid configuration") t.Fatal("onboarding accepted invalid configuration")
} }
@ -84,22 +87,25 @@ func TestAppOnboardValidatesConfigBeforeExternalWork(t *testing.T) {
func TestAppOnboardPassesOnlyValidatedConfigAndCheckout(t *testing.T) { func TestAppOnboardPassesOnlyValidatedConfigAndCheckout(t *testing.T) {
originalConfig, originalResolve, originalOnboard := loadAppOnboardConfig, resolveAppOnboarding, onboardApp originalConfig, originalResolve, originalOnboard := loadAppOnboardConfig, resolveAppOnboarding, onboardApp
originalConfigPath, originalFrom := onboardConfigPath, onboardFrom originalConfigPath, originalFrom := onboardConfigPath, onboardFrom
originalName, originalRepo, originalImage := onboardAppName, onboardAppRepoURL, onboardImageRepository
t.Cleanup(func() { t.Cleanup(func() {
loadAppOnboardConfig, resolveAppOnboarding, onboardApp = originalConfig, originalResolve, originalOnboard loadAppOnboardConfig, resolveAppOnboarding, onboardApp = originalConfig, originalResolve, originalOnboard
onboardConfigPath, onboardFrom = originalConfigPath, originalFrom onboardConfigPath, onboardFrom = originalConfigPath, originalFrom
onboardAppName, onboardAppRepoURL, onboardImageRepository = originalName, originalRepo, originalImage
}) })
cfg := config.Config{Delivery: config.DeliveryConfig{AppRepoURL: "https://git.example.test/new-org/app.git", AppRepoRef: "main"}} cfg := config.Config{Delivery: config.DeliveryConfig{AppRepoURL: "https://git.example.test/new-org/app.git", AppRepoRef: "main"}}
loadAppOnboardConfig = func(string) (config.Config, error) { return cfg, nil } loadAppOnboardConfig = func(string) (config.Config, error) { return cfg, nil }
resolveAppOnboarding = func(config.Config) (config.Config, error) { return cfg, nil } resolveAppOnboarding = func(got config.Config) (config.Config, error) { return got, nil }
calls := 0 calls := 0
onboardApp = func(got config.Config, checkout string) error { onboardApp = func(got config.Config, checkout string) error {
if checkout != "app-checkout" || got.Delivery.AppRepoURL != cfg.Delivery.AppRepoURL { if checkout != "app-checkout" || got.Delivery.AppName != "fixture" || got.Delivery.AppRepoURL != "https://git.example.test/new-org/fixture.git" || got.Delivery.ImageRepository != "registry.example.test/new-org/fixture" {
t.Fatal("onboarding used the wrong checkout or config") t.Fatal("onboarding used the wrong checkout or config")
} }
calls++ calls++
return nil return nil
} }
onboardConfigPath, onboardFrom = "private.yaml", "app-checkout" onboardConfigPath, onboardFrom = "private.yaml", "app-checkout"
onboardAppName, onboardAppRepoURL, onboardImageRepository = "fixture", "https://git.example.test/new-org/fixture.git", "registry.example.test/new-org/fixture"
if err := runAppOnboard(nil, nil); err != nil || calls != 1 { if err := runAppOnboard(nil, nil); err != nil || calls != 1 {
t.Fatalf("runAppOnboard() = %v, calls = %d", err, calls) t.Fatalf("runAppOnboard() = %v, calls = %d", err, calls)
} }