feat(cmd/joj3): support actor csv
All checks were successful
submodules sync / sync (push) Successful in 47s
build / build (push) Successful in 1m41s
build / trigger-build-image (push) Successful in 9s

This commit is contained in:
张泊明518370910136 2024-11-18 00:18:01 -05:00
parent a1f391d9de
commit e4e7445645
GPG Key ID: D47306D7062CDA9D
4 changed files with 53 additions and 6 deletions

View File

@ -38,6 +38,7 @@ type ConfStage struct {
type Conf struct { type Conf struct {
Name string `default:"unknown"` Name string `default:"unknown"`
LogPath string `default:""` LogPath string `default:""`
ActorCsvPath string `default:""`
ExpireUnixTimestamp int64 `default:"-1"` ExpireUnixTimestamp int64 `default:"-1"`
MaxTotalScore int `default:"-1"` MaxTotalScore int `default:"-1"`
Stage struct { Stage struct {

2
cmd/joj3/env/env.go vendored
View File

@ -15,6 +15,8 @@ type Attribute struct {
Ref string Ref string
Workflow string Workflow string
RunNumber string RunNumber string
ActorName string
ActorID string
} }
var Attr Attribute var Attr Attribute

View File

@ -2,9 +2,12 @@ package main
import ( import (
"context" "context"
"encoding/csv"
"io"
"log/slog" "log/slog"
"os" "os"
"github.com/joint-online-judge/JOJ3/cmd/joj3/conf"
"github.com/joint-online-judge/JOJ3/cmd/joj3/env" "github.com/joint-online-judge/JOJ3/cmd/joj3/env"
) )
@ -50,17 +53,56 @@ func (h *multiHandler) WithGroup(name string) slog.Handler {
return &multiHandler{handlers: handlers} return &multiHandler{handlers: handlers}
} }
func getSlogAttrs() []slog.Attr { func getSlogAttrs(csvPath string) (attrs []slog.Attr) {
return []slog.Attr{ attrs = []slog.Attr{
slog.String("runID", env.Attr.RunID), slog.String("runID", env.Attr.RunID),
slog.String("confName", env.Attr.ConfName), slog.String("confName", env.Attr.ConfName),
slog.String("actor", env.Attr.Actor), 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("repository", env.Attr.Repository),
slog.String("sha", env.Attr.Sha), slog.String("sha", env.Attr.Sha),
} }
file, err := os.Open(csvPath)
if err != nil {
slog.Error("open csv", "error", err)
return
}
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)
return
}
if len(row) < 3 {
continue
}
actor := row[2]
slog.Info("actor", "actor", actor)
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),
}
}
}
return
} }
func setupSlog(logPath string) error { func setupSlog(conf *conf.Conf) error {
logPath := conf.LogPath
handlers := []slog.Handler{} handlers := []slog.Handler{}
if logPath != "" { if logPath != "" {
// Text file handler for debug logs // Text file handler for debug logs
@ -99,7 +141,9 @@ func setupSlog(logPath string) error {
} }
// Create a multi-handler // Create a multi-handler
multiHandler := &multiHandler{handlers: handlers} multiHandler := &multiHandler{handlers: handlers}
multiHandlerWithAttrs := multiHandler.WithAttrs(getSlogAttrs()) multiHandlerWithAttrs := multiHandler.WithAttrs(
getSlogAttrs(conf.ActorCsvPath),
)
// Set the default logger // Set the default logger
logger := slog.New(multiHandlerWithAttrs) logger := slog.New(multiHandlerWithAttrs)
slog.SetDefault(logger) slog.SetDefault(logger)

View File

@ -60,7 +60,7 @@ func mainImpl() (err error) {
"error", err, "error", err,
) )
}() }()
if err := setupSlog(""); err != nil { // before conf is loaded if err := setupSlog(confObj); err != nil { // before conf is loaded
slog.Error("setup slog", "error", err) slog.Error("setup slog", "error", err)
return err return err
} }
@ -91,7 +91,7 @@ func mainImpl() (err error) {
return err return err
} }
slog.Debug("conf loaded", "conf", confObj) slog.Debug("conf loaded", "conf", confObj)
if err := setupSlog(confObj.LogPath); err != nil { // after conf is loaded if err := setupSlog(confObj); err != nil { // after conf is loaded
slog.Error("setup slog", "error", err) slog.Error("setup slog", "error", err)
return err return err
} }