diff --git a/pkg/transformer/kubernetes/kubernetes.go b/pkg/transformer/kubernetes/kubernetes.go index 15c6a9cc..3c9393f6 100644 --- a/pkg/transformer/kubernetes/kubernetes.go +++ b/pkg/transformer/kubernetes/kubernetes.go @@ -48,6 +48,7 @@ import ( "github.com/pkg/errors" "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/labels" + "sort" ) // Kubernetes implements Transformer interface and represents Kubernetes transformer @@ -480,14 +481,17 @@ func (k *Kubernetes) ConfigPVCVolumeSource(name string, readonly bool) *api.Volu // ConfigEnvs configures the environment variables. func (k *Kubernetes) ConfigEnvs(name string, service kobject.ServiceConfig) []api.EnvVar { - envs := []api.EnvVar{} + envs := transformer.EnvSort{} for _, v := range service.Environment { envs = append(envs, api.EnvVar{ Name: v.Name, Value: v.Value, }) } - + // Stable sorts data while keeping the original order of equal elements + // we need this because envs are not populated in any random order + // this sorting ensures they are populated in a particular order + sort.Stable(envs) return envs } diff --git a/pkg/transformer/openshift/openshift.go b/pkg/transformer/openshift/openshift.go index e76f54f3..77becc02 100644 --- a/pkg/transformer/openshift/openshift.go +++ b/pkg/transformer/openshift/openshift.go @@ -52,6 +52,7 @@ import ( "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/util/intstr" + "sort" ) // OpenShift implements Transformer interface and represents OpenShift transformer @@ -201,13 +202,17 @@ func (o *OpenShift) initImageStream(name string, service kobject.ServiceConfig, // initBuildConfig initialize Openshifts BuildConfig Object func initBuildConfig(name string, service kobject.ServiceConfig, repo string, branch string) (*buildapi.BuildConfig, error) { contextDir, err := getAbsBuildContext(service.Build) - envList := []kapi.EnvVar{} + envList := transformer.EnvSort{} for envName, envValue := range service.BuildArgs { if *envValue == "\x00" { *envValue = os.Getenv(envName) } envList = append(envList, kapi.EnvVar{Name: envName, Value: *envValue}) } + // Stable sorts data while keeping the original order of equal elements + // we need this because envs are not populated in any random order + // this sorting ensures they are populated in a particular order + sort.Stable(envList) if err != nil { return nil, errors.Wrap(err, name+"buildconfig cannot be created due to error in creating build context, getAbsBuildContext failed") } diff --git a/pkg/transformer/utils.go b/pkg/transformer/utils.go index bd887cc6..7cb4285c 100644 --- a/pkg/transformer/utils.go +++ b/pkg/transformer/utils.go @@ -28,6 +28,7 @@ import ( "path/filepath" "github.com/pkg/errors" + "k8s.io/kubernetes/pkg/api" ) const Selector = "io.kompose.service" @@ -151,3 +152,22 @@ func formatProviderName(provider string) string { } return provider } + +// Sort struct +type EnvSort []api.EnvVar + +// returns the number of elements in the collection. +func (env EnvSort) Len() int { + return len(env) +} + +// returns whether the element with index i should sort before +// the element with index j. +func (env EnvSort) Less(i, j int) bool { + return env[i].Name < env[j].Name +} + +// swaps the elements with indexes i and j. +func (env EnvSort) Swap(i, j int) { + env[i], env[j] = env[j], env[i] +}