feat(cmd/joj3): create result issue on stage run error
All checks were successful
submodules sync / sync (push) Successful in 41s
build / build (push) Successful in 1m25s
build / trigger-build-image (push) Successful in 7s

This commit is contained in:
张泊明518370910136 2024-10-28 05:08:43 -04:00
parent 6f3ba1500a
commit 6cb6cb1f67
GPG Key ID: D47306D7062CDA9D
3 changed files with 41 additions and 19 deletions

View File

@ -69,9 +69,12 @@ func mainImpl() error {
slog.Error("conf check expire", "error", err) slog.Error("conf check expire", "error", err)
return err return err
} }
stageForceQuit, err := stage.Run(confObj, group) stageResults, stageForceQuit, err := stage.Run(confObj, group)
if err != nil { if err != nil {
slog.Error("stage run", "error", err) slog.Error("stage run", "error", err)
}
if err = stage.Write(confObj.Stage.OutputPath, stageResults); err != nil {
slog.Error("stage write", "error", err)
return err return err
} }
if err := teapot.Run(confObj); err != nil { if err := teapot.Run(confObj); err != nil {

View File

@ -1,9 +1,7 @@
package stage package stage
import ( import (
"encoding/json"
"log/slog" "log/slog"
"os"
"github.com/joint-online-judge/JOJ3/cmd/joj3/conf" "github.com/joint-online-judge/JOJ3/cmd/joj3/conf"
executors "github.com/joint-online-judge/JOJ3/internal/executor" executors "github.com/joint-online-judge/JOJ3/internal/executor"
@ -70,18 +68,19 @@ func generateStages(conf *conf.Conf, group string) ([]stage.Stage, error) {
return stages, nil return stages, nil
} }
func outputResult(outputPath string, results []stage.StageResult) error { func Run(conf *conf.Conf, group string) (
slog.Info("output result start", "path", outputPath) stageResults []stage.StageResult, forceQuit bool, err error,
slog.Debug("output result start", "path", outputPath, "results", results) ) {
content, err := json.Marshal(results) stageResultsOnError := []stage.StageResult{
if err != nil { {
return err Name: "Internal Error",
Results: []stage.ParserResult{{
Score: 0,
Comment: "JOJ3 internal error, check the log in Gitea Actions.",
}},
ForceQuit: true,
},
} }
return os.WriteFile(outputPath,
append(content, []byte("\n")...), 0o600)
}
func Run(conf *conf.Conf, group string) (forceQuit bool, err error) {
executors.InitWithConf( executors.InitWithConf(
conf.Stage.SandboxExecServer, conf.Stage.SandboxExecServer,
conf.Stage.SandboxToken, conf.Stage.SandboxToken,
@ -89,16 +88,16 @@ func Run(conf *conf.Conf, group string) (forceQuit bool, err error) {
stages, err := generateStages(conf, group) stages, err := generateStages(conf, group)
if err != nil { if err != nil {
slog.Error("generate stages", "error", err) slog.Error("generate stages", "error", err)
stageResults = stageResultsOnError
forceQuit = true
return return
} }
defer stage.Cleanup() defer stage.Cleanup()
results, forceQuit, err := stage.Run(stages) stageResults, forceQuit, err = stage.Run(stages)
if err != nil { if err != nil {
slog.Error("run stages", "error", err) slog.Error("run stages", "error", err)
return stageResults = stageResultsOnError
} forceQuit = true
if err = outputResult(conf.Stage.OutputPath, results); err != nil {
slog.Error("output result", "error", err)
return return
} }
return return

20
cmd/joj3/stage/write.go Normal file
View File

@ -0,0 +1,20 @@
package stage
import (
"encoding/json"
"log/slog"
"os"
"github.com/joint-online-judge/JOJ3/internal/stage"
)
func Write(outputPath string, results []stage.StageResult) error {
slog.Info("output result start", "path", outputPath)
slog.Debug("output result start", "path", outputPath, "results", results)
content, err := json.Marshal(results)
if err != nil {
return err
}
return os.WriteFile(outputPath,
append(content, []byte("\n")...), 0o600)
}