- repo size - forbidden files - meta files - ascii character in files - integrity check - ascii character in the commit message - release tag check Co-authored-by: Boming Zhang <bomingzh@sjtu.edu.cn> Co-authored-by: zzjc1234 <2359047351@qq.com> Co-authored-by: Hydraallen <wangruiallen@gmail.com> Reviewed-on: FOCS-dev/JOJ3#17 Co-authored-by: 周赵嘉程521432910016 <zzjc123@sjtu.edu.cn> Co-committed-by: 周赵嘉程521432910016 <zzjc123@sjtu.edu.cn>
4.1 KiB
JOJ3
Quick Start
-
Make sure you are in a Unix-like OS (Linux, MacOS). For Windows, use WSL 2.
-
Install Go. Also, make sure
make
andgit
are installed and all 3 programs are presented in$PATH
. -
Enable cgroup v2 for your OS. Check here. So that you do not need root permission to run
go-judge
. -
Clone go-judge.
$ git clone https://github.com/criyle/go-judge && cd go-judge
$ go build -o ./tmp/go-judge ./cmd/go-judge
- Run
go-judge
.
$ # make sure you are in go-judge directory
$ ./tmp/go-judge -http-addr 0.0.0.0:5050 -grpc-addr 0.0.0.0:5051 -monitor-addr 0.0.0.0:5052 -enable-grpc -enable-debug -enable-metrics
- Pull submodules. It might be slow, so only run it when necessary.
$ # make sure you are in JOJ3 directory
$ make prepare-test
- Build binaries in
/cmd
.
$ make
- Check the functions of
joj3
with themake test
, which should pass all the test cases. The cases used here are in/examples
.
Note: you may fail the test if the checking tools are not installed. e.g. For the test case cpplint/sillycode
, you need to install cpplint
in /usr/bin
or /usr/local/bin
.
$ make test
go test -coverprofile cover.out -v ./...
...
PASS
coverage: 74.0% of statements
ok focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/cmd/joj3 2.290s coverage: 74.0% of statements
For developers
-
Install
pre-commit
,golangci-lint
,goimports
,gofumpt
. -
Install the pre-commit hooks. It will run some checks before you commit.
$ pre-commit install
pre-commit installed at .git/hooks/pre-commit
- You only need to run steps 5, 7, and 8 in the quick start during development. If the test cases need to be updated, step 6 is also needed.
Models
The program parses the configuration file to run multiple stages.
Each stage contains an executor and parser. An executor just executes a command and returns the original result (stdout, stderr, output files). We can limit the time and memory used by each command in the executor. We run all kinds of commands in executors of different stages, including code formatting, static check, compilation, and execution. A parser takes the result and the configuration of the stage to parse the result and return the score and comment. e.g. If in the current stage, the executor runs a clang-tidy
command, then we can use the clang-tidy parser in the configuration file to parse the stdout of the executor result and check whether some of the rules are followed. We can deduct the score and add some comments based on the result, and return the score and comment as the output of this stage. This stage ends here and the next stage starts.
In codes, an executor takes a Cmd
and returns an ExecutorResult
, while a parser takes an ExecutorResult
and its conf and returns a ParserResult
and bool
to indicate whether we should skip the rest stages.
Cmd
Check Cmd
at https://github.com/criyle/go-judge#rest-api-interface.
Some difference:
CopyInCwd bool
: set totrue
to add everything in the current working directory toCopyIn
.CopyInCached map[string]string
: key: file name in the sandbox, value: file name used inCopyOutCached
.LocalFile
: now supports the relative path
ExecutorResult
Check the Result
at https://github.com/criyle/go-judge#rest-api-interface.
ParserResult
Score int
: score of the stage.Comment string
: comment on the stage.
HealthCheck
The repohealth check will return a json list to for check result. The structure follows the score-comment pattern.
HealthCheck currently includes, reposize
, forbidden file
, Metafile existence
, non-ascii character
in file and message, release tag
, and ci files invariance
check.
The workflow is joj3
pass cli args to healthcheck binary. See ./cmd/healthcheck/main.go
to view all flags.