// AddDockerfile adds a Dockerfile passed in the command line to the reference // builder. func AddDockerfileToSourceRepositories(b *app.ReferenceBuilder, dockerfile string) error { _, repos, errs := b.Result() if err := kutilerrors.NewAggregate(errs); err != nil { return err } switch len(repos) { case 0: // Create a new SourceRepository with the Dockerfile. repo, err := app.NewSourceRepositoryForDockerfile(dockerfile) if err != nil { return fmt.Errorf("provided Dockerfile is not valid: %v", err) } b.AddExistingSourceRepository(repo) case 1: // Add the Dockerfile to the existing SourceRepository, so that // eventually we generate a single BuildConfig with multiple // sources. if err := repos[0].AddDockerfile(dockerfile); err != nil { return fmt.Errorf("provided Dockerfile is not valid: %v", err) } default: // Invalid. return errors.New("--dockerfile cannot be used with multiple source repositories") } return nil }
// AddSourceRepositoriesToRefBuilder adds the provided repositories to the reference builder, identifies which // should be built using Docker, and then returns the full list of source repositories. func AddSourceRepositoriesToRefBuilder(b *app.ReferenceBuilder, repos []string, g *GenerationInputs) (app.SourceRepositories, error) { for _, s := range repos { if repo, ok := b.AddSourceRepository(s); ok { repo.SetContextDir(g.ContextDir) if g.Strategy == "docker" { repo.BuildWithDocker() } } } if len(g.Dockerfile) > 0 { if len(g.Strategy) != 0 && g.Strategy != "docker" { return nil, errors.New("when directly referencing a Dockerfile, the strategy must must be 'docker'") } if err := AddDockerfileToSourceRepositories(b, g.Dockerfile); err != nil { return nil, err } } _, result, errs := b.Result() return result, kutilerrors.NewAggregate(errs) }
// set up the components to be used by the reference builder func (c *AppConfig) addReferenceBuilderComponents(b *app.ReferenceBuilder) { b.AddComponents(c.DockerImages, func(input *app.ComponentInput) app.ComponentReference { input.Argument = fmt.Sprintf("--docker-image=%q", input.From) input.Searcher = c.dockerSearcher if c.dockerSearcher != nil { resolver := app.PerfectMatchWeightedResolver{} resolver = append(resolver, app.WeightedResolver{Searcher: c.dockerSearcher, Weight: 0.0}) if c.AllowMissingImages { resolver = append(resolver, app.WeightedResolver{Searcher: app.MissingImageSearcher{}, Weight: 100.0}) } input.Resolver = resolver } return input }) b.AddComponents(c.ImageStreams, func(input *app.ComponentInput) app.ComponentReference { input.Argument = fmt.Sprintf("--image-stream=%q", input.From) input.Searcher = c.imageStreamSearcher if c.imageStreamSearcher != nil { input.Resolver = app.FirstMatchResolver{Searcher: c.imageStreamSearcher} } return input }) b.AddComponents(c.Templates, func(input *app.ComponentInput) app.ComponentReference { input.Argument = fmt.Sprintf("--template=%q", input.From) input.Searcher = c.templateSearcher if c.templateSearcher != nil { input.Resolver = app.HighestScoreResolver{Searcher: c.templateSearcher} } return input }) b.AddComponents(c.TemplateFiles, func(input *app.ComponentInput) app.ComponentReference { input.Argument = fmt.Sprintf("--file=%q", input.From) input.Searcher = c.templateFileSearcher if c.templateFileSearcher != nil { input.Resolver = app.FirstMatchResolver{Searcher: c.templateFileSearcher} } return input }) b.AddComponents(c.Components, func(input *app.ComponentInput) app.ComponentReference { resolver := app.PerfectMatchWeightedResolver{} searcher := app.MultiWeightedSearcher{} if c.imageStreamSearcher != nil { resolver = append(resolver, app.WeightedResolver{Searcher: c.imageStreamSearcher, Weight: 0.0}) searcher = append(searcher, app.WeightedSearcher{Searcher: c.imageStreamSearcher, Weight: 0.0}) } if c.templateSearcher != nil { resolver = append(resolver, app.WeightedResolver{Searcher: c.templateSearcher, Weight: 0.0}) searcher = append(searcher, app.WeightedSearcher{Searcher: c.templateSearcher, Weight: 0.0}) } if c.templateFileSearcher != nil { resolver = append(resolver, app.WeightedResolver{Searcher: c.templateFileSearcher, Weight: 0.0}) } if c.dockerSearcher != nil { resolver = append(resolver, app.WeightedResolver{Searcher: c.dockerSearcher, Weight: 2.0}) searcher = append(searcher, app.WeightedSearcher{Searcher: c.dockerSearcher, Weight: 1.0}) } if c.AllowMissingImages { resolver = append(resolver, app.WeightedResolver{Searcher: app.MissingImageSearcher{}, Weight: 100.0}) } input.Resolver = resolver input.Searcher = searcher return input }) _, repos, _ := b.Result() for _, repo := range repos { repo.SetContextDir(c.ContextDir) } }