diff --git a/CHANGELOG.md b/CHANGELOG.md index 1eec6bc9dafce1daa13ce9468a60655ce2c572e7..a4d0f582d4aa88849532df7fc7799d85b497d7dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,14 +14,12 @@ **⚠️ Deprecation:** --> -## 2.2.0 (?) +## 2.2.0 (2023-10-16) ### ✨ Feature - `results.json` file is now optional (if the teaching staff don't want to provide test details) - - If the file is not present or the `success` field is not present: - - The exercise will be considered as valid if the container exit code is 0 - - The `results.json` file will be construct / completed with the container exit code - - If the file is present, the exercise will be considered as valid + - The exercise will be considered as valid if the container exit code is 0 + - The `results.json` file will be construct / completed with the container exit code - The `volume` argument of `dojo_assignment.json` is now optional (if the teaching staff don't want to provide `results.json` file or other files) - Assignment run command added (to run the assignment locally) diff --git a/Wiki/Tutorials/1-Assignment-creation.md b/Wiki/Tutorials/1-Assignment-creation.md index 16441292665f46c699b6d6fb419dd9129f430504..848d3b9e3f9be09a460bc3b69e7a55b47ad320d7 100644 --- a/Wiki/Tutorials/1-Assignment-creation.md +++ b/Wiki/Tutorials/1-Assignment-creation.md @@ -118,8 +118,11 @@ services: dockerfile: Dockerfile volumes: - hello_world_volume:/result # <hello_world_volume> must be the same as below but - # the name may be arbitrary. This volume must be - # present in the dojo_assignment.json file under the field + # the name may be arbitrary. The volume is optional but + # you can provide it for show details of the execution like + # tests passed or not or simply any log file you think that + # can be useful for the students. If it's present, this volume + # must be present in the dojo_assignment.json file under the field # "result": { # "volume": "hello_world_volume", # ... @@ -129,18 +132,25 @@ volumes: ``` In this file, we see the definition of a `hello_world_volume` this is an arbitrary name and can be changed but it must be coherent in this file and in the `dojo_assignment.json` file (more on this later configuration file in [The dojo configuration file](#the-dojo-configuration-file)). -This volume is responsible of mounting `/result/` directory which will contain all +This (optional) volume is responsible of mounting `/result/` directory which will contain all the output generated by our assignment (again the name can be changed). In particular -in this director e will be required to create a `dojo_assignment.json` file +in this director he will be required to create a `dojo_assignment.json` file that contains at least if the assignment was successfully performed (more on that at the end of the [Creating the assignment files](#creating-the-assignment-files) section). ## The dojo configuration file The `dojo_assignment.json` file contains the general configuration of the assignment. -The important configuration parameters are: -- the *immutable files* which are files that will be overwritten when the compilation pipeline is run (even if the student -modifies these files the modifications will not be taken into account), -- the *results* which is the volume corresponding to the `docker-compose.yml` file. +The configuration parameters are: +- the `dojoAssignmentVersion` which define the version of the dojo assignment file (actually only version 1 is available), +- the `version` of you assignment, +- the `immutable` field which are files or directories that will be overwritten when the compilation pipeline is run (even if the student +modifies these files the modifications will not be taken into account). Each immutable is defined by: + - `path` **(required)**: the path of the immutable file or directory, + - `description` _(optional)_: provides a description of the immutable for the students or Dojo interface, + - `isDirectory` _(optional)_: `true` if the immutable is a directory, `false` otherwise (default), +- the `results` which provide information to the Dojo for finding results of the execution. The *result* field is defined by: + - `container` **(required)**: the name of the service in the docker compose file that will be run (his dependencies will be run automatically). In our case it is `hello_world`, + - `volume` _(optional)_: this field (`hello_world_volume`) corresponds to the `volumes` field in the `docker-compose.yml` file. In its default form `dojo_assignment.json` file contains ```json @@ -160,13 +170,8 @@ In its default form `dojo_assignment.json` file contains } } ``` -Here we see only one immutable file which is the `Dockerfile` (the `isDirectory` field is `false` but it is possible to make -complete directories immutable) and we see that: -* the value of the `container` field (`hello_world`) corresponds to -the value of the `container_name` field in the `docker-compose.yml` file, -* the value of the `volume` field (`hello_world_volume`) corresponds to the `volumes` field in the `docker-compose.yml` file. -This file will be completed in [The immutable files](#the-immutable-files) sectino with the files of our assignment that will be +This file will be completed in [The immutable files](#the-immutable-files) section with the files of our assignment that will be created in the [next section](#creating-the-assignment-files). ## Creating the assignment files @@ -250,21 +255,23 @@ if [ $? -eq 0 ]; then if [ $? -ne 0 ]; then echo "Output is wrong:"; cat result/diff_output.txt + exit(1); else echo "All tests were a complete success" GLOBAL_SUCCESS=true + exit(0); fi else echo "Execution failed"; + exit(2); fi else echo "Compilation failed." + exit(3); fi - -jq --null-input --arg success $GLOBAL_SUCCESS \ - '{"success": $success | test("true")}' > /result/results.json ``` +We use the exit code to say to Dojo if the exercise was a success (exit code `0`) or a failure (all other exit codes). Here one can see the creation of two different files that are located in the `result` directory: - `result/results.json` - `result/diff_output.txt` @@ -273,6 +280,19 @@ The `results.json` is mandatory to be created and must at least contain the assignment is a success or a failure. The other files present in the `result` folder can be retrieved by the students. +In the result directory you can provide the optional `result.json` file that can contain more details about the tests: +``` +successfulTests?: number; +failedTests?: number; + +successfulTestsList?: Array<string>; +failedTestsList?: Array<string>; +``` +- the `successfulTests` which provide the number of successfully passed tests, +- the `failedTests` which provide the number of failed tests, +- the `successfulTestsList` which provide the list (of string) of successfully passed tests, +- the `failedTestsList` which provide the list (of string) of failed tests, + To test if everything works according to plan, one can again use the command ```bash $ docker compose run --build hello_world @@ -375,6 +395,39 @@ Pour ce faire, il faut modifier le fichier `src/function.c` sous la ligne annotée avec `TODO`. Bonne chance! ``` +## Validate the assignment + +Now that the assignment is ready, we must validate it. +You can do it first locally with the command +```bash +$ dojo assignment check +``` +```console +Please wait while we are checking requirements... + ✔ Docker daemon is running + ✔ All required files exists +Please wait while we are validating dojo_assignment.json file... + ✔ dojo_assignment.json file schema is valid + ✔ Immutable files are valid +Please wait while we are validating docker compose file... + ✔ Docker compose file structure is valid + ✔ Docker compose file content is valid +Please wait while we are validating dockerfiles... + ✔ Docker compose file content is valid +Please wait while we are running the assignment... + ✔ Docker Compose file run successfully + ✔ Linked services logs acquired + ✔ Containers stopped and removed + + ┏━━━━━━━━━━━━━━━━━ Results ━━━━━━━━━━━━━━━━━┓ + ┃ ┃ + ┃ Global result : ✅ Success ┃ + ┃ ┃ + ┃ The assignment is ready to be pushed. ┃ + ┃ ┃ + ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +``` + ## Publish the work Now that the assignment is ready, we must publish it. First add/commit/push all the @@ -394,7 +447,9 @@ c_hello_world/ └── Makefile ``` Then one must *publish* the assignment for the students to be able to perform to get the exercise. +A pipeline will be automatically run to check that the assignment is valid (the same as the previous state). +Wait for the successfully completion of this pipeline and then you are ready to publish the assignment with the command: ```bash $ dojo assignment publish c_hello_world ``` diff --git a/Wiki/UserDocumentation/2-Assignment-creation.md b/Wiki/UserDocumentation/2-Assignment-creation.md index 15c7392aaaa51cc1a762e9c2e0600ecf4577ae1d..76d65404f7d920ce8312ebc5f39483ef5eb71624 100644 --- a/Wiki/UserDocumentation/2-Assignment-creation.md +++ b/Wiki/UserDocumentation/2-Assignment-creation.md @@ -48,7 +48,7 @@ dojo assignment create git clone ssh://git@ssh.hesge.ch:10572/dojo/assignment/unique_name.git ``` 3. Modify the `unique_name` assignment as you want (modify the Dockerfile, docker-compose.yml files, add a readme, source code, compilation tools, etc.). Commit and push our work (soon™ more details will be provided on how to create assignment). -4. Once the assignment is done it must be published to be available to students: +4. Once the assignment is done and validated by the pipeline it must be published to be available to students: ```bash dojo assignment publish unique_name ```