From 3ffa48a9960daef6d5edf6069ad22502380d4d43 Mon Sep 17 00:00:00 2001
From: Dominik George <dominik.george@teckids.org>
Date: Thu, 6 Jul 2023 20:54:25 +0200
Subject: [PATCH] Fix return code of vite build management command

---
 CHANGELOG.rst                            | 6 ++++++
 aleksis/core/management/commands/vite.py | 5 ++++-
 aleksis/core/util/frontend_helpers.py    | 4 ++--
 3 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index b6e1e530b..3457ee9c9 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -9,6 +9,12 @@ and this project adheres to `Semantic Versioning`_.
 Unreleased
 ----------
 
+Fixed
+~~~~~
+
+* [Docker] The build could silently continue even if frontend bundling failed, resulting
+  in an incomplete AlekSIS frontend app.
+
 `3.1.2`_ - 2023-07-05
 ---------------------
 
diff --git a/aleksis/core/management/commands/vite.py b/aleksis/core/management/commands/vite.py
index 57370441b..747f328ea 100644
--- a/aleksis/core/management/commands/vite.py
+++ b/aleksis/core/management/commands/vite.py
@@ -1,6 +1,7 @@
 import os
 
 from django.conf import settings
+from django.core.management.base import CommandError
 
 from django_yarnpkg.management.base import BaseYarnCommand
 from django_yarnpkg.yarn import yarn_adapter
@@ -26,4 +27,6 @@ class Command(BaseYarnCommand):
             yarn_adapter.install(settings.YARN_INSTALLED_APPS)
 
         # Run Vite build
-        run_vite([options["command"]])
+        ret = run_vite([options["command"]])
+        if ret != 0:
+            raise CommandError("yarn command failed", returncode=ret)
diff --git a/aleksis/core/util/frontend_helpers.py b/aleksis/core/util/frontend_helpers.py
index 5d343acc0..885ac39fd 100644
--- a/aleksis/core/util/frontend_helpers.py
+++ b/aleksis/core/util/frontend_helpers.py
@@ -49,7 +49,7 @@ def write_vite_values(out_path: str) -> dict[str, Any]:
         json.dump(vite_values, out)
 
 
-def run_vite(args: Optional[Sequence[str]] = None) -> None:
+def run_vite(args: Optional[Sequence[str]] = None) -> int:
     args = list(args) if args else []
 
     config_path = os.path.join(settings.BASE_DIR, "aleksis", "core", "vite.config.js")
@@ -64,7 +64,7 @@ def run_vite(args: Optional[Sequence[str]] = None) -> None:
     log_level = {"INFO": "info", "WARNING": "warn", "ERROR": "error"}.get(log_level, "silent")
     args += ["-l", log_level]
 
-    yarn_adapter.call_yarn(["run", "vite"] + args)
+    return yarn_adapter.call_yarn(["run", "vite"] + args)
 
 
 def get_language_cookie(code: str) -> str:
-- 
GitLab