From 3bd89e9aa55843dd7588c7cb7e274bf2956bccf0 Mon Sep 17 00:00:00 2001 From: Boming Zhang Date: Tue, 1 Jul 2025 21:27:30 -0400 Subject: [PATCH] refactor(cmd/joj3): use getter/setter in env --- cmd/joj3/env/env.go | 75 +++++++++++++++++++++------------------ cmd/joj3/log.go | 85 +++++++++++++++++++-------------------------- cmd/joj3/main.go | 12 +++---- 3 files changed, 82 insertions(+), 90 deletions(-) diff --git a/cmd/joj3/env/env.go b/cmd/joj3/env/env.go index 9c7e700..91de8fb 100644 --- a/cmd/joj3/env/env.go +++ b/cmd/joj3/env/env.go @@ -1,9 +1,9 @@ -// Package env stores the environment variables from actions environment. package env import ( "fmt" "os" + "sync" "time" ) @@ -14,28 +14,21 @@ const ( CommitMsg = "JOJ3_COMMIT_MSG" ForceQuitStageName = "JOJ3_FORCE_QUIT_STAGE_NAME" OutputPath = "JOJ3_OUTPUT_PATH" + + GitHubActor = "GITHUB_ACTOR" + GitHubRepository = "GITHUB_REPOSITORY" + GitHubSha = "GITHUB_SHA" + GitHubRef = "GITHUB_REF" + GitHubWorkflow = "GITHUB_WORKFLOW" + GitHubRunNumber = "GITHUB_RUN_NUMBER" ) -type Attribute struct { - ConfName string - CommitMsg string - Groups string - RunID string - Actor string - Repository string - Sha string - Ref string - Workflow string - RunNumber string - ActorName string - ActorID string - ForceQuitStageName string - OutputPath string -} +var ( + runIDOnce sync.Once + runID string +) -var Attr Attribute - -func init() { +func generateRunID() string { timestamp := time.Now().UnixNano() pid := os.Getpid() high := timestamp >> 32 @@ -45,20 +38,34 @@ func init() { combined ^= timestamp >> 16 combined ^= (combined >> 8) combined ^= (combined << 16) - Attr.RunID = fmt.Sprintf("%08X", combined&0xFFFFFFFF) - Attr.Actor = os.Getenv("GITHUB_ACTOR") - Attr.Repository = os.Getenv("GITHUB_REPOSITORY") - Attr.Sha = os.Getenv("GITHUB_SHA") - Attr.Ref = os.Getenv("GITHUB_REF") - Attr.Workflow = os.Getenv("GITHUB_WORKFLOW") - Attr.RunNumber = os.Getenv("GITHUB_RUN_NUMBER") + return fmt.Sprintf("%08X", combined&0xFFFFFFFF) } -func Set() { - os.Setenv(ConfName, Attr.ConfName) - os.Setenv(Groups, Attr.Groups) - os.Setenv(RunID, Attr.RunID) - os.Setenv(CommitMsg, Attr.CommitMsg) - os.Setenv(ForceQuitStageName, Attr.ForceQuitStageName) - os.Setenv(OutputPath, Attr.OutputPath) +func GetRunID() string { + if val := os.Getenv(RunID); val != "" { + return val + } + runIDOnce.Do(func() { + runID = generateRunID() + }) + return runID } +func GetConfName() string { return os.Getenv(ConfName) } +func GetGroups() string { return os.Getenv(Groups) } +func GetCommitMsg() string { return os.Getenv(CommitMsg) } +func GetForceQuitStageName() string { return os.Getenv(ForceQuitStageName) } +func GetOutputPath() string { return os.Getenv(OutputPath) } + +func SetRunID(val string) { os.Setenv(RunID, val) } +func SetConfName(val string) { os.Setenv(ConfName, val) } +func SetGroups(val string) { os.Setenv(Groups, val) } +func SetCommitMsg(val string) { os.Setenv(CommitMsg, val) } +func SetForceQuitStageName(val string) { os.Setenv(ForceQuitStageName, val) } +func SetOutputPath(val string) { os.Setenv(OutputPath, val) } + +func GetActor() string { return os.Getenv(GitHubActor) } +func GetRepository() string { return os.Getenv(GitHubRepository) } +func GetSha() string { return os.Getenv(GitHubSha) } +func GetRef() string { return os.Getenv(GitHubRef) } +func GetWorkflow() string { return os.Getenv(GitHubWorkflow) } +func GetRunNumber() string { return os.Getenv(GitHubRunNumber) } diff --git a/cmd/joj3/log.go b/cmd/joj3/log.go index ad285fd..9601dee 100644 --- a/cmd/joj3/log.go +++ b/cmd/joj3/log.go @@ -55,59 +55,46 @@ func (h *multiHandler) WithGroup(name string) slog.Handler { return &multiHandler{handlers: handlers} } -func newSlogAttrs(csvPath string) (attrs []slog.Attr) { - env.Attr.ActorName = fmt.Sprintf("Name(%s)", env.Attr.Actor) - env.Attr.ActorID = fmt.Sprintf("ID(%s)", env.Attr.Actor) - attrs = []slog.Attr{ - slog.String("runID", env.Attr.RunID), - slog.String("confName", env.Attr.ConfName), - slog.String("actor", env.Attr.Actor), - slog.String("actorName", env.Attr.ActorName), - slog.String("actorID", env.Attr.ActorID), - slog.String("repository", env.Attr.Repository), - slog.String("sha", env.Attr.Sha), - slog.String("ref", env.Attr.Ref), - } - // if csvPath is empty, just return - if csvPath == "" { - return attrs - } - file, err := os.Open(csvPath) - if err != nil { - slog.Error("open csv", "error", err) - return attrs - } - defer file.Close() - reader := csv.NewReader(file) - for { - row, err := reader.Read() - if err == io.EOF { - break - } +func newSlogAttrs(csvPath string) []slog.Attr { + actor := env.GetActor() + actorName := fmt.Sprintf("Name(%s)", actor) + actorID := fmt.Sprintf("ID(%s)", actor) + + if csvPath != "" { + file, err := os.Open(csvPath) if err != nil { - slog.Error("read csv", "error", err) - return attrs - } - if len(row) < 3 { - continue - } - actor := row[2] - if actor == env.Attr.Actor { - env.Attr.ActorName = row[0] - env.Attr.ActorID = row[1] - return []slog.Attr{ - slog.String("runID", env.Attr.RunID), - slog.String("confName", env.Attr.ConfName), - slog.String("actor", env.Attr.Actor), - slog.String("actorName", env.Attr.ActorName), - slog.String("actorID", env.Attr.ActorID), - slog.String("repository", env.Attr.Repository), - slog.String("sha", env.Attr.Sha), - slog.String("ref", env.Attr.Ref), + slog.Error("open csv", "error", err) + } else { + defer file.Close() + reader := csv.NewReader(file) + for { + row, err := reader.Read() + if err == io.EOF { + break + } + if err != nil { + slog.Error("read csv", "error", err) + break + } + if len(row) >= 3 && row[2] == actor { + actorName = row[0] + actorID = row[1] + break + } } } } - return attrs + + return []slog.Attr{ + slog.String("runID", env.GetRunID()), + slog.String("confName", env.GetConfName()), + slog.String("actor", actor), + slog.String("actorName", actorName), + slog.String("actorID", actorID), + slog.String("repository", env.GetRepository()), + slog.String("sha", env.GetSha()), + slog.String("ref", env.GetRef()), + } } func setupSlog(conf *conf.Conf) error { diff --git a/cmd/joj3/main.go b/cmd/joj3/main.go index 026dc06..07d3c63 100644 --- a/cmd/joj3/main.go +++ b/cmd/joj3/main.go @@ -39,7 +39,7 @@ func getCommitMsg() (string, error) { slog.Error("get commit msg", "error", err) return "", err } - env.Attr.CommitMsg = commitMsg + env.SetCommitMsg(commitMsg) return commitMsg, nil } @@ -52,8 +52,8 @@ func getConf(commitMsg string) (*joj3Conf.Conf, *joj3Conf.ConventionalCommit, er if err != nil { return nil, nil, err } - env.Attr.ConfName = conf.Name - env.Attr.OutputPath = conf.Stage.OutputPath + env.SetConfName(conf.Name) + env.SetOutputPath(conf.Stage.OutputPath) if err := showConfStat(confPath, confStat); err != nil { return nil, nil, err } @@ -102,14 +102,12 @@ func validateConf(conf *joj3Conf.Conf) error { func run(conf *joj3Conf.Conf, conventionalCommit *joj3Conf.ConventionalCommit) error { groups := joj3Conf.MatchGroups(conf, conventionalCommit) - env.Attr.Groups = strings.Join(groups, ",") - env.Set() + env.SetGroups(strings.Join(groups, ",")) _, forceQuitStageName, err := runStages( conf, groups, func(stageResults []stage.StageResult, forceQuitStageName string) { - env.Attr.ForceQuitStageName = forceQuitStageName - env.Set() + env.SetForceQuitStageName(forceQuitStageName) }, ) if err != nil {