diff --git a/ExpressAPI/assets/exercice_gitlab_ci.yml b/ExpressAPI/assets/exercice_gitlab_ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..9a9877f10d3ff75170f2fcfa2dba9f7e9b51fd32 --- /dev/null +++ b/ExpressAPI/assets/exercice_gitlab_ci.yml @@ -0,0 +1,30 @@ +################################################################################################################### +# DO NOT MODIFY THIS FILE +# This file is the ci/cd pipeline that will be used to test your exercice +################################################################################################################### + +variables: + GIT_SUBMODULE_STRATEGY: recursive + GIT_SUBMODULE_FORCE_HTTPS: "true" + DOCKER_HOST: tcp://docker:2375 + DOCKER_TLS_CERTDIR: + DOCKER_DRIVER: overlay2 + +stages: + - dojo + +dojo: + stage: dojo + tags: + - dojo_exercice + services: + - docker:dind + image: + name: dojohesso/dojo_exercice_checker:latest + script: + - dojo_exercice_checker + artifacts: + when: always + paths: + - $DOJO_RESULTS_FOLDER/* + allow_failure: false \ No newline at end of file diff --git a/ExpressAPI/src/managers/GitlabManager.ts b/ExpressAPI/src/managers/GitlabManager.ts index 6aa86c56055b509008a619aec678375c712d70b5..0b33bd5f5e65d6347e48081a1f01e95b3bfd8124 100644 --- a/ExpressAPI/src/managers/GitlabManager.ts +++ b/ExpressAPI/src/managers/GitlabManager.ts @@ -186,6 +186,17 @@ class GitlabManager { return response.data; } + + async createFile(repoId: number, filePath: string, fileBase64: string, commitMessage: string, branch: string = 'main', authorName: string = 'Dojo', authorMail: string | undefined = undefined) { + await axios.post(this.getApiUrl(GitlabRoutes.REPOSITORY_FILE).replace('{{id}}', String(repoId)).replace('{{filePath}}', encodeURIComponent(filePath)), { + encoding : 'base64', + branch : branch, + commit_message: commitMessage, + content : fileBase64, + author_name : authorName, + author_email : authorMail + }); + } } diff --git a/ExpressAPI/src/routes/ExerciceRoutes.ts b/ExpressAPI/src/routes/ExerciceRoutes.ts index 5fde1260f922b7455fec88221f85c96aa06c2b3b..f4a2e389fb392538f0f0dd315c33f4ad5f1d88b6 100644 --- a/ExpressAPI/src/routes/ExerciceRoutes.ts +++ b/ExpressAPI/src/routes/ExerciceRoutes.ts @@ -120,6 +120,18 @@ class ExerciceRoutes implements RoutesManager { return res.status(StatusCodes.INSUFFICIENT_SPACE_ON_RESOURCE).send(); } + try { + await GitlabManager.createFile(repository.id, '.gitlab-ci.yml', fs.readFileSync(path.join(__dirname, '../../assets/exercice_gitlab_ci.yml'), 'base64'), 'Add .gitlab-ci.yml (DO NOT MODIFY THIS FILE)'); + } catch ( error ) { + logger.error(error); + + if ( error instanceof AxiosError ) { + return res.status(error.response?.status ?? HttpStatusCode.InternalServerError).send(); + } + + return res.status(StatusCodes.INTERNAL_SERVER_ERROR).send(); + } + try { await Promise.all([ ...new Set([ ...enonce.staff.map(user => user.gitlabId), ...params.members.map(member => member.id) ]) ].map(async (memberId: number): Promise<GitlabMember | false> => { try { @@ -158,11 +170,12 @@ class ExerciceRoutes implements RoutesManager { return req.session.sendResponse(res, StatusCodes.OK, exercice); } catch ( error ) { + logger.error(error); + if ( error instanceof AxiosError ) { return res.status(error.response?.status ?? HttpStatusCode.InternalServerError).send(); } - logger.error(error); return res.status(StatusCodes.INTERNAL_SERVER_ERROR).send(); } }