From e8d0fe4b5705ba0c0cdc54782709739108f4abef Mon Sep 17 00:00:00 2001 From: Christian Weichel Date: Tue, 7 May 2024 18:25:12 +0000 Subject: [PATCH] Add GitHub action build reporter --- cmd/build.go | 6 ++++++ pkg/leeway/reporter.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/cmd/build.go b/cmd/build.go index 34ca5c3..846293f 100644 --- a/cmd/build.go +++ b/cmd/build.go @@ -174,6 +174,7 @@ func addBuildFlags(cmd *cobra.Command) { cmd.Flags().StringToString("docker-build-options", nil, "Options passed to all 'docker build' commands") cmd.Flags().String("report", "", "Generate a HTML report after the build has finished. (e.g. --report myreport.html)") cmd.Flags().String("report-segment", os.Getenv("LEEWAY_SEGMENT_KEY"), "Report build events to segment using the segment key (defaults to $LEEWAY_SEGMENT_KEY)") + cmd.Flags().Bool("report-github", os.Getenv("GITHUB_OUTPUT") != "", "Report package build success/failure to GitHub Actions using the GITHUB_OUTPUT environment variable") } func getBuildOpts(cmd *cobra.Command) ([]leeway.BuildOption, *leeway.FilesystemCache) { @@ -255,6 +256,11 @@ func getBuildOpts(cmd *cobra.Command) ([]leeway.BuildOption, *leeway.FilesystemC } else if segmentkey != "" { reporter = append(reporter, leeway.NewSegmentReporter(segmentkey)) } + if github, err := cmd.Flags().GetBool("report-github"); err != nil { + log.Fatal(err) + } else if github { + reporter = append(reporter, leeway.NewGitHubReporter()) + } dontTest, err := cmd.Flags().GetBool("dont-test") if err != nil { diff --git a/pkg/leeway/reporter.go b/pkg/leeway/reporter.go index 3c13b4f..af54bf3 100644 --- a/pkg/leeway/reporter.go +++ b/pkg/leeway/reporter.go @@ -621,3 +621,35 @@ func (sr *SegmentReporter) track(event string, props segment.Properties) { log.WithField("evt", string(fc)).Debug("reported segment event") } } + +func NewGitHubReporter() *GitHubActionReporter { + return &GitHubActionReporter{} +} + +type GitHubActionReporter struct { + NoopReporter + + mu sync.Mutex +} + +func (sr *GitHubActionReporter) PackageBuildFinished(pkg *Package, rep *PackageBuildReport) { + sr.mu.Lock() + defer sr.mu.Unlock() + + fn, ok := os.LookupEnv("GITHUB_OUTPUT") + if !ok || fn == "" { + return + } + f, err := os.OpenFile(fn, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + log.WithField("fn", fn).WithError(err).Warn("cannot open GITHUB_OUTPUT file") + return + } + defer f.Close() + + var success bool + if rep.Error == nil { + success = true + } + fmt.Fprintf(f, "%s=%v\n", pkg.FilesystemSafeName(), success) +}