Skip to content

Commit

Permalink
Run user-provided command as part of build flow
Browse files Browse the repository at this point in the history
This is meant to be used for running project unit tests as part of a
build.

Changes:
- Add utility to run containers and stream logs
- Add build spec API field for post commit actions

  Includes a common-case API for running a shell script and an
  kapi.Container-like API for more sophisticated use cases.

A good deal of this was done pair programming with @PI-Victor.
  • Loading branch information
rhcarvalho committed Feb 15, 2016
1 parent b225f77 commit 3e5a859
Show file tree
Hide file tree
Showing 20 changed files with 904 additions and 16 deletions.
31 changes: 31 additions & 0 deletions api/swagger-spec/oapi-v1.json
Original file line number Diff line number Diff line change
Expand Up @@ -17373,6 +17373,10 @@
"$ref": "v1.ResourceRequirements",
"description": "the desired compute resources the build should have"
},
"postCommit": {
"$ref": "v1.BuildPostCommitSpec",
"description": "an action executed after the build output image is committed"
},
"completionDeadlineSeconds": {
"type": "integer",
"format": "int64",
Expand Down Expand Up @@ -17924,6 +17928,29 @@
}
}
},
"v1.BuildPostCommitSpec": {
"id": "v1.BuildPostCommitSpec",
"properties": {
"command": {
"type": "array",
"items": {
"type": "string"
},
"description": "command to be executed in a container running the build output image replacing the image's entrypoint"
},
"args": {
"type": "array",
"items": {
"type": "string"
},
"description": "arguments to command, script or the default image entrypoint"
},
"script": {
"type": "string",
"description": "shell script to be executed in a container running the build output image"
}
}
},
"v1.BuildConfigStatus": {
"id": "v1.BuildConfigStatus",
"required": [
Expand Down Expand Up @@ -18188,6 +18215,10 @@
"$ref": "v1.ResourceRequirements",
"description": "the desired compute resources the build should have"
},
"postCommit": {
"$ref": "v1.BuildPostCommitSpec",
"description": "an action executed after the build output image is committed"
},
"completionDeadlineSeconds": {
"type": "integer",
"format": "int64",
Expand Down
25 changes: 25 additions & 0 deletions pkg/api/deep_copy_generated.go
Original file line number Diff line number Diff line change
Expand Up @@ -881,6 +881,27 @@ func deepCopy_api_BuildOutput(in buildapi.BuildOutput, out *buildapi.BuildOutput
return nil
}

func deepCopy_api_BuildPostCommitSpec(in buildapi.BuildPostCommitSpec, out *buildapi.BuildPostCommitSpec, c *conversion.Cloner) error {
if in.Command != nil {
out.Command = make([]string, len(in.Command))
for i := range in.Command {
out.Command[i] = in.Command[i]
}
} else {
out.Command = nil
}
if in.Args != nil {
out.Args = make([]string, len(in.Args))
for i := range in.Args {
out.Args[i] = in.Args[i]
}
} else {
out.Args = nil
}
out.Script = in.Script
return nil
}

func deepCopy_api_BuildRequest(in buildapi.BuildRequest, out *buildapi.BuildRequest, c *conversion.Cloner) error {
if newVal, err := c.DeepCopy(in.TypeMeta); err != nil {
return err
Expand Down Expand Up @@ -1027,6 +1048,9 @@ func deepCopy_api_BuildSpec(in buildapi.BuildSpec, out *buildapi.BuildSpec, c *c
} else {
out.Resources = newVal.(pkgapi.ResourceRequirements)
}
if err := deepCopy_api_BuildPostCommitSpec(in.PostCommit, &out.PostCommit, c); err != nil {
return err
}
if in.CompletionDeadlineSeconds != nil {
out.CompletionDeadlineSeconds = new(int64)
*out.CompletionDeadlineSeconds = *in.CompletionDeadlineSeconds
Expand Down Expand Up @@ -3292,6 +3316,7 @@ func init() {
deepCopy_api_BuildLog,
deepCopy_api_BuildLogOptions,
deepCopy_api_BuildOutput,
deepCopy_api_BuildPostCommitSpec,
deepCopy_api_BuildRequest,
deepCopy_api_BuildSource,
deepCopy_api_BuildSpec,
Expand Down
64 changes: 64 additions & 0 deletions pkg/api/v1/conversion_generated.go
Original file line number Diff line number Diff line change
Expand Up @@ -1172,6 +1172,34 @@ func autoConvert_api_BuildOutput_To_v1_BuildOutput(in *buildapi.BuildOutput, out
return nil
}

func autoConvert_api_BuildPostCommitSpec_To_v1_BuildPostCommitSpec(in *buildapi.BuildPostCommitSpec, out *v1.BuildPostCommitSpec, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*buildapi.BuildPostCommitSpec))(in)
}
if in.Command != nil {
out.Command = make([]string, len(in.Command))
for i := range in.Command {
out.Command[i] = in.Command[i]
}
} else {
out.Command = nil
}
if in.Args != nil {
out.Args = make([]string, len(in.Args))
for i := range in.Args {
out.Args[i] = in.Args[i]
}
} else {
out.Args = nil
}
out.Script = in.Script
return nil
}

func Convert_api_BuildPostCommitSpec_To_v1_BuildPostCommitSpec(in *buildapi.BuildPostCommitSpec, out *v1.BuildPostCommitSpec, s conversion.Scope) error {
return autoConvert_api_BuildPostCommitSpec_To_v1_BuildPostCommitSpec(in, out, s)
}

func autoConvert_api_BuildRequest_To_v1_BuildRequest(in *buildapi.BuildRequest, out *v1.BuildRequest, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*buildapi.BuildRequest))(in)
Expand Down Expand Up @@ -1323,6 +1351,9 @@ func autoConvert_api_BuildSpec_To_v1_BuildSpec(in *buildapi.BuildSpec, out *v1.B
if err := Convert_api_ResourceRequirements_To_v1_ResourceRequirements(&in.Resources, &out.Resources, s); err != nil {
return err
}
if err := Convert_api_BuildPostCommitSpec_To_v1_BuildPostCommitSpec(&in.PostCommit, &out.PostCommit, s); err != nil {
return err
}
if in.CompletionDeadlineSeconds != nil {
out.CompletionDeadlineSeconds = new(int64)
*out.CompletionDeadlineSeconds = *in.CompletionDeadlineSeconds
Expand Down Expand Up @@ -1978,6 +2009,34 @@ func autoConvert_v1_BuildOutput_To_api_BuildOutput(in *v1.BuildOutput, out *buil
return nil
}

func autoConvert_v1_BuildPostCommitSpec_To_api_BuildPostCommitSpec(in *v1.BuildPostCommitSpec, out *buildapi.BuildPostCommitSpec, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*v1.BuildPostCommitSpec))(in)
}
if in.Command != nil {
out.Command = make([]string, len(in.Command))
for i := range in.Command {
out.Command[i] = in.Command[i]
}
} else {
out.Command = nil
}
if in.Args != nil {
out.Args = make([]string, len(in.Args))
for i := range in.Args {
out.Args[i] = in.Args[i]
}
} else {
out.Args = nil
}
out.Script = in.Script
return nil
}

func Convert_v1_BuildPostCommitSpec_To_api_BuildPostCommitSpec(in *v1.BuildPostCommitSpec, out *buildapi.BuildPostCommitSpec, s conversion.Scope) error {
return autoConvert_v1_BuildPostCommitSpec_To_api_BuildPostCommitSpec(in, out, s)
}

func autoConvert_v1_BuildRequest_To_api_BuildRequest(in *v1.BuildRequest, out *buildapi.BuildRequest, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*v1.BuildRequest))(in)
Expand Down Expand Up @@ -2130,6 +2189,9 @@ func autoConvert_v1_BuildSpec_To_api_BuildSpec(in *v1.BuildSpec, out *buildapi.B
if err := Convert_v1_ResourceRequirements_To_api_ResourceRequirements(&in.Resources, &out.Resources, s); err != nil {
return err
}
if err := Convert_v1_BuildPostCommitSpec_To_api_BuildPostCommitSpec(&in.PostCommit, &out.PostCommit, s); err != nil {
return err
}
if in.CompletionDeadlineSeconds != nil {
out.CompletionDeadlineSeconds = new(int64)
*out.CompletionDeadlineSeconds = *in.CompletionDeadlineSeconds
Expand Down Expand Up @@ -8626,6 +8688,7 @@ func init() {
autoConvert_api_BuildLogOptions_To_v1_BuildLogOptions,
autoConvert_api_BuildLog_To_v1_BuildLog,
autoConvert_api_BuildOutput_To_v1_BuildOutput,
autoConvert_api_BuildPostCommitSpec_To_v1_BuildPostCommitSpec,
autoConvert_api_BuildRequest_To_v1_BuildRequest,
autoConvert_api_BuildSource_To_v1_BuildSource,
autoConvert_api_BuildSpec_To_v1_BuildSpec,
Expand Down Expand Up @@ -8800,6 +8863,7 @@ func init() {
autoConvert_v1_BuildLogOptions_To_api_BuildLogOptions,
autoConvert_v1_BuildLog_To_api_BuildLog,
autoConvert_v1_BuildOutput_To_api_BuildOutput,
autoConvert_v1_BuildPostCommitSpec_To_api_BuildPostCommitSpec,
autoConvert_v1_BuildRequest_To_api_BuildRequest,
autoConvert_v1_BuildSource_To_api_BuildSource,
autoConvert_v1_BuildSpec_To_api_BuildSpec,
Expand Down
25 changes: 25 additions & 0 deletions pkg/api/v1/deep_copy_generated.go
Original file line number Diff line number Diff line change
Expand Up @@ -901,6 +901,27 @@ func deepCopy_v1_BuildOutput(in apiv1.BuildOutput, out *apiv1.BuildOutput, c *co
return nil
}

func deepCopy_v1_BuildPostCommitSpec(in apiv1.BuildPostCommitSpec, out *apiv1.BuildPostCommitSpec, c *conversion.Cloner) error {
if in.Command != nil {
out.Command = make([]string, len(in.Command))
for i := range in.Command {
out.Command[i] = in.Command[i]
}
} else {
out.Command = nil
}
if in.Args != nil {
out.Args = make([]string, len(in.Args))
for i := range in.Args {
out.Args[i] = in.Args[i]
}
} else {
out.Args = nil
}
out.Script = in.Script
return nil
}

func deepCopy_v1_BuildRequest(in apiv1.BuildRequest, out *apiv1.BuildRequest, c *conversion.Cloner) error {
if newVal, err := c.DeepCopy(in.TypeMeta); err != nil {
return err
Expand Down Expand Up @@ -1048,6 +1069,9 @@ func deepCopy_v1_BuildSpec(in apiv1.BuildSpec, out *apiv1.BuildSpec, c *conversi
} else {
out.Resources = newVal.(pkgapiv1.ResourceRequirements)
}
if err := deepCopy_v1_BuildPostCommitSpec(in.PostCommit, &out.PostCommit, c); err != nil {
return err
}
if in.CompletionDeadlineSeconds != nil {
out.CompletionDeadlineSeconds = new(int64)
*out.CompletionDeadlineSeconds = *in.CompletionDeadlineSeconds
Expand Down Expand Up @@ -3181,6 +3205,7 @@ func init() {
deepCopy_v1_BuildLog,
deepCopy_v1_BuildLogOptions,
deepCopy_v1_BuildOutput,
deepCopy_v1_BuildPostCommitSpec,
deepCopy_v1_BuildRequest,
deepCopy_v1_BuildSource,
deepCopy_v1_BuildSpec,
Expand Down
64 changes: 64 additions & 0 deletions pkg/api/v1beta3/conversion_generated.go
Original file line number Diff line number Diff line change
Expand Up @@ -1180,6 +1180,34 @@ func autoConvert_api_BuildOutput_To_v1beta3_BuildOutput(in *buildapi.BuildOutput
return nil
}

func autoConvert_api_BuildPostCommitSpec_To_v1beta3_BuildPostCommitSpec(in *buildapi.BuildPostCommitSpec, out *v1beta3.BuildPostCommitSpec, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*buildapi.BuildPostCommitSpec))(in)
}
if in.Command != nil {
out.Command = make([]string, len(in.Command))
for i := range in.Command {
out.Command[i] = in.Command[i]
}
} else {
out.Command = nil
}
if in.Args != nil {
out.Args = make([]string, len(in.Args))
for i := range in.Args {
out.Args[i] = in.Args[i]
}
} else {
out.Args = nil
}
out.Script = in.Script
return nil
}

func Convert_api_BuildPostCommitSpec_To_v1beta3_BuildPostCommitSpec(in *buildapi.BuildPostCommitSpec, out *v1beta3.BuildPostCommitSpec, s conversion.Scope) error {
return autoConvert_api_BuildPostCommitSpec_To_v1beta3_BuildPostCommitSpec(in, out, s)
}

func autoConvert_api_BuildSource_To_v1beta3_BuildSource(in *buildapi.BuildSource, out *v1beta3.BuildSource, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*buildapi.BuildSource))(in)
Expand Down Expand Up @@ -1266,6 +1294,9 @@ func autoConvert_api_BuildSpec_To_v1beta3_BuildSpec(in *buildapi.BuildSpec, out
if err := Convert_api_ResourceRequirements_To_v1beta3_ResourceRequirements(&in.Resources, &out.Resources, s); err != nil {
return err
}
if err := Convert_api_BuildPostCommitSpec_To_v1beta3_BuildPostCommitSpec(&in.PostCommit, &out.PostCommit, s); err != nil {
return err
}
if in.CompletionDeadlineSeconds != nil {
out.CompletionDeadlineSeconds = new(int64)
*out.CompletionDeadlineSeconds = *in.CompletionDeadlineSeconds
Expand Down Expand Up @@ -1921,6 +1952,34 @@ func autoConvert_v1beta3_BuildOutput_To_api_BuildOutput(in *v1beta3.BuildOutput,
return nil
}

func autoConvert_v1beta3_BuildPostCommitSpec_To_api_BuildPostCommitSpec(in *v1beta3.BuildPostCommitSpec, out *buildapi.BuildPostCommitSpec, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*v1beta3.BuildPostCommitSpec))(in)
}
if in.Command != nil {
out.Command = make([]string, len(in.Command))
for i := range in.Command {
out.Command[i] = in.Command[i]
}
} else {
out.Command = nil
}
if in.Args != nil {
out.Args = make([]string, len(in.Args))
for i := range in.Args {
out.Args[i] = in.Args[i]
}
} else {
out.Args = nil
}
out.Script = in.Script
return nil
}

func Convert_v1beta3_BuildPostCommitSpec_To_api_BuildPostCommitSpec(in *v1beta3.BuildPostCommitSpec, out *buildapi.BuildPostCommitSpec, s conversion.Scope) error {
return autoConvert_v1beta3_BuildPostCommitSpec_To_api_BuildPostCommitSpec(in, out, s)
}

func autoConvert_v1beta3_BuildSource_To_api_BuildSource(in *v1beta3.BuildSource, out *buildapi.BuildSource, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*v1beta3.BuildSource))(in)
Expand Down Expand Up @@ -2008,6 +2067,9 @@ func autoConvert_v1beta3_BuildSpec_To_api_BuildSpec(in *v1beta3.BuildSpec, out *
if err := Convert_v1beta3_ResourceRequirements_To_api_ResourceRequirements(&in.Resources, &out.Resources, s); err != nil {
return err
}
if err := Convert_v1beta3_BuildPostCommitSpec_To_api_BuildPostCommitSpec(&in.PostCommit, &out.PostCommit, s); err != nil {
return err
}
if in.CompletionDeadlineSeconds != nil {
out.CompletionDeadlineSeconds = new(int64)
*out.CompletionDeadlineSeconds = *in.CompletionDeadlineSeconds
Expand Down Expand Up @@ -6781,6 +6843,7 @@ func init() {
autoConvert_api_BuildLogOptions_To_v1beta3_BuildLogOptions,
autoConvert_api_BuildLog_To_v1beta3_BuildLog,
autoConvert_api_BuildOutput_To_v1beta3_BuildOutput,
autoConvert_api_BuildPostCommitSpec_To_v1beta3_BuildPostCommitSpec,
autoConvert_api_BuildSource_To_v1beta3_BuildSource,
autoConvert_api_BuildSpec_To_v1beta3_BuildSpec,
autoConvert_api_BuildStatus_To_v1beta3_BuildStatus,
Expand Down Expand Up @@ -6924,6 +6987,7 @@ func init() {
autoConvert_v1beta3_BuildLogOptions_To_api_BuildLogOptions,
autoConvert_v1beta3_BuildLog_To_api_BuildLog,
autoConvert_v1beta3_BuildOutput_To_api_BuildOutput,
autoConvert_v1beta3_BuildPostCommitSpec_To_api_BuildPostCommitSpec,
autoConvert_v1beta3_BuildSource_To_api_BuildSource,
autoConvert_v1beta3_BuildSpec_To_api_BuildSpec,
autoConvert_v1beta3_BuildStatus_To_api_BuildStatus,
Expand Down
Loading

0 comments on commit 3e5a859

Please sign in to comment.