diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 457741d..62653ee 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -87,6 +87,7 @@ deploy: stage: deploy rules: - if: '$CI_COMMIT_REF_NAME == "master"' + when: manual variables: SSH_HOST: "158.160.172.23" SSH_USER: "ubuntu" @@ -109,7 +110,6 @@ deploy: cd ~/deploy docker system prune -a --force docker compose pull > deploy.log 2>&1 - docker compose down >> deploy.log 2>&1 docker compose up -d --remove-orphans --force-recreate >> deploy.log 2>&1 docker compose ps >> deploy.log 2>&1 EOF diff --git a/services/backend/apps/task/models.py b/services/backend/apps/task/models.py index ef0016d..6f37ea4 100644 --- a/services/backend/apps/task/models.py +++ b/services/backend/apps/task/models.py @@ -38,9 +38,10 @@ class CompetitionTask(BaseModel): null=True, blank=True, verbose_name="файл с правильным ответом", + help_text="Имеет смысл только при автоматической (ввод ответа или кода) проверке.", ) points = models.IntegerField( - null=True, blank=True, verbose_name="баллы за задание" + null=True, blank=True, verbose_name="общий балл за задание" ) # only when "checker" type @@ -48,7 +49,10 @@ class CompetitionTask(BaseModel): null=True, blank=True, verbose_name="куда сделать вывод программы участнику", - help_text="Путь до файла в котором ожидается результат. Пример: stdout или ./output.txt", + help_text=( + "Путь до файла в котором ожидается результат. " + "Пример: stdout или ./output.txt. Имеет смысл только при автоматическом типе проверки." + ), default="stdout", ) @@ -57,7 +61,11 @@ class CompetitionTask(BaseModel): Reviewer, blank=True, verbose_name="ревьюверы", - help_text="Справа отображаются действующие проверяющие, слева - доступные для выбора. Для перемещения можно кликнуть 2 раза по проверяющему", + help_text=( + "Справа отображаются действующие проверяющие, слева - доступные для выбора. " + "Для перемещения можно кликнуть 2 раза по проверяющему. Имеет смысл только" + " при ручном типе проверки." + ), ) submission_reviewers_count = models.PositiveSmallIntegerField( default=1, null=True, blank=True, verbose_name="кол-во проверяющих для зачета задачи" diff --git a/services/backend/apps/task/tasks.py b/services/backend/apps/task/tasks.py index 9001a6d..f9598dd 100644 --- a/services/backend/apps/task/tasks.py +++ b/services/backend/apps/task/tasks.py @@ -2,27 +2,38 @@ import httpx from celery import shared_task from django.conf import settings from django.core.files.base import ContentFile +import hashlib + +from apps.task.models import CompetitionTaskSubmission @shared_task(bind=True, max_retries=3) def analyze_data_task(self, submission_id): - from .models import CompetitionTaskSubmission - submission = CompetitionTaskSubmission.objects.get(id=submission_id) try: - code = submission.content.read().decode() + code_url = ( + f"{settings.MINIO_DEFAULT_CUSTOM_ENDPOINT_URL}{submission.path}" + ) files = [ - (f.name, f.file.open("rb")) - for f in submission.task.attachments.filter(public=True) + { + "url": f"{settings.MINIO_DEFAULT_CUSTOM_ENDPOINT_URL}{attachment.path}", + "bind_path": attachment.bind_at, + } + for attachment in submission.task.attachments.filter( + bind_path__isnull=False + ) ] response = httpx.post( f"{settings.CHECKER_API_ENDPOINT}/execute", - files=[("files", (f.name, f)) for f in files] - + [ - ("code", code), - ("expected_hash", submission.task.correct_answer_hash), - ], + json={ + "files": files, + "code_url": code_url, + "answer_file_path": submission.task.answer_file_path, + "expected_hash": hashlib.sha256( + submission.task.correct_answer_file.read().encode() + ).hexdigest(), + }, timeout=30, ) response.raise_for_status() diff --git a/services/checker/main.py b/services/checker/main.py index a1d05fa..64107cc 100644 --- a/services/checker/main.py +++ b/services/checker/main.py @@ -157,12 +157,12 @@ def run_container_safely( "stderr": f"Container error: {str(e)}", "status": -1, } - finally: - if container: - try: - container.remove(force=True) - except docker.errors.DockerException: - pass + # finally: + # if container: + # try: + # container.remove(force=True) + # except docker.errors.DockerException: + # pass def validate_file_path(path: str) -> bool: