func describeBuilderImage(config *api.Config, image string, out io.Writer) { c := &api.Config{ DockerConfig: config.DockerConfig, PullAuthentication: config.PullAuthentication, BuilderImage: config.BuilderImage, BuilderPullPolicy: config.BuilderPullPolicy, Tag: config.Tag, IncrementalAuthentication: config.IncrementalAuthentication, } pr, err := docker.GetBuilderImage(c) if err == nil { build.GenerateConfigFromLabels(c, pr) if len(c.DisplayName) > 0 { fmt.Fprintf(out, "Builder Name:\t%s\n", c.DisplayName) } fmt.Fprintf(out, "Builder Image:\t%s\n", config.BuilderImage) if len(c.BuilderImageVersion) > 0 { fmt.Fprintf(out, "Builder Image Version:\t%s\n", c.BuilderImageVersion) } if len(c.BuilderBaseImageVersion) > 0 { fmt.Fprintf(out, "Builder Base Version:\t%s\n", c.BuilderBaseImageVersion) } } else { fmt.Fprintf(out, "Error describing image:\t%s\n", err.Error()) } }
// Strategy creates the appropriate build strategy for the provided config, using // the overrides provided. Not all strategies support all overrides. func Strategy(config *api.Config, overrides build.Overrides) (build.Builder, api.BuildInfo, error) { var builder build.Builder var buildInfo api.BuildInfo image, err := docker.GetBuilderImage(config) if err != nil { buildInfo.FailureReason = utilstatus.NewFailureReason(utilstatus.ReasonPullBuilderImageFailed, utilstatus.ReasonMessagePullBuilderImageFailed) return nil, buildInfo, err } config.HasOnBuild = image.OnBuild // if we're blocking onbuild, just do a normal s2i build flow // which won't do a docker build and invoke the onbuild commands if image.OnBuild && !config.BlockOnBuild { builder, err = onbuild.New(config, overrides) if err != nil { buildInfo.FailureReason = utilstatus.NewFailureReason(utilstatus.ReasonGenericS2IBuildFailed, utilstatus.ReasonMessageGenericS2iBuildFailed) return nil, buildInfo, err } return builder, buildInfo, nil } builder, err = sti.New(config, overrides) if err != nil { buildInfo.FailureReason = utilstatus.NewFailureReason(utilstatus.ReasonGenericS2IBuildFailed, utilstatus.ReasonMessageGenericS2iBuildFailed) return nil, buildInfo, err } return builder, buildInfo, err }
// Strategy creates the appropriate build strategy for the provided config, using // the overrides provided. Not all strategies support all overrides. func Strategy(config *api.Config, overrides build.Overrides) (build.Builder, error) { image, err := docker.GetBuilderImage(config) if err != nil { return nil, err } if image.OnBuild { return onbuild.New(config, overrides) } return sti.New(config, overrides) }
// Strategy creates the appropriate build strategy for the provided config, using // the overrides provided. Not all strategies support all overrides. func Strategy(config *api.Config, overrides build.Overrides) (build.Builder, error) { image, err := docker.GetBuilderImage(config) if err != nil { return nil, err } config.HasOnBuild = image.OnBuild // if we're blocking onbuild, just do a normal s2i build flow // which won't do a docker build and invoke the onbuild commands if image.OnBuild && !config.BlockOnBuild { return onbuild.New(config, overrides) } return sti.New(config, overrides) }
// GenerateConfigFromLabels generates the S2I Config struct from the Docker // image labels. func GenerateConfigFromLabels(image string, config *api.Config) error { result, err := docker.GetBuilderImage(config) if err != nil { return err } source := result.Image if builderVersion, ok := source.Config.Labels["io.openshift.builder-version"]; ok { config.BuilderImageVersion = builderVersion config.BuilderBaseImageVersion = source.Config.Labels["io.openshift.builder-base-version"] } config.ScriptsURL = source.Config.Labels[api.DefaultNamespace+"scripts-url"] if len(config.ScriptsURL) == 0 { // FIXME: Backward compatibility config.ScriptsURL = source.Config.Labels["io.s2i.scripts-url"] } config.Description = source.Config.Labels[api.KubernetesNamespace+"description"] config.DisplayName = source.Config.Labels[api.KubernetesNamespace+"display-name"] if builder, ok := source.Config.Labels[api.DefaultNamespace+"build.image"]; ok { config.BuilderImage = builder } else { return fmt.Errorf("Required label %q not found in image", api.DefaultNamespace+"build.image") } if repo, ok := source.Config.Labels[api.DefaultNamespace+"build.source-location"]; ok { config.Source = repo } else { return fmt.Errorf("Required label %q not found in image", api.DefaultNamespace+"source-location") } config.ContextDir = source.Config.Labels[api.DefaultNamespace+"build.source-context-dir"] config.Ref = source.Config.Labels[api.DefaultNamespace+"build.commit.ref"] return nil }