Kaynağa Gözat

[POR-1959] Report logs for buildpack builds (#3822)

Feroze Mohideen 2 yıl önce
ebeveyn
işleme
a6f0132524
3 değiştirilmiş dosya ile 29 ekleme ve 7 silme
  1. 13 2
      cli/cmd/pack/logger.go
  2. 11 1
      cli/cmd/pack/pack.go
  3. 5 4
      cli/cmd/v2/build.go

+ 13 - 2
cli/cmd/pack/logger.go

@@ -17,10 +17,21 @@ type packLogger struct {
 	safeWriter *safeWriter
 }
 
+type logOpts struct {
+	// LogFile is the file to write logs to in addition to stderr
+	LogFile *os.File
+}
+
 // Replicate the exact behavior of https://github.com/buildpacks/pack/blob/main/pkg/logging/logger_simple.go
-func newPackLogger() logging.Logger {
+func newPackLogger(opts logOpts) logging.Logger {
 	discard := log.New(ioutil.Discard, "", log.LstdFlags|log.Lmicroseconds)
-	stderr := log.New(os.Stderr, "", log.LstdFlags|log.Lmicroseconds)
+
+	var writer io.Writer = os.Stderr
+	if opts.LogFile != nil {
+		writer = io.MultiWriter(os.Stderr, opts.LogFile)
+	}
+
+	stderr := log.New(writer, "", log.LstdFlags|log.Lmicroseconds)
 
 	return &packLogger{
 		outDiscard: discard,

+ 11 - 1
cli/cmd/pack/pack.go

@@ -23,7 +23,7 @@ var sharedPackClient *packclient.Client
 func init() {
 	var err error
 	// initialize a pack client
-	logger := newPackLogger()
+	logger := newPackLogger(logOpts{})
 
 	sharedPackClient, err = packclient.NewClient(packclient.WithLogger(logger))
 
@@ -88,6 +88,16 @@ func (a *Agent) Build(ctx context.Context, opts *docker.BuildOpts, buildConfig *
 		buildOpts.Buildpacks = append(buildOpts.Buildpacks, "heroku/procfile@2.0.1")
 	}
 
+	if opts.LogFile != nil {
+		loggerWithLogFile := newPackLogger(logOpts{LogFile: opts.LogFile})
+
+		packClientWithLogFile, err := packclient.NewClient(packclient.WithLogger(loggerWithLogFile))
+		if err != nil {
+			return err
+		}
+		return packClientWithLogFile.Build(ctx, buildOpts)
+	}
+
 	return sharedPackClient.Build(ctx, buildOpts)
 }
 

+ 5 - 4
cli/cmd/v2/build.go

@@ -81,6 +81,10 @@ func build(ctx context.Context, client api.Client, inp buildInput) buildOutput {
 		return output
 	}
 
+	// create a temp file which build logs will be written to
+	// temp file gets cleaned up when os exits (i.e. when the GHA completes), so no need to remove it manually
+	logFile, _ := os.CreateTemp("", buildLogFilename)
+
 	switch inp.BuildMethod {
 	case buildMethodDocker:
 		basePath, err := filepath.Abs(".")
@@ -99,10 +103,6 @@ func build(ctx context.Context, client api.Client, inp buildInput) buildOutput {
 			return output
 		}
 
-		// create a temp file which build logs will be written to
-		// temp file gets cleaned up when os exits (i.e. when the GHA completes), so no need to remove it manually
-		logFile, _ := os.CreateTemp("", buildLogFilename)
-
 		opts := &docker.BuildOpts{
 			ImageRepo:         inp.RepositoryURL,
 			Tag:               tag,
@@ -140,6 +140,7 @@ func build(ctx context.Context, client api.Client, inp buildInput) buildOutput {
 			Tag:          tag,
 			BuildContext: inp.BuildContext,
 			Env:          inp.Env,
+			LogFile:      logFile,
 		}
 
 		buildConfig := &types.BuildConfig{