From 28d7c98180d17bf99d4ffbcf466ac0b296bade7c Mon Sep 17 00:00:00 2001 From: Mehul Kar Date: Mon, 8 May 2023 16:51:00 -0700 Subject: [PATCH] Add originationUser into Run metadata --- cli/internal/ci/vendors.go | 27 ++++++++++++++++---------- cli/internal/runsummary/format_json.go | 1 + cli/internal/runsummary/run_summary.go | 23 +++++++++++++++++++++- cli/internal/runsummary/scm_summary.go | 7 +++---- cli/internal/runsummary/spaces.go | 5 ++--- cli/internal/scm/scm.go | 14 +++++++++++++ 6 files changed, 59 insertions(+), 18 deletions(-) diff --git a/cli/internal/ci/vendors.go b/cli/internal/ci/vendors.go index f619140bc8ef4..66fdc2cf22946 100644 --- a/cli/internal/ci/vendors.go +++ b/cli/internal/ci/vendors.go @@ -21,6 +21,9 @@ type Vendor struct { // The name of the environment variable that contains the current checked out branch BranchEnvVar string + + // The name of the environment variable that contains the user using turbo + UsernameEnvVar string } // Vendors is a list of common CI/CD vendors (from https://github.com/watson/ci-info/blob/master/vendors.json) @@ -112,12 +115,14 @@ var Vendors = []Vendor{ Constant: "EAS", Env: vendorEnvs{Any: []string{"EAS_BUILD"}}, }, + // https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables { - Name: "GitHub Actions", - Constant: "GITHUB_ACTIONS", - Env: vendorEnvs{Any: []string{"GITHUB_ACTIONS"}}, - ShaEnvVar: "GITHUB_SHA", - BranchEnvVar: "GITHUB_REF_NAME", + Name: "GitHub Actions", + Constant: "GITHUB_ACTIONS", + Env: vendorEnvs{Any: []string{"GITHUB_ACTIONS"}}, + ShaEnvVar: "GITHUB_SHA", + BranchEnvVar: "GITHUB_REF_NAME", + UsernameEnvVar: "GITHUB_ACTOR", }, { Name: "GitLab CI", @@ -231,12 +236,14 @@ var Vendors = []Vendor{ Constant: "TRAVIS", Env: vendorEnvs{Any: []string{"TRAVIS"}}, }, + // https://vercel.com/docs/concepts/projects/environment-variables/system-environment-variables { - Name: "Vercel", - Constant: "VERCEL", - Env: vendorEnvs{Any: []string{"NOW_BUILDER", "VERCEL"}}, - ShaEnvVar: "VERCEL_GIT_COMMIT_SHA", - BranchEnvVar: "VERCEL_GIT_COMMIT_REF", + Name: "Vercel", + Constant: "VERCEL", + Env: vendorEnvs{Any: []string{"NOW_BUILDER", "VERCEL"}}, + ShaEnvVar: "VERCEL_GIT_COMMIT_SHA", + BranchEnvVar: "VERCEL_GIT_COMMIT_REF", + UsernameEnvVar: "VERCEL_GIT_COMMIT_AUTHOR_LOGIN", }, { Name: "Visual Studio App Center", diff --git a/cli/internal/runsummary/format_json.go b/cli/internal/runsummary/format_json.go index e7530949c6aa7..adaab9c9cffe7 100644 --- a/cli/internal/runsummary/format_json.go +++ b/cli/internal/runsummary/format_json.go @@ -74,4 +74,5 @@ type nonMonorepoRunSummary struct { ExecutionSummary *executionSummary `json:"execution,omitempty"` Tasks []*TaskSummary `json:"tasks"` SCM *scmState `json:"scm"` + User string `json:"originationUser"` } diff --git a/cli/internal/runsummary/run_summary.go b/cli/internal/runsummary/run_summary.go index ab870823e2066..e4b44f90a95c9 100644 --- a/cli/internal/runsummary/run_summary.go +++ b/cli/internal/runsummary/run_summary.go @@ -11,7 +11,10 @@ import ( "github.com/mitchellh/cli" "github.com/segmentio/ksuid" + "github.com/vercel/turbo/cli/internal/ci" "github.com/vercel/turbo/cli/internal/client" + "github.com/vercel/turbo/cli/internal/env" + "github.com/vercel/turbo/cli/internal/scm" "github.com/vercel/turbo/cli/internal/spinner" "github.com/vercel/turbo/cli/internal/turbopath" "github.com/vercel/turbo/cli/internal/util" @@ -69,6 +72,7 @@ type RunSummary struct { ExecutionSummary *executionSummary `json:"execution,omitempty"` Tasks []*TaskSummary `json:"tasks"` SCM *scmState `json:"scm"` + User string `json:"originationUser"` } // NewRunSummary returns a RunSummary instance @@ -100,6 +104,7 @@ func NewRunSummary( executionSummary := newExecutionSummary(synthesizedCommand, repoPath, startAt, profile) + envVars := env.GetEnvMap() return Meta{ RunSummary: &RunSummary{ ID: ksuid.New(), @@ -111,7 +116,8 @@ func NewRunSummary( FrameworkInference: runOpts.FrameworkInference, Tasks: []*TaskSummary{}, GlobalHashSummary: globalHashSummary, - SCM: getSCMState(repoRoot), + SCM: getSCMState(envVars, repoRoot), + User: getUser(envVars, repoRoot), }, ui: ui, runType: runType, @@ -329,3 +335,18 @@ func (rsm *Meta) postTaskSummaries(runID string) []error { return nil } + +func getUser(envVars env.EnvironmentVariableMap, dir turbopath.AbsoluteSystemPath) string { + var username string + + if ci.IsCi() { + vendor := ci.Info() + username = envVars[vendor.UsernameEnvVar] + } + + if username == "" { + username = scm.GetCurrentUser(dir) + } + + return username +} diff --git a/cli/internal/runsummary/scm_summary.go b/cli/internal/runsummary/scm_summary.go index 217e05a365ae0..e38b23d79a7f2 100644 --- a/cli/internal/runsummary/scm_summary.go +++ b/cli/internal/runsummary/scm_summary.go @@ -16,16 +16,15 @@ type scmState struct { // getSCMState returns the sha and branch when in a git repo // Otherwise it should return empty strings right now. // We my add handling of other scms and non-git tracking in the future. -func getSCMState(dir turbopath.AbsoluteSystemPath) *scmState { - allEnvVars := env.GetEnvMap() +func getSCMState(envVars env.EnvironmentVariableMap, dir turbopath.AbsoluteSystemPath) *scmState { state := &scmState{Type: "git"} // If we're in CI, try to get the values we need from environment variables if ci.IsCi() { vendor := ci.Info() - state.Sha = allEnvVars[vendor.ShaEnvVar] - state.Branch = allEnvVars[vendor.BranchEnvVar] + state.Sha = envVars[vendor.ShaEnvVar] + state.Branch = envVars[vendor.BranchEnvVar] } // Otherwise fallback to using `git` diff --git a/cli/internal/runsummary/spaces.go b/cli/internal/runsummary/spaces.go index 88298a2a3efc6..fedb4a39e22ed 100644 --- a/cli/internal/runsummary/spaces.go +++ b/cli/internal/runsummary/spaces.go @@ -28,9 +28,7 @@ type spacesRunPayload struct { Client spacesClientSummary `json:"client"` // Details about the turbo client GitBranch string `json:"gitBranch"` GitSha string `json:"gitSha"` - - // TODO: we need to add these in - // originationUser string + User string `json:"originationUser"` } // spacesCacheStatus is the same as TaskCacheSummary so we can convert @@ -74,6 +72,7 @@ func (rsm *Meta) newSpacesRunCreatePayload() *spacesRunPayload { Context: context, GitBranch: rsm.RunSummary.SCM.Branch, GitSha: rsm.RunSummary.SCM.Sha, + User: rsm.RunSummary.User, Client: spacesClientSummary{ ID: "turbo", Name: "Turbo", diff --git a/cli/internal/scm/scm.go b/cli/internal/scm/scm.go index 825401b79faf3..5a5156aaac6cf 100644 --- a/cli/internal/scm/scm.go +++ b/cli/internal/scm/scm.go @@ -78,3 +78,17 @@ func GetCurrentSha(dir turbopath.AbsoluteSystemPath) string { } return strings.TrimRight(string(out), "\n") } + +// GetCurrentUser returns the local user.name +// We do not specify a --local or --global flag so it should +// resolve the value the same way git does when creating a commit. +func GetCurrentUser(dir turbopath.AbsoluteSystemPath) string { + cmd := exec.Command("git", []string{"config", "user.name"}...) + cmd.Dir = dir.ToString() + + out, err := cmd.Output() + if err != nil { + return "" + } + return strings.TrimRight(string(out), "\n") +}