From cc2110d2e60ad8cee9ae14e45dc8a9fe493d0890 Mon Sep 17 00:00:00 2001
From: Joel von der Weid <joel.von-der-weid@hesge.ch>
Date: Wed, 3 Jul 2024 13:36:14 +0200
Subject: [PATCH] Add allowSonarFailure feature

---
 ExerciseChecker/src/app.ts                         | 8 +++++---
 ExerciseChecker/src/managers/DojoBackendManager.ts | 5 +++--
 ExerciseChecker/src/sharedByClients                | 2 +-
 sonar/Dockerfile                                   | 7 ++++++-
 4 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/ExerciseChecker/src/app.ts b/ExerciseChecker/src/app.ts
index c797511..5ca158c 100644
--- a/ExerciseChecker/src/app.ts
+++ b/ExerciseChecker/src/app.ts
@@ -28,6 +28,8 @@ let exerciseDockerCompose: ExerciseDockerCompose;
 let exerciseResultsValidation: ExerciseResultsSanitizerAndValidator;
 
 let haveResultsVolume: boolean;
+let sonarSuccess: boolean | undefined = undefined;
+
 
 /**
  * Step 1:
@@ -76,8 +78,8 @@ async function runSonarAnalysis() {
             }
         }
 
-        const runSuccess = SonarAnalyzer.runAnalysis(exercise!.sonarKey, exerciseAssignment!.assignment.language, exerciseAssignment!.assignmentFile.buildLine);
-        if ( !runSuccess ) {
+        sonarSuccess = SonarAnalyzer.runAnalysis(exercise!.sonarKey, exerciseAssignment!.assignment.language, exerciseAssignment!.assignmentFile.buildLine);
+        if ( !sonarSuccess && !exerciseAssignment!.assignment.allowSonarFailure ) {
             console.error(Styles.ERROR(`${ Icon.ERROR } Sonar gate failed`));
             process.exit(ExerciseCheckerError.SONAR_GATE_FAILED);
         }
@@ -183,7 +185,7 @@ async function uploadResults() {
             liteStats               : true
         });
 
-        await DojoBackendManager.sendResults(exerciseDockerCompose.exitCode, commit, exerciseResultsValidation.exerciseResults, files, await ArchiveHelper.getBase64(Config.folders.resultsVolume));
+        await DojoBackendManager.sendResults(exerciseDockerCompose.exitCode, commit, exerciseResultsValidation.exerciseResults, sonarSuccess, files, await ArchiveHelper.getBase64(Config.folders.resultsVolume));
     } catch ( error ) {
         console.error(Styles.ERROR(`${ Icon.ERROR } Error while uploading the results`));
         console.error(JSON.stringify(error));
diff --git a/ExerciseChecker/src/managers/DojoBackendManager.ts b/ExerciseChecker/src/managers/DojoBackendManager.ts
index 7507571..3bfa5cc 100644
--- a/ExerciseChecker/src/managers/DojoBackendManager.ts
+++ b/ExerciseChecker/src/managers/DojoBackendManager.ts
@@ -26,11 +26,12 @@ class DojoBackendManager {
         }
     }
 
-    public async sendResults(exitCode: number, commit: Record<string, string>, results: ExerciseResultsFile, files: Array<IFileDirStat>, archiveBase64: string): Promise<void> {
-        await axios.post(DojoBackendHelper.getApiUrl(ApiRoute.EXERCISE_RESULTS, { exerciseIdOrUrl: Config.exercise.id }), {
+    public async sendResults(exitCode: number, commit: Record<string, string>, results: ExerciseResultsFile, sonarGatePass: boolean | undefined, files: Array<IFileDirStat>, archiveBase64: string): Promise<void> {
+        await axios.post(this.getApiUrl(ApiRoute.EXERCISE_RESULTS).replace('{{id}}', Config.exercise.id), {
             exitCode     : exitCode,
             commit       : JSON.stringify(commit),
             results      : JSON.stringify(results),
+            sonarGatePass: sonarGatePass?.toString() ?? "",
             files        : JSON.stringify(files),
             archiveBase64: archiveBase64
         });
diff --git a/ExerciseChecker/src/sharedByClients b/ExerciseChecker/src/sharedByClients
index 59308a7..eedbe86 160000
--- a/ExerciseChecker/src/sharedByClients
+++ b/ExerciseChecker/src/sharedByClients
@@ -1 +1 @@
-Subproject commit 59308a719fdee1a2025e90a18774d56fc6d11d9b
+Subproject commit eedbe869a561f6e9a3b02fa9374cee425af27946
diff --git a/sonar/Dockerfile b/sonar/Dockerfile
index cc163bc..dedd080 100644
--- a/sonar/Dockerfile
+++ b/sonar/Dockerfile
@@ -1,8 +1,11 @@
+# Node needed to analyze JS/TS files
+FROM node:18-slim AS node_base
+
 FROM gcc:14
 
 ARG SONAR_HOST_URL=https://isc-sonar.edu.hesge.ch
 
-RUN apt update && apt install -y curl unzip build-essential make g++ clang && apt clean
+RUN apt update && apt install -y curl unzip build-essential make g++ clang git-core openssl libssl-dev && apt clean
 
 # Download sonar tools
 RUN mkdir -p /sonar && \
@@ -26,3 +29,5 @@ RUN mkdir -p /usr/src && \
 USER sonar
 WORKDIR /usr/src
 
+COPY --from=node_base /usr/local/bin /usr/local/bin
+COPY --from=node_base /usr/local/lib/node_modules/npm /usr/local/lib/node_modules/npm
-- 
GitLab