// run is responsible for preparing environment for actual build. // It accepts factoryFunc and an ordered array of SCMAuths. func run(builderFactory factoryFunc, scmAuths []scmauth.SCMAuth) { client, endpoint, err := dockerutil.NewHelper().GetClient() if err != nil { glog.Fatalf("Error obtaining docker client: %v", err) } buildStr := os.Getenv("BUILD") build := api.Build{} if err := latest.Codec.DecodeInto([]byte(buildStr), &build); err != nil { glog.Fatalf("Unable to parse build: %v", err) } var ( authcfg docker.AuthConfiguration authPresent bool ) output := true if len(build.Parameters.Output.DockerImageReference) == 0 { if build.Parameters.Output.To != nil { glog.Fatalf("Cannot determine an output image reference. Make sure a registry service is running.") } output = false } if output { authcfg, authPresent = dockercfg.NewHelper().GetDockerAuth( build.Parameters.Output.DockerImageReference, dockercfg.PullAuthType, ) } if build.Parameters.Source.SourceSecret != nil { if err := setupSourceSecret(build.Parameters.Source.SourceSecret.Name, scmAuths); err != nil { glog.Fatalf("Cannot setup secret file for accessing private repository: %v", err) } } b := builderFactory(client, endpoint, authcfg, authPresent, &build) if err = b.Build(); err != nil { glog.Fatalf("Build error: %v", err) } if !output { glog.Warning("Build does not have an Output defined, no output image was pushed to a registry.") } }
// Build executes a Docker build func (d *DockerBuilder) Build() error { buildDir, err := ioutil.TempDir("", "docker-build") if err != nil { return err } if err = d.fetchSource(buildDir); err != nil { return err } if err = d.addBuildParameters(buildDir); err != nil { return err } glog.V(4).Infof("Starting Docker build from %s/%s BuildConfig ...", d.build.Namespace, d.build.Name) if err = d.dockerBuild(buildDir); err != nil { return err } tag := d.build.Parameters.Output.DockerImageReference defer removeImage(d.dockerClient, tag) dockerImageRef := d.build.Parameters.Output.DockerImageReference if len(dockerImageRef) != 0 { // Get the Docker push authentication pushAuthConfig, authPresent := dockercfg.NewHelper().GetDockerAuth( dockerImageRef, dockercfg.PushAuthType, ) if authPresent { glog.V(3).Infof("Using Docker authentication provided") d.auth = pushAuthConfig } glog.Infof("Pushing %s image ...", dockerImageRef) if err := pushImage(d.dockerClient, tag, d.auth); err != nil { return fmt.Errorf("Failed to push image: %v", err) } glog.Infof("Successfully pushed %s", dockerImageRef) } return nil }
// Build executes the STI build func (s *STIBuilder) Build() error { tag := s.build.Parameters.Output.DockerImageReference config := &stiapi.Config{ BuilderImage: s.build.Parameters.Strategy.SourceStrategy.From.Name, DockerConfig: &stiapi.DockerConfig{Endpoint: s.dockerSocket}, Source: s.build.Parameters.Source.Git.URI, ContextDir: s.build.Parameters.Source.ContextDir, DockerCfgPath: os.Getenv(dockercfg.PullAuthType), Tag: tag, ScriptsURL: s.build.Parameters.Strategy.SourceStrategy.Scripts, Environment: getBuildEnvVars(s.build), Incremental: s.build.Parameters.Strategy.SourceStrategy.Incremental, } if s.build.Parameters.Revision != nil && s.build.Parameters.Revision.Git != nil && s.build.Parameters.Revision.Git.Commit != "" { config.Ref = s.build.Parameters.Revision.Git.Commit } else if s.build.Parameters.Source.Git.Ref != "" { config.Ref = s.build.Parameters.Source.Git.Ref } if errs := validation.ValidateConfig(config); len(errs) != 0 { var buffer bytes.Buffer for _, ve := range errs { buffer.WriteString(ve.Error()) buffer.WriteString(", ") } return errors.New(buffer.String()) } // If DockerCfgPath is provided in api.Config, then attempt to read the the // dockercfg file and get the authentication for pulling the builder image. if r, err := os.Open(config.DockerCfgPath); err == nil { config.PullAuthentication = stidocker.GetImageRegistryAuth(r, config.BuilderImage) glog.Infof("Using provided pull secret for pulling %s image", config.BuilderImage) } glog.V(2).Infof("Creating a new S2I builder with build config: %#v\n", describe.DescribeConfig(config)) builder, err := sti.GetStrategy(config) if err != nil { return err } defer removeImage(s.dockerClient, tag) glog.V(4).Infof("Starting S2I build from %s/%s BuildConfig ...", s.build.Namespace, s.build.Name) if _, err = builder.Build(config); err != nil { return err } dockerImageRef := s.build.Parameters.Output.DockerImageReference if len(dockerImageRef) != 0 { // Get the Docker push authentication pushAuthConfig, authPresent := dockercfg.NewHelper().GetDockerAuth( dockerImageRef, dockercfg.PushAuthType, ) if authPresent { glog.Infof("Using provided push secret for pushing %s image", dockerImageRef) s.auth = pushAuthConfig } glog.Infof("Pushing %s image ...", dockerImageRef) if err := pushImage(s.dockerClient, tag, s.auth); err != nil { return fmt.Errorf("Failed to push image: %v", err) } glog.Infof("Successfully pushed %s", dockerImageRef) glog.Flush() } return nil }