feat(cmd/joj3): store & log env
This commit is contained in:
parent
79297a26f7
commit
e808408170
39
cmd/joj3/env/env.go
vendored
Normal file
39
cmd/joj3/env/env.go
vendored
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
package env
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Attribute struct {
|
||||||
|
ConfName string
|
||||||
|
RunID string
|
||||||
|
Actor string
|
||||||
|
Repository string
|
||||||
|
Sha string
|
||||||
|
Ref string
|
||||||
|
Workflow string
|
||||||
|
RunNumber string
|
||||||
|
}
|
||||||
|
|
||||||
|
var Attr Attribute
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
timestamp := time.Now().UnixNano()
|
||||||
|
pid := os.Getpid()
|
||||||
|
high := timestamp >> 32
|
||||||
|
low := timestamp & 0xFFFFFFFF
|
||||||
|
combined := high ^ low
|
||||||
|
combined ^= int64(pid)
|
||||||
|
combined ^= int64(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")
|
||||||
|
}
|
|
@ -2,10 +2,10 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
"time"
|
|
||||||
|
"github.com/joint-online-judge/JOJ3/cmd/joj3/env"
|
||||||
)
|
)
|
||||||
|
|
||||||
var runningTest bool
|
var runningTest bool
|
||||||
|
@ -14,21 +14,6 @@ type multiHandler struct {
|
||||||
handlers []slog.Handler
|
handlers []slog.Handler
|
||||||
}
|
}
|
||||||
|
|
||||||
var runID string
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
timestamp := time.Now().UnixNano()
|
|
||||||
pid := os.Getpid()
|
|
||||||
high := timestamp >> 32
|
|
||||||
low := timestamp & 0xFFFFFFFF
|
|
||||||
combined := high ^ low
|
|
||||||
combined ^= int64(pid)
|
|
||||||
combined ^= int64(timestamp >> 16)
|
|
||||||
combined ^= (combined >> 8)
|
|
||||||
combined ^= (combined << 16)
|
|
||||||
runID = fmt.Sprintf("%08X", combined&0xFFFFFFFF)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *multiHandler) Enabled(ctx context.Context, level slog.Level) bool {
|
func (h *multiHandler) Enabled(ctx context.Context, level slog.Level) bool {
|
||||||
for _, handler := range h.handlers {
|
for _, handler := range h.handlers {
|
||||||
if handler.Enabled(ctx, level) {
|
if handler.Enabled(ctx, level) {
|
||||||
|
@ -65,6 +50,14 @@ func (h *multiHandler) WithGroup(name string) slog.Handler {
|
||||||
return &multiHandler{handlers: handlers}
|
return &multiHandler{handlers: handlers}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getSlogAttrs() []slog.Attr {
|
||||||
|
return []slog.Attr{
|
||||||
|
slog.String("runID", env.Attr.RunID),
|
||||||
|
slog.String("confName", env.Attr.ConfName),
|
||||||
|
slog.String("actor", env.Attr.Actor),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func setupSlog(logPath string) error {
|
func setupSlog(logPath string) error {
|
||||||
handlers := []slog.Handler{}
|
handlers := []slog.Handler{}
|
||||||
if logPath != "" {
|
if logPath != "" {
|
||||||
|
@ -104,8 +97,7 @@ func setupSlog(logPath string) error {
|
||||||
}
|
}
|
||||||
// Create a multi-handler
|
// Create a multi-handler
|
||||||
multiHandler := &multiHandler{handlers: handlers}
|
multiHandler := &multiHandler{handlers: handlers}
|
||||||
multiHandlerWithAttrs := multiHandler.WithAttrs(
|
multiHandlerWithAttrs := multiHandler.WithAttrs(getSlogAttrs())
|
||||||
[]slog.Attr{slog.String("runID", runID)})
|
|
||||||
// Set the default logger
|
// Set the default logger
|
||||||
logger := slog.New(multiHandlerWithAttrs)
|
logger := slog.New(multiHandlerWithAttrs)
|
||||||
slog.SetDefault(logger)
|
slog.SetDefault(logger)
|
||||||
|
|
|
@ -13,19 +13,19 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
confRoot string
|
confFileRoot string
|
||||||
confName string
|
confFileName string
|
||||||
fallbackConfName string
|
fallbackConfFileName string
|
||||||
tag string
|
tag string
|
||||||
msg string
|
msg string
|
||||||
showVersion *bool
|
showVersion *bool
|
||||||
Version string = "debug"
|
Version string = "debug"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
flag.StringVar(&confRoot, "conf-root", ".", "root path for all config files")
|
flag.StringVar(&confFileRoot, "conf-root", ".", "root path for all config files")
|
||||||
flag.StringVar(&confName, "conf-name", "conf.json", "filename for config files")
|
flag.StringVar(&confFileName, "conf-name", "conf.json", "filename for config files")
|
||||||
flag.StringVar(&fallbackConfName, "fallback-conf-name", "", "filename for the fallback config file in conf-root, leave empty to use conf-name")
|
flag.StringVar(&fallbackConfFileName, "fallback-conf-name", "", "filename for the fallback config file in conf-root, leave empty to use conf-name")
|
||||||
flag.StringVar(&tag, "tag", "", "tag to trigger the running, when non-empty, should equal to the scope in msg")
|
flag.StringVar(&tag, "tag", "", "tag to trigger the running, when non-empty, should equal to the scope in msg")
|
||||||
// TODO: remove this flag
|
// TODO: remove this flag
|
||||||
flag.StringVar(&msg, "msg", "", "[DEPRECATED] will be ignored")
|
flag.StringVar(&msg, "msg", "", "[DEPRECATED] will be ignored")
|
||||||
|
@ -38,10 +38,6 @@ func mainImpl() (err error) {
|
||||||
var forceQuitStageName string
|
var forceQuitStageName string
|
||||||
var teapotResult teapot.TeapotResult
|
var teapotResult teapot.TeapotResult
|
||||||
defer func() {
|
defer func() {
|
||||||
actor := os.Getenv("GITHUB_ACTOR")
|
|
||||||
repository := os.Getenv("GITHUB_REPOSITORY")
|
|
||||||
ref := os.Getenv("GITHUB_REF")
|
|
||||||
workflow := os.Getenv("GITHUB_WORKFLOW")
|
|
||||||
totalScore := 0
|
totalScore := 0
|
||||||
for _, stageResult := range stageResults {
|
for _, stageResult := range stageResults {
|
||||||
for _, result := range stageResult.Results {
|
for _, result := range stageResult.Results {
|
||||||
|
@ -50,14 +46,9 @@ func mainImpl() (err error) {
|
||||||
}
|
}
|
||||||
slog.Info(
|
slog.Info(
|
||||||
"joj3 summary",
|
"joj3 summary",
|
||||||
"name", confObj.Name,
|
|
||||||
"totalScore", totalScore,
|
"totalScore", totalScore,
|
||||||
"forceQuit", forceQuitStageName != "",
|
"forceQuit", forceQuitStageName != "",
|
||||||
"forceQuitStageName", forceQuitStageName,
|
"forceQuitStageName", forceQuitStageName,
|
||||||
"actor", actor,
|
|
||||||
"repository", repository,
|
|
||||||
"ref", ref,
|
|
||||||
"workflow", workflow,
|
|
||||||
"issue", teapotResult.Issue,
|
"issue", teapotResult.Issue,
|
||||||
"action", teapotResult.Action,
|
"action", teapotResult.Action,
|
||||||
"sha", teapotResult.Sha,
|
"sha", teapotResult.Sha,
|
||||||
|
@ -73,8 +64,8 @@ func mainImpl() (err error) {
|
||||||
fmt.Println(Version)
|
fmt.Println(Version)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if fallbackConfName == "" {
|
if fallbackConfFileName == "" {
|
||||||
fallbackConfName = confName
|
fallbackConfFileName = confFileName
|
||||||
}
|
}
|
||||||
slog.Info("start joj3", "version", Version)
|
slog.Info("start joj3", "version", Version)
|
||||||
msg, err := conf.GetCommitMsg()
|
msg, err := conf.GetCommitMsg()
|
||||||
|
@ -83,7 +74,7 @@ func mainImpl() (err error) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
confPath, confStat, conventionalCommit, err := conf.GetConfPath(
|
confPath, confStat, conventionalCommit, err := conf.GetConfPath(
|
||||||
confRoot, confName, fallbackConfName, msg, tag)
|
confFileRoot, confFileName, fallbackConfFileName, msg, tag)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("get conf path", "error", err)
|
slog.Error("get conf path", "error", err)
|
||||||
return err
|
return err
|
||||||
|
@ -119,7 +110,7 @@ func mainImpl() (err error) {
|
||||||
slog.Error("stage write", "error", err)
|
slog.Error("stage write", "error", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
teapotResult, err = teapot.Run(confObj, runID)
|
teapotResult, err = teapot.Run(confObj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("teapot run", "error", err)
|
slog.Error("teapot run", "error", err)
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -14,6 +14,7 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/joint-online-judge/JOJ3/cmd/joj3/conf"
|
"github.com/joint-online-judge/JOJ3/cmd/joj3/conf"
|
||||||
|
"github.com/joint-online-judge/JOJ3/cmd/joj3/env"
|
||||||
)
|
)
|
||||||
|
|
||||||
type TeapotResult struct {
|
type TeapotResult struct {
|
||||||
|
@ -22,20 +23,18 @@ type TeapotResult struct {
|
||||||
Sha string `json:"sha"`
|
Sha string `json:"sha"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func Run(conf *conf.Conf, runID string) (teapotResult TeapotResult, err error) {
|
func Run(conf *conf.Conf) (teapotResult TeapotResult, err error) {
|
||||||
os.Setenv("LOG_FILE_PATH", conf.Teapot.LogPath)
|
os.Setenv("LOG_FILE_PATH", conf.Teapot.LogPath)
|
||||||
os.Setenv("_TYPER_STANDARD_TRACEBACK", "1")
|
os.Setenv("_TYPER_STANDARD_TRACEBACK", "1")
|
||||||
sha := os.Getenv("GITHUB_SHA")
|
if env.Attr.Actor == "" ||
|
||||||
actor := os.Getenv("GITHUB_ACTOR")
|
env.Attr.Repository == "" ||
|
||||||
repository := os.Getenv("GITHUB_REPOSITORY")
|
strings.Count(env.Attr.Repository, "/") != 1 ||
|
||||||
runNumber := os.Getenv("GITHUB_RUN_NUMBER")
|
env.Attr.RunNumber == "" {
|
||||||
if actor == "" || repository == "" || strings.Count(repository, "/") != 1 ||
|
|
||||||
runNumber == "" {
|
|
||||||
slog.Error("teapot env not set")
|
slog.Error("teapot env not set")
|
||||||
err = fmt.Errorf("teapot env not set")
|
err = fmt.Errorf("teapot env not set")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
repoParts := strings.Split(repository, "/")
|
repoParts := strings.Split(env.Attr.Repository, "/")
|
||||||
repoName := repoParts[1]
|
repoName := repoParts[1]
|
||||||
skipIssueArg := "--no-skip-result-issue"
|
skipIssueArg := "--no-skip-result-issue"
|
||||||
if conf.Teapot.SkipIssue {
|
if conf.Teapot.SkipIssue {
|
||||||
|
@ -55,10 +54,11 @@ func Run(conf *conf.Conf, runID string) (teapotResult TeapotResult, err error) {
|
||||||
}
|
}
|
||||||
re := regexp.MustCompile(`\x1b\[[0-9;]*[a-zA-Z]`)
|
re := regexp.MustCompile(`\x1b\[[0-9;]*[a-zA-Z]`)
|
||||||
cmd := exec.Command("joint-teapot",
|
cmd := exec.Command("joint-teapot",
|
||||||
"joj3-all", conf.Teapot.EnvFilePath, conf.Stage.OutputPath, actor,
|
"joj3-all", conf.Teapot.EnvFilePath, conf.Stage.OutputPath,
|
||||||
conf.Teapot.GradingRepoName, repoName, runNumber,
|
env.Attr.Actor, conf.Teapot.GradingRepoName, repoName,
|
||||||
conf.Teapot.ScoreboardPath, conf.Teapot.FailedTablePath,
|
env.Attr.RunNumber, conf.Teapot.ScoreboardPath,
|
||||||
conf.Name, sha, runID,
|
conf.Teapot.FailedTablePath,
|
||||||
|
conf.Name, env.Attr.Sha, env.Attr.RunID,
|
||||||
"--max-total-score", strconv.Itoa(conf.Teapot.MaxTotalScore),
|
"--max-total-score", strconv.Itoa(conf.Teapot.MaxTotalScore),
|
||||||
skipIssueArg, skipScoreboardArg,
|
skipIssueArg, skipScoreboardArg,
|
||||||
skipFailedTableArg, submitterInIssueTitleArg,
|
skipFailedTableArg, submitterInIssueTitleArg,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user