diff --git a/ExerciseChecker/src/app.ts b/ExerciseChecker/src/app.ts index c7975111d58c4fbf245d435db9c83ec5d225f67e..5ca158c728876617407d26a3f3bb6230303ef7e5 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 750757148e16aabc3f64476fb013f665c2165584..3bfa5ccc10117547ea7a0d3608aa904fae9f74df 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 59308a719fdee1a2025e90a18774d56fc6d11d9b..eedbe869a561f6e9a3b02fa9374cee425af27946 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 cc163bca27eb2fff8d20660d501ccae283facbf3..dedd0807ccf99a448921e3f78de7a63124caf3f7 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