Skip to content

Commit f05aedf

Browse files
committed
Adding --build-env and --build-env-file to oc new-app
1 parent 8394f91 commit f05aedf

File tree

14 files changed

+160
-28
lines changed

14 files changed

+160
-28
lines changed

contrib/completions/bash/oc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10635,6 +10635,12 @@ _oc_new-app()
1063510635
local_nonpersistent_flags+=("--allow-missing-imagestream-tags")
1063610636
flags+=("--as-test")
1063710637
local_nonpersistent_flags+=("--as-test")
10638+
flags+=("--build-env=")
10639+
local_nonpersistent_flags+=("--build-env=")
10640+
flags+=("--build-env-file=")
10641+
flags_with_completion+=("--build-env-file")
10642+
flags_completion+=("_filedir")
10643+
local_nonpersistent_flags+=("--build-env-file=")
1063810644
flags+=("--code=")
1063910645
local_nonpersistent_flags+=("--code=")
1064010646
flags+=("--context-dir=")

contrib/completions/bash/openshift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15322,6 +15322,12 @@ _openshift_cli_new-app()
1532215322
local_nonpersistent_flags+=("--allow-missing-imagestream-tags")
1532315323
flags+=("--as-test")
1532415324
local_nonpersistent_flags+=("--as-test")
15325+
flags+=("--build-env=")
15326+
local_nonpersistent_flags+=("--build-env=")
15327+
flags+=("--build-env-file=")
15328+
flags_with_completion+=("--build-env-file")
15329+
flags_completion+=("_filedir")
15330+
local_nonpersistent_flags+=("--build-env-file=")
1532515331
flags+=("--code=")
1532615332
local_nonpersistent_flags+=("--code=")
1532715333
flags+=("--context-dir=")

contrib/completions/zsh/oc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10783,6 +10783,12 @@ _oc_new-app()
1078310783
local_nonpersistent_flags+=("--allow-missing-imagestream-tags")
1078410784
flags+=("--as-test")
1078510785
local_nonpersistent_flags+=("--as-test")
10786+
flags+=("--build-env=")
10787+
local_nonpersistent_flags+=("--build-env=")
10788+
flags+=("--build-env-file=")
10789+
flags_with_completion+=("--build-env-file")
10790+
flags_completion+=("_filedir")
10791+
local_nonpersistent_flags+=("--build-env-file=")
1078610792
flags+=("--code=")
1078710793
local_nonpersistent_flags+=("--code=")
1078810794
flags+=("--context-dir=")

contrib/completions/zsh/openshift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15470,6 +15470,12 @@ _openshift_cli_new-app()
1547015470
local_nonpersistent_flags+=("--allow-missing-imagestream-tags")
1547115471
flags+=("--as-test")
1547215472
local_nonpersistent_flags+=("--as-test")
15473+
flags+=("--build-env=")
15474+
local_nonpersistent_flags+=("--build-env=")
15475+
flags+=("--build-env-file=")
15476+
flags_with_completion+=("--build-env-file")
15477+
flags_completion+=("_filedir")
15478+
local_nonpersistent_flags+=("--build-env-file=")
1547315479
flags+=("--code=")
1547415480
local_nonpersistent_flags+=("--code=")
1547515481
flags+=("--context-dir=")

docs/man/man1/oc-new-app.1

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@ If you provide source code, a new build will be automatically triggered. You can
3838
\fB\-\-as\-test\fP=false
3939
If true create this application as a test deployment, which validates that the deployment succeeds and then scales down.
4040

41+
.PP
42+
\fB\-\-build\-env\fP=[]
43+
Specify a key\-value pair for an environment variable to set into each build image.
44+
45+
.PP
46+
\fB\-\-build\-env\-file\fP=[]
47+
File containing key\-value pairs of environment variables to set into each build image.
48+
4149
.PP
4250
\fB\-\-code\fP=[]
4351
Source code to use to build this application.

docs/man/man1/openshift-cli-new-app.1

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@ If you provide source code, a new build will be automatically triggered. You can
3838
\fB\-\-as\-test\fP=false
3939
If true create this application as a test deployment, which validates that the deployment succeeds and then scales down.
4040

41+
.PP
42+
\fB\-\-build\-env\fP=[]
43+
Specify a key\-value pair for an environment variable to set into each build image.
44+
45+
.PP
46+
\fB\-\-build\-env\-file\fP=[]
47+
File containing key\-value pairs of environment variables to set into each build image.
48+
4149
.PP
4250
\fB\-\-code\fP=[]
4351
Source code to use to build this application.

pkg/cmd/cli/cmd/newapp.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,9 @@ func NewCmdNewApplication(name, baseName string, f *clientcmd.Factory, in io.Rea
171171
cmd.Flags().StringArrayVarP(&config.Environment, "env", "e", config.Environment, "Specify a key-value pair for an environment variable to set into each container.")
172172
cmd.Flags().StringArrayVar(&config.EnvironmentFiles, "env-file", config.EnvironmentFiles, "File containing key-value pairs of environment variables to set into each container.")
173173
cmd.MarkFlagFilename("env-file")
174+
cmd.Flags().StringArrayVar(&config.BuildEnvironment, "build-env", config.BuildEnvironment, "Specify a key-value pair for an environment variable to set into each build image.")
175+
cmd.Flags().StringArrayVar(&config.BuildEnvironmentFiles, "build-env-file", config.BuildEnvironmentFiles, "File containing key-value pairs of environment variables to set into each build image.")
176+
cmd.MarkFlagFilename("build-env-file")
174177
cmd.Flags().StringVar(&config.Name, "name", "", "Set name to use for generated application artifacts")
175178
cmd.Flags().Var(&config.Strategy, "strategy", "Specify the build strategy to use if you don't want to detect (docker|pipeline|source).")
176179
cmd.Flags().StringP("labels", "l", "", "Label to set in all resources for this application.")
@@ -214,6 +217,7 @@ func (o *NewAppOptions) Complete(baseName, commandName string, f *clientcmd.Fact
214217
o.Config.DryRun = o.Action.DryRun
215218

216219
cmdutil.WarnAboutCommaSeparation(o.ErrOut, o.Config.Environment, "--env")
220+
cmdutil.WarnAboutCommaSeparation(o.ErrOut, o.Config.BuildEnvironment, "--build-env")
217221
cmdutil.WarnAboutCommaSeparation(o.ErrOut, o.Config.TemplateParameters, "--param")
218222

219223
o.CommandPath = c.CommandPath()

pkg/cmd/cli/cmd/newapp_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ func TestNewAppDefaultFlags(t *testing.T) {
6666
flagName: "env",
6767
defaultVal: "[" + strings.Join(config.Environment, ",") + "]",
6868
},
69+
"build-env": {
70+
flagName: "build-env",
71+
defaultVal: "[" + strings.Join(config.BuildEnvironment, ",") + "]",
72+
},
6973
"name": {
7074
flagName: "name",
7175
defaultVal: config.Name,
@@ -176,6 +180,18 @@ func TestNewAppRunFailure(t *testing.T) {
176180
},
177181
expectedErr: "--search can't be used with --env",
178182
},
183+
"search_with_build_env": {
184+
config: &newcmd.AppConfig{
185+
AsSearch: true,
186+
ComponentInputs: newcmd.ComponentInputs{
187+
Components: []string{"mysql"},
188+
},
189+
GenerationInputs: newcmd.GenerationInputs{
190+
BuildEnvironment: []string{"FOO=BAR"},
191+
},
192+
},
193+
expectedErr: "--search can't be used with --build-env",
194+
},
179195
"search_with_param": {
180196
config: &newcmd.AppConfig{
181197
AsSearch: true,

pkg/cmd/cli/cmd/newbuild.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ type NewBuildOptions struct {
101101
func NewCmdNewBuild(name, baseName string, f *clientcmd.Factory, in io.Reader, out, errout io.Writer) *cobra.Command {
102102
config := newcmd.NewAppConfig()
103103
config.ExpectToBuild = true
104-
config.AddEnvironmentToBuild = true
105104
o := &NewBuildOptions{Config: config}
106105

107106
cmd := &cobra.Command{
@@ -129,8 +128,13 @@ func NewCmdNewBuild(name, baseName string, f *clientcmd.Factory, in io.Reader, o
129128
cmd.Flags().StringVar(&config.Name, "name", "", "Set name to use for generated build artifacts.")
130129
cmd.Flags().StringVar(&config.To, "to", "", "Push built images to this image stream tag (or Docker image repository if --to-docker is set).")
131130
cmd.Flags().BoolVar(&config.OutputDocker, "to-docker", false, "If true, have the build output push to a Docker repository.")
132-
cmd.Flags().StringArrayVarP(&config.Environment, "env", "e", config.Environment, "Specify a key-value pair for an environment variable to set into resulting image.")
133-
cmd.Flags().StringArrayVar(&config.EnvironmentFiles, "env-file", config.EnvironmentFiles, "File containing key-value pairs of environment variables to set into each container.")
131+
cmd.Flags().StringArrayVar(&config.BuildEnvironment, "build-env", config.BuildEnvironment, "Specify a key-value pair for an environment variable to set into resulting image.")
132+
cmd.Flags().MarkHidden("build-env")
133+
cmd.Flags().StringArrayVarP(&config.BuildEnvironment, "env", "e", config.BuildEnvironment, "Specify a key-value pair for an environment variable to set into resulting image.")
134+
cmd.Flags().StringArrayVar(&config.BuildEnvironmentFiles, "build-env-file", config.BuildEnvironmentFiles, "File containing key-value pairs of environment variables to set into each container.")
135+
cmd.MarkFlagFilename("build-env-file")
136+
cmd.Flags().MarkHidden("build-env-file")
137+
cmd.Flags().StringArrayVar(&config.BuildEnvironmentFiles, "env-file", config.BuildEnvironmentFiles, "File containing key-value pairs of environment variables to set into each container.")
134138
cmd.MarkFlagFilename("env-file")
135139
cmd.Flags().Var(&config.Strategy, "strategy", "Specify the build strategy to use if you don't want to detect (docker|pipeline|source).")
136140
cmd.Flags().StringVarP(&config.Dockerfile, "dockerfile", "D", "", "Specify the contents of a Dockerfile to build directly, implies --strategy=docker. Pass '-' to read from STDIN.")
@@ -180,6 +184,7 @@ func (o *NewBuildOptions) Complete(baseName, commandName string, f *clientcmd.Fa
180184
o.CommandName = commandName
181185

182186
cmdutil.WarnAboutCommaSeparation(o.ErrOut, o.Config.Environment, "--env")
187+
cmdutil.WarnAboutCommaSeparation(o.ErrOut, o.Config.BuildEnvironment, "--build-env")
183188

184189
mapper, _ := f.Object()
185190
o.PrintObject = cmdutil.VersionedPrintObject(f.PrintObject, c, mapper, out)

pkg/generate/app/cmd/newapp.go

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,12 @@ const (
5252
type GenerationInputs struct {
5353
TemplateParameters []string
5454
Environment []string
55+
BuildEnvironment []string
5556
Labels map[string]string
5657

5758
TemplateParameterFiles []string
5859
EnvironmentFiles []string
59-
60-
AddEnvironmentToBuild bool
60+
BuildEnvironmentFiles []string
6161

6262
InsecureRegistry bool
6363

@@ -282,7 +282,7 @@ func validateOutputImageReference(ref string) error {
282282
// buildPipelines converts a set of resolved, valid references into pipelines.
283283
func (c *AppConfig) buildPipelines(components app.ComponentReferences, environment app.Environment) (app.PipelineGroup, error) {
284284
pipelines := app.PipelineGroup{}
285-
pipelineBuilder := app.NewPipelineBuilder(c.Name, c.GetBuildEnvironment(environment), c.OutputDocker).To(c.To)
285+
pipelineBuilder := app.NewPipelineBuilder(c.Name, c.GetBuildEnvironment(), c.OutputDocker).To(c.To)
286286
for _, group := range components.Group() {
287287
glog.V(4).Infof("found group: %v", group)
288288
common := app.PipelineGroup{}
@@ -503,7 +503,7 @@ func (c *AppConfig) installComponents(components app.ComponentReferences, env ap
503503

504504
// RunQuery executes the provided config and returns the result of the resolution.
505505
func (c *AppConfig) RunQuery() (*QueryResult, error) {
506-
environment, parameters, err := c.validate()
506+
environment, buildEnvironment, parameters, err := c.validate()
507507
if err != nil {
508508
return nil, err
509509
}
@@ -539,6 +539,9 @@ func (c *AppConfig) RunQuery() (*QueryResult, error) {
539539
if len(environment) > 0 {
540540
errs = append(errs, errors.New("--search can't be used with --env"))
541541
}
542+
if len(buildEnvironment) > 0 {
543+
errs = append(errs, errors.New("--search can't be used with --build-env"))
544+
}
542545
if len(parameters) > 0 {
543546
errs = append(errs, errors.New("--search can't be used with --param"))
544547
}
@@ -576,7 +579,7 @@ func (c *AppConfig) RunQuery() (*QueryResult, error) {
576579
}, nil
577580
}
578581

579-
func (c *AppConfig) validate() (app.Environment, app.Environment, error) {
582+
func (c *AppConfig) validate() (app.Environment, app.Environment, app.Environment, error) {
580583
env, err := app.ParseAndCombineEnvironment(c.Environment, c.EnvironmentFiles, c.In, func(key, file string) error {
581584
if file == "" {
582585
fmt.Fprintf(c.ErrOut, "warning: Environment variable %q was overwritten\n", key)
@@ -586,7 +589,18 @@ func (c *AppConfig) validate() (app.Environment, app.Environment, error) {
586589
return nil
587590
})
588591
if err != nil {
589-
return nil, nil, err
592+
return nil, nil, nil, err
593+
}
594+
buildEnv, err := app.ParseAndCombineEnvironment(c.BuildEnvironment, c.BuildEnvironmentFiles, c.In, func(key, file string) error {
595+
if file == "" {
596+
fmt.Fprintf(c.ErrOut, "warning: Build Environment variable %q was overwritten\n", key)
597+
} else {
598+
fmt.Fprintf(c.ErrOut, "warning: Build Environment variable %q already defined, ignoring value from file %q\n", key, file)
599+
}
600+
return nil
601+
})
602+
if err != nil {
603+
return nil, nil, nil, err
590604
}
591605
params, err := app.ParseAndCombineEnvironment(c.TemplateParameters, c.TemplateParameterFiles, c.In, func(key, file string) error {
592606
if file == "" {
@@ -597,14 +611,14 @@ func (c *AppConfig) validate() (app.Environment, app.Environment, error) {
597611
return nil
598612
})
599613
if err != nil {
600-
return nil, nil, err
614+
return nil, nil, nil, err
601615
}
602-
return env, params, nil
616+
return env, buildEnv, params, nil
603617
}
604618

605619
// Run executes the provided config to generate objects.
606620
func (c *AppConfig) Run() (*AppResult, error) {
607-
env, parameters, err := c.validate()
621+
env, _, parameters, err := c.validate()
608622
if err != nil {
609623
return nil, err
610624
}
@@ -921,11 +935,10 @@ func (c *AppConfig) HasArguments() bool {
921935
len(c.TemplateFiles) > 0
922936
}
923937

924-
func (c *AppConfig) GetBuildEnvironment(environment app.Environment) app.Environment {
925-
if c.AddEnvironmentToBuild {
926-
return environment
927-
}
928-
return app.Environment{}
938+
func (c *AppConfig) GetBuildEnvironment() app.Environment {
939+
_, buildEnv, _, _ := c.validate()
940+
return buildEnv
941+
929942
}
930943

931944
func optionallyValidateExposedPorts(config *AppConfig, repositories app.SourceRepositories) error {

pkg/generate/app/cmd/newapp_test.go

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ func TestValidate(t *testing.T) {
3131
componentValues []string
3232
sourceRepoLocations []string
3333
env map[string]string
34+
buildEnv map[string]string
3435
parms map[string]string
3536
}{
3637
"components": {
@@ -42,6 +43,7 @@ func TestValidate(t *testing.T) {
4243
componentValues: []string{"one", "two", "three/four"},
4344
sourceRepoLocations: []string{},
4445
env: map[string]string{},
46+
buildEnv: map[string]string{},
4547
parms: map[string]string{},
4648
},
4749
"envs": {
@@ -53,6 +55,19 @@ func TestValidate(t *testing.T) {
5355
componentValues: []string{},
5456
sourceRepoLocations: []string{},
5557
env: map[string]string{"one": "first", "two": "second", "three": "third"},
58+
buildEnv: map[string]string{},
59+
parms: map[string]string{},
60+
},
61+
"build-envs": {
62+
cfg: AppConfig{
63+
GenerationInputs: GenerationInputs{
64+
BuildEnvironment: []string{"one=first", "two=second", "three=third"},
65+
},
66+
},
67+
componentValues: []string{},
68+
sourceRepoLocations: []string{},
69+
env: map[string]string{},
70+
buildEnv: map[string]string{"one": "first", "two": "second", "three": "third"},
5671
parms: map[string]string{},
5772
},
5873
"component+source": {
@@ -64,6 +79,7 @@ func TestValidate(t *testing.T) {
6479
componentValues: []string{"one"},
6580
sourceRepoLocations: []string{"https://server/repo.git"},
6681
env: map[string]string{},
82+
buildEnv: map[string]string{},
6783
parms: map[string]string{},
6884
},
6985
"components+source": {
@@ -75,6 +91,7 @@ func TestValidate(t *testing.T) {
7591
componentValues: []string{"mysql", "ruby"},
7692
sourceRepoLocations: []string{"git://github.com/namespace/repo.git"},
7793
env: map[string]string{},
94+
buildEnv: map[string]string{},
7895
parms: map[string]string{},
7996
},
8097
"components+parms": {
@@ -89,15 +106,13 @@ func TestValidate(t *testing.T) {
89106
componentValues: []string{"ruby-helloworld-sample"},
90107
sourceRepoLocations: []string{},
91108
env: map[string]string{},
92-
parms: map[string]string{
93-
"one": "first",
94-
"two": "second",
95-
},
109+
buildEnv: map[string]string{},
110+
parms: map[string]string{"one": "first", "two": "second"},
96111
},
97112
}
98113
for n, c := range tests {
99114
b := &app.ReferenceBuilder{}
100-
env, parms, err := c.cfg.validate()
115+
env, buildEnv, parms, err := c.cfg.validate()
101116
if err != nil {
102117
t.Errorf("%s: Unexpected error: %v", n, err)
103118
continue
@@ -129,6 +144,15 @@ func TestValidate(t *testing.T) {
129144
break
130145
}
131146
}
147+
if len(buildEnv) != len(c.buildEnv) {
148+
t.Errorf("%s: Environment variables don't match. Expected: %v, Got: %v", n, c.buildEnv, buildEnv)
149+
}
150+
for e, v := range buildEnv {
151+
if c.buildEnv[e] != v {
152+
t.Errorf("%s: Environment variables don't match. Expected: %v, Got: %v", n, c.buildEnv, buildEnv)
153+
break
154+
}
155+
}
132156
if len(parms) != len(c.parms) {
133157
t.Errorf("%s: Template parameters don't match. Expected: %v, Got: %v", n, c.parms, parms)
134158
}
@@ -165,7 +189,7 @@ func TestBuildTemplates(t *testing.T) {
165189
appCfg.TemplateParameters = append(appCfg.TemplateParameters, fmt.Sprintf("%v=%v", k, v))
166190
}
167191

168-
_, parms, err := appCfg.validate()
192+
_, _, parms, err := appCfg.validate()
169193
if err != nil {
170194
t.Errorf("%s: Unexpected error: %v", n, err)
171195
continue

0 commit comments

Comments
 (0)