Selaa lähdekoodia

Merge pull request #1851 from porter-dev/belanger/fix-pack-closing-stderr

Add fix for closing of `/dev/stderr` when `pack` is run multiple times
abelanger5 4 vuotta sitten
vanhempi
sitoutus
874842bbbc
3 muutettua tiedostoa jossa 78 lisäystä ja 16 poistoa
  1. 36 0
      cli/cmd/create.go
  2. 32 11
      cli/cmd/pack/logger.go
  3. 10 5
      cli/cmd/pack/pack.go

+ 36 - 0
cli/cmd/create.go

@@ -1,6 +1,7 @@
 package cmd
 
 import (
+	"context"
 	"fmt"
 	"io/ioutil"
 	"os"
@@ -165,6 +166,13 @@ func init() {
 		false,
 		"set this to force build an image",
 	)
+
+	createCmd.PersistentFlags().BoolVar(
+		&useCache,
+		"use-cache",
+		false,
+		"Whether to use cache (currently in beta)",
+	)
 }
 
 var supportedKinds = map[string]string{"web": "", "job": "", "worker": ""}
@@ -231,6 +239,7 @@ func createFull(_ *types.GetAuthenticatedUserResponse, client *api.Client, args
 				LocalDockerfile: dockerfile,
 				Method:          buildMethod,
 				AdditionalEnv:   additionalEnv,
+				UseCache:        useCache,
 			},
 			Kind:        args[0],
 			ReleaseName: name,
@@ -239,6 +248,33 @@ func createFull(_ *types.GetAuthenticatedUserResponse, client *api.Client, args
 	}
 
 	if source == "local" {
+		if useCache {
+			regID, imageURL, err := createAgent.GetImageRepoURL(name, namespace)
+
+			if err != nil {
+				return err
+			}
+
+			err = client.CreateRepository(
+				context.Background(),
+				config.Project,
+				regID,
+				&types.CreateRegistryRepositoryRequest{
+					ImageRepoURI: imageURL,
+				},
+			)
+
+			if err != nil {
+				return err
+			}
+
+			err = setDockerConfig(createAgent.Client)
+
+			if err != nil {
+				return err
+			}
+		}
+
 		subdomain, err := createAgent.CreateFromDocker(valuesObj, "default", nil, forceBuild)
 
 		return handleSubdomainCreate(subdomain, err)

+ 32 - 11
cli/cmd/pack/logger.go

@@ -3,6 +3,7 @@ package pack
 import (
 	"fmt"
 	"io"
+	"io/ioutil"
 	"log"
 	"os"
 	"strings"
@@ -11,13 +12,20 @@ import (
 )
 
 type packLogger struct {
-	out *log.Logger
+	outDiscard *log.Logger
+	outStderr  *log.Logger
+	safeWriter *safeWriter
 }
 
 // Replicate the exact behavior of https://github.com/buildpacks/pack/blob/main/pkg/logging/logger_simple.go
 func newPackLogger() logging.Logger {
+	discard := log.New(ioutil.Discard, "", log.LstdFlags|log.Lmicroseconds)
+	stderr := log.New(os.Stderr, "", log.LstdFlags|log.Lmicroseconds)
+
 	return &packLogger{
-		out: log.New(os.Stderr, "", log.LstdFlags|log.Lmicroseconds),
+		outDiscard: discard,
+		outStderr:  stderr,
+		safeWriter: &safeWriter{discard, stderr},
 	}
 }
 
@@ -30,7 +38,7 @@ const (
 )
 
 func (l *packLogger) Debug(msg string) {
-	l.out.Printf(prefixFmt, debugPrefix, msg)
+	l.outStderr.Printf(prefixFmt, debugPrefix, msg)
 }
 
 func (l *packLogger) Debugf(format string, v ...interface{}) {
@@ -46,35 +54,48 @@ func (l *packLogger) Debugf(format string, v ...interface{}) {
 		return
 	}
 
-	l.out.Printf(prefixFmt, debugPrefix, fmt.Sprintf(format, v...))
+	l.outStderr.Printf(prefixFmt, debugPrefix, fmt.Sprintf(format, v...))
 }
 
 func (l *packLogger) Info(msg string) {
-	l.out.Printf(prefixFmt, infoPrefix, msg)
+	l.outStderr.Printf(prefixFmt, infoPrefix, msg)
 }
 
 func (l *packLogger) Infof(format string, v ...interface{}) {
-	l.out.Printf(prefixFmt, infoPrefix, fmt.Sprintf(format, v...))
+	l.outStderr.Printf(prefixFmt, infoPrefix, fmt.Sprintf(format, v...))
 }
 
 func (l *packLogger) Warn(msg string) {
-	l.out.Printf(prefixFmt, warnPrefix, msg)
+	l.outStderr.Printf(prefixFmt, warnPrefix, msg)
 }
 
 func (l *packLogger) Warnf(format string, v ...interface{}) {
-	l.out.Printf(prefixFmt, warnPrefix, fmt.Sprintf(format, v...))
+	l.outStderr.Printf(prefixFmt, warnPrefix, fmt.Sprintf(format, v...))
 }
 
 func (l *packLogger) Error(msg string) {
-	l.out.Printf(prefixFmt, errorPrefix, msg)
+	l.outStderr.Printf(prefixFmt, errorPrefix, msg)
 }
 
 func (l *packLogger) Errorf(format string, v ...interface{}) {
-	l.out.Printf(prefixFmt, errorPrefix, fmt.Sprintf(format, v...))
+	l.outStderr.Printf(prefixFmt, errorPrefix, fmt.Sprintf(format, v...))
+}
+
+type safeWriter struct {
+	outDiscard *log.Logger
+	outStderr  *log.Logger
+}
+
+func (s *safeWriter) Write(p []byte) (n int, err error) {
+	if strings.Contains(string(p), "Unable to delete previous cache image") {
+		return s.outDiscard.Writer().Write(p)
+	}
+
+	return s.outStderr.Writer().Write(p)
 }
 
 func (l *packLogger) Writer() io.Writer {
-	return l.out.Writer()
+	return l.safeWriter
 }
 
 func (l *packLogger) IsVerbose() bool {

+ 10 - 5
cli/cmd/pack/pack.go

@@ -17,18 +17,23 @@ import (
 	"k8s.io/client-go/util/homedir"
 )
 
-type Agent struct{}
+var sharedPackClient *packclient.Client
 
-func (a *Agent) Build(opts *docker.BuildOpts, buildConfig *types.BuildConfig, cacheImage string) error {
+func init() {
+	var err error
 	//initialize a pack client
 	logger := newPackLogger()
 
-	client, err := packclient.NewClient(packclient.WithLogger(logger))
+	sharedPackClient, err = packclient.NewClient(packclient.WithLogger(logger))
 
 	if err != nil {
-		return err
+		panic(err)
 	}
+}
 
+type Agent struct{}
+
+func (a *Agent) Build(opts *docker.BuildOpts, buildConfig *types.BuildConfig, cacheImage string) error {
 	absPath, err := filepath.Abs(opts.BuildContext)
 
 	if err != nil {
@@ -138,5 +143,5 @@ func (a *Agent) Build(opts *docker.BuildOpts, buildConfig *types.BuildConfig, ca
 		buildOpts.Buildpacks = append(buildOpts.Buildpacks, "heroku/procfile@1.0.0")
 	}
 
-	return client.Build(context.Background(), buildOpts)
+	return sharedPackClient.Build(context.Background(), buildOpts)
 }