fix: flatten generated runtime hosts

This commit is contained in:
eding 2026-09-18 21:15:15 +02:00
parent 3dbaeab745
commit a1f480d18c
3 changed files with 38 additions and 18 deletions

View file

@ -167,7 +167,7 @@ spec:
repository: $IMAGE repository: $IMAGE
tag: $TAG tag: $TAG
gateway: gateway:
hostname: $APP_NAME-pr-$PR_NUMBER.{{ .ClusterDomain }} hostname: $APP_NAME-pr-$PR_NUMBER{{ .RuntimeHostnameSuffix }}
EOF EOF
cat > "$app_dir/kustomization.yaml" <<EOF cat > "$app_dir/kustomization.yaml" <<EOF
apiVersion: kustomize.config.k8s.io/v1beta1 apiVersion: kustomize.config.k8s.io/v1beta1

View file

@ -633,6 +633,7 @@ type appDeliveryTemplateConfig struct {
ManifestsRepo string ManifestsRepo string
ManifestsBranch string ManifestsBranch string
ClusterDomain string ClusterDomain string
RuntimeHostnameSuffix string
} }
var deliveryAppName = regexp.MustCompile(`^[a-z0-9]([a-z0-9-]{0,45}[a-z0-9])?$`) var deliveryAppName = regexp.MustCompile(`^[a-z0-9]([a-z0-9-]{0,45}[a-z0-9])?$`)
@ -656,9 +657,9 @@ func renderAppDelivery(cfg config.Config) ([]byte, error) {
AppName: cfg.Delivery.AppName, AppRepository: appRepository, AppRepoURL: cfg.Delivery.AppRepoURL, AppName: cfg.Delivery.AppName, AppRepository: appRepository, AppRepoURL: cfg.Delivery.AppRepoURL,
AppRepoRef: cfg.Delivery.AppRepoRef, ProductionBranch: cfg.Delivery.ProductionBranch, ImageRepository: cfg.Delivery.ImageRepository, AppRepoRef: cfg.Delivery.AppRepoRef, ProductionBranch: cfg.Delivery.ProductionBranch, ImageRepository: cfg.Delivery.ImageRepository,
BuildStrategy: cfg.Delivery.BuildStrategy, BuildOutputDirectory: cfg.Delivery.BuildOutputDirectory, BuildConfiguration: cfg.Delivery.BuildConfiguration, BuildStrategy: cfg.Delivery.BuildStrategy, BuildOutputDirectory: cfg.Delivery.BuildOutputDirectory, BuildConfiguration: cfg.Delivery.BuildConfiguration,
ForgejoBaseURL: origin, ForgejoOwner: cfg.Git.Owner, ManifestsURL: forgejo.CloneURL(origin, cfg.Git.Owner, cfg.Flux.ManifestsRepo), ManifestsRepo: cfg.Flux.ManifestsRepo, ManifestsBranch: cfg.Flux.Branch, ClusterDomain: cfg.Flux.ClusterDomain, ForgejoBaseURL: origin, ForgejoOwner: cfg.Git.Owner, ManifestsURL: forgejo.CloneURL(origin, cfg.Git.Owner, cfg.Flux.ManifestsRepo), ManifestsRepo: cfg.Flux.ManifestsRepo, ManifestsBranch: cfg.Flux.Branch, ClusterDomain: cfg.Flux.ClusterDomain, RuntimeHostnameSuffix: deliveryRuntimeHostnameSuffix(cfg.Flux.ClusterDomain),
} }
for name, value := range map[string]string{"appRepository": values.AppRepository, "appRepoUrl": values.AppRepoURL, "appRepoRef": values.AppRepoRef, "productionBranch": values.ProductionBranch, "imageRepository": values.ImageRepository, "buildOutputDirectory": values.BuildOutputDirectory, "buildConfiguration": values.BuildConfiguration, "forgejoBaseUrl": values.ForgejoBaseURL, "forgejoOwner": values.ForgejoOwner, "manifestsUrl": values.ManifestsURL, "manifestsRepo": values.ManifestsRepo, "manifestsBranch": values.ManifestsBranch, "clusterDomain": values.ClusterDomain} { for name, value := range map[string]string{"appRepository": values.AppRepository, "appRepoUrl": values.AppRepoURL, "appRepoRef": values.AppRepoRef, "productionBranch": values.ProductionBranch, "imageRepository": values.ImageRepository, "buildOutputDirectory": values.BuildOutputDirectory, "buildConfiguration": values.BuildConfiguration, "forgejoBaseUrl": values.ForgejoBaseURL, "forgejoOwner": values.ForgejoOwner, "manifestsUrl": values.ManifestsURL, "manifestsRepo": values.ManifestsRepo, "manifestsBranch": values.ManifestsBranch, "clusterDomain": values.ClusterDomain, "runtimeHostnameSuffix": values.RuntimeHostnameSuffix} {
if value == "" || strings.ContainsAny(value, "\r\n") || config.RedactURL(value) != value { if value == "" || strings.ContainsAny(value, "\r\n") || config.RedactURL(value) != value {
return nil, fmt.Errorf("delivery %s cannot be empty or contain credentials", name) return nil, fmt.Errorf("delivery %s cannot be empty or contain credentials", name)
} }
@ -674,6 +675,14 @@ func renderAppDelivery(cfg config.Config) ([]byte, error) {
return bytes.ReplaceAll(rendered.Bytes(), []byte("\r\n"), []byte("\n")), nil return bytes.ReplaceAll(rendered.Bytes(), []byte("\r\n"), []byte("\n")), nil
} }
func deliveryRuntimeHostnameSuffix(clusterDomain string) string {
labels := strings.Split(clusterDomain, ".")
if len(labels) < 3 {
return "." + clusterDomain
}
return "-" + strings.Join(labels[:len(labels)-2], "-") + "." + strings.Join(labels[len(labels)-2:], ".")
}
func deliveryRepository(baseURL, repositoryURL string) (string, error) { func deliveryRepository(baseURL, repositoryURL string) (string, error) {
base, err := canonicalForgejoOrigin(baseURL) base, err := canonicalForgejoOrigin(baseURL)
if err != nil { if err != nil {

View file

@ -135,6 +135,17 @@ func TestGeneratedDeliveryUsesCombinedStaticBuildArtifactContract(t *testing.T)
} }
} }
func TestDeliveryRuntimeHostnameSuffix(t *testing.T) {
for domain, want := range map[string]string{
"example.test": ".example.test",
"dev02.nid3.com": "-dev02.nid3.com",
} {
if got := deliveryRuntimeHostnameSuffix(domain); got != want {
t.Fatalf("deliveryRuntimeHostnameSuffix(%q) = %q, want %q", domain, got, want)
}
}
}
func TestGeneratedDeliveryUsesRuntimeImageWithoutStaticParameters(t *testing.T) { func TestGeneratedDeliveryUsesRuntimeImageWithoutStaticParameters(t *testing.T) {
cfg := config.Config{ cfg := config.Config{
Git: config.GitConfig{BaseURL: "https://git.example.test", Owner: "platform"}, Git: config.GitConfig{BaseURL: "https://git.example.test", Owner: "platform"},