Skip to content

Commit

Permalink
🚧 Add diagnostic logging when constructing metadata
Browse files Browse the repository at this point in the history
This approach feels very "brute force." I'd like to look for a way to
not have to pass the logger in so many places. 🤔
  • Loading branch information
jasonrudolph committed Feb 10, 2021
1 parent c33868f commit 5f83f0d
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 27 deletions.
2 changes: 1 addition & 1 deletion cmd/submit.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ func (s *Submit) Init(args []string, envs map[string]string) error {
// Run packages up the test results and sends them to BuildPulse. It returns the
// key that uniquely identifies the uploaded object.
func (s *Submit) Run() (string, error) {
meta, err := metadata.NewMetadata(s.version, s.envs, s.commitResolver, time.Now)
meta, err := metadata.NewMetadata(s.version, s.envs, s.commitResolver, time.Now, s.diagnostics)
if err != nil {
return "", err
}
Expand Down
42 changes: 23 additions & 19 deletions metadata/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package metadata

import (
"fmt"
"os"
"regexp"
"strconv"
"strings"
Expand All @@ -18,11 +17,16 @@ import (
type Metadata interface {
MarshalYAML() (out []byte, err error)

initEnvData(envs map[string]string, resolver CommitResolver) error
initEnvData(envs map[string]string, resolver CommitResolver, log Logger) error
initTimestamp(now func() time.Time)
initVersionData(version *Version)
}

// Logger -- TODO Add docs
type Logger interface {
Printf(format string, v ...interface{})
}

// AbstractMetadata provides the fields that are common across all Metadata
// instances, regardless of the specific CI provider.
type AbstractMetadata struct {
Expand All @@ -45,10 +49,10 @@ type AbstractMetadata struct {
TreeSHA string `yaml:":tree,omitempty"`
}

func (a *AbstractMetadata) initCommitData(cr CommitResolver, sha string) error {
func (a *AbstractMetadata) initCommitData(cr CommitResolver, sha string, log Logger) error {
// Git metadata functionality is experimental. While it's experimental, detect a nil CommitResolver and allow the commit metadata fields to be uploaded with empty values.
if cr == nil {
fmt.Fprintf(os.Stderr, "[experimental] no commit resolver available; falling back to commit data from environment\n")
log.Printf("[experimental] no commit resolver available; falling back to commit data from environment\n")

a.CommitSHA = sha
return nil
Expand All @@ -57,7 +61,7 @@ func (a *AbstractMetadata) initCommitData(cr CommitResolver, sha string) error {
// Git metadata functionality is experimental. While it's experimental, don't let this error prevent the test-reporter from continuing normal operation. Allow the commit metadata fields to be uploaded with empty values.
c, err := cr.Lookup(sha)
if err != nil {
fmt.Fprintf(os.Stderr, "[experimental] git-based commit lookup unsuccessful; falling back to commit data from environment: %v\n", err)
log.Printf("[experimental] git-based commit lookup unsuccessful; falling back to commit data from environment: %v\n", err)

a.CommitSHA = sha
return nil
Expand Down Expand Up @@ -86,7 +90,7 @@ func (a *AbstractMetadata) initVersionData(version *Version) {
}

// NewMetadata creates a new Metadata instance from the given args.
func NewMetadata(version *Version, envs map[string]string, resolver CommitResolver, now func() time.Time) (Metadata, error) {
func NewMetadata(version *Version, envs map[string]string, resolver CommitResolver, now func() time.Time, log Logger) (Metadata, error) {
var m Metadata

switch {
Expand All @@ -106,7 +110,7 @@ func NewMetadata(version *Version, envs map[string]string, resolver CommitResolv
return nil, fmt.Errorf("unrecognized environment: system does not appear to be a supported CI provider (Buildkite, CircleCI, GitHub Actions, Jenkins, Semaphore, or Travis CI)")
}

if err := m.initEnvData(envs, resolver); err != nil {
if err := m.initEnvData(envs, resolver, log); err != nil {
return nil, err
}
m.initTimestamp(now)
Expand Down Expand Up @@ -142,12 +146,12 @@ type buildkiteMetadata struct {
BuildkiteTag string `env:"BUILDKITE_TAG" yaml:":buildkite_tag,omitempty"`
}

func (b *buildkiteMetadata) initEnvData(envs map[string]string, resolver CommitResolver) error {
func (b *buildkiteMetadata) initEnvData(envs map[string]string, resolver CommitResolver, log Logger) error {
if err := env.Parse(b, env.Options{Environment: envs}); err != nil {
return err
}

if err := b.initCommitData(resolver, b.BuildkiteCommit); err != nil {
if err := b.initCommitData(resolver, b.BuildkiteCommit, log); err != nil {
return err
}

Expand Down Expand Up @@ -199,12 +203,12 @@ type circleMetadata struct {
CircleWorkflowID string `env:"CIRCLE_WORKFLOW_ID" yaml:":circle_workflow_id"`
}

func (c *circleMetadata) initEnvData(envs map[string]string, resolver CommitResolver) error {
func (c *circleMetadata) initEnvData(envs map[string]string, resolver CommitResolver, log Logger) error {
if err := env.Parse(c, env.Options{Environment: envs}); err != nil {
return err
}

if err := c.initCommitData(resolver, c.CircleSHA1); err != nil {
if err := c.initCommitData(resolver, c.CircleSHA1, log); err != nil {
return err
}

Expand Down Expand Up @@ -243,12 +247,12 @@ type githubMetadata struct {
GithubWorkflow string `env:"GITHUB_WORKFLOW" yaml:":github_workflow"`
}

func (g *githubMetadata) initEnvData(envs map[string]string, resolver CommitResolver) error {
func (g *githubMetadata) initEnvData(envs map[string]string, resolver CommitResolver, log Logger) error {
if err := env.Parse(g, env.Options{Environment: envs}); err != nil {
return err
}

if err := g.initCommitData(resolver, g.GithubSHA); err != nil {
if err := g.initCommitData(resolver, g.GithubSHA, log); err != nil {
return err
}

Expand Down Expand Up @@ -302,12 +306,12 @@ type jenkinsMetadata struct {
JenkinsWorkspace string `env:"WORKSPACE" yaml:":jenkins_workspace"`
}

func (j *jenkinsMetadata) initEnvData(envs map[string]string, resolver CommitResolver) error {
func (j *jenkinsMetadata) initEnvData(envs map[string]string, resolver CommitResolver, log Logger) error {
if err := env.Parse(j, env.Options{Environment: envs}); err != nil {
return err
}

if err := j.initCommitData(resolver, j.GitCommit); err != nil {
if err := j.initCommitData(resolver, j.GitCommit, log); err != nil {
return err
}

Expand Down Expand Up @@ -363,12 +367,12 @@ type semaphoreMetadata struct {
SemaphoreWorkflowNumber uint `env:"SEMAPHORE_WORKFLOW_NUMBER" yaml:":semaphore_workflow_number"`
}

func (s *semaphoreMetadata) initEnvData(envs map[string]string, resolver CommitResolver) error {
func (s *semaphoreMetadata) initEnvData(envs map[string]string, resolver CommitResolver, log Logger) error {
if err := env.Parse(s, env.Options{Environment: envs}); err != nil {
return err
}

if err := s.initCommitData(resolver, s.SemaphoreGitSHA); err != nil {
if err := s.initCommitData(resolver, s.SemaphoreGitSHA, log); err != nil {
return err
}

Expand Down Expand Up @@ -419,12 +423,12 @@ type travisMetadata struct {
TravisTestResult uint `env:"TRAVIS_TEST_RESULT" yaml:":travis_test_result"`
}

func (t *travisMetadata) initEnvData(envs map[string]string, resolver CommitResolver) error {
func (t *travisMetadata) initEnvData(envs map[string]string, resolver CommitResolver, log Logger) error {
if err := env.Parse(t, env.Options{Environment: envs}); err != nil {
return err
}

if err := t.initCommitData(resolver, t.TravisCommit); err != nil {
if err := t.initCommitData(resolver, t.TravisCommit, log); err != nil {
return err
}

Expand Down
19 changes: 12 additions & 7 deletions metadata/metadata_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ func TestNewMetadata(t *testing.T) {
})

version := &Version{Number: "v1.2.3", GoOS: "linux"}
meta, err := NewMetadata(version, tt.envs, commitResolverDouble, now)
meta, err := NewMetadata(version, tt.envs, commitResolverDouble, now, &stubLogger{})
assert.NoError(t, err)

yaml, err := meta.MarshalYAML()
Expand All @@ -187,7 +187,7 @@ func TestNewMetadata(t *testing.T) {
}

func TestNewMetadata_unsupportedProvider(t *testing.T) {
_, err := NewMetadata(&Version{}, map[string]string{}, newCommitResolverStub(), time.Now)
_, err := NewMetadata(&Version{}, map[string]string{}, newCommitResolverStub(), time.Now, &stubLogger{})
if assert.Error(t, err) {
assert.Contains(t, err.Error(), "unrecognized environment")
}
Expand Down Expand Up @@ -260,7 +260,7 @@ func TestNewMetadata_customCheckName(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
meta, err := NewMetadata(&Version{}, tt.envs, newCommitResolverStub(), time.Now)
meta, err := NewMetadata(&Version{}, tt.envs, newCommitResolverStub(), time.Now, &stubLogger{})
assert.NoError(t, err)

yaml, err := meta.MarshalYAML()
Expand Down Expand Up @@ -315,7 +315,7 @@ func Test_buildkiteMetadata_initEnvData_extraFields(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
meta := buildkiteMetadata{}
err := meta.initEnvData(tt.envs, newCommitResolverStub())
err := meta.initEnvData(tt.envs, newCommitResolverStub(), &stubLogger{})
assert.NoError(t, err)

yaml, err := meta.MarshalYAML()
Expand Down Expand Up @@ -359,7 +359,7 @@ func Test_circleMetadata_initEnvData_extraFields(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
meta := circleMetadata{}
err := meta.initEnvData(tt.envs, newCommitResolverStub())
err := meta.initEnvData(tt.envs, newCommitResolverStub(), &stubLogger{})
assert.NoError(t, err)

yaml, err := meta.MarshalYAML()
Expand Down Expand Up @@ -400,7 +400,7 @@ func Test_githubMetadata_initEnvData_refTypes(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
meta := githubMetadata{}
err := meta.initEnvData(tt.envs, newCommitResolverStub())
err := meta.initEnvData(tt.envs, newCommitResolverStub(), &stubLogger{})
assert.NoError(t, err)

yaml, err := meta.MarshalYAML()
Expand Down Expand Up @@ -449,7 +449,7 @@ func Test_travisMetadata_initEnvData_extraFields(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
meta := travisMetadata{}
err := meta.initEnvData(tt.envs, newCommitResolverStub())
err := meta.initEnvData(tt.envs, newCommitResolverStub(), &stubLogger{})
assert.NoError(t, err)

yaml, err := meta.MarshalYAML()
Expand Down Expand Up @@ -492,3 +492,8 @@ func newCommitResolverStub() CommitResolver {
return &Commit{}, nil
})
}

// TODO: Look for better way to create a no-op logger for testing
type stubLogger struct{}

func (s *stubLogger) Printf(format string, v ...interface{}) {}

0 comments on commit 5f83f0d

Please sign in to comment.