Integración continua para las tareas de los estudiantes

Ok, entonces esto puede sonar un poco raro, pero aquí va.

Estoy enseñando un laboratorio de algorithms y estructuras de datos en mi universidad local y quiero ofrecer a mis alumnos una experiencia fluida y divertida. Hasta ahora, utilizaba un repository de git simple que cada estudiante bifurcaba, y cada vez que completaban una tarea, realizaban una request de inserción y extracción, revisaba su código y, si todo estaba bien, fusionaba la request de extracción en el principal. repo. Esto funciona bastante bien, pero quiero hacer algo más interesante.

El laboratorio se enseña en C (ni siquiera en C ++) (y no, no quiero entrar en polémicas sobre por qué otro idioma sería mejor). Lo que quiero hacer es tener algo así como una compilation de Jenkins en cada impulso que hace un alumno que verifica algunas testings pnetworkingefinidas para la tarea en cuestión.

Por ejemplo, para la semana 2, les daría una tarea con lists. Me gustaría escribir las testings para esta tarea yo mismo y luego verificar automáticamente qué hicieron con esas testings.

Lo que tengo disponible:

  • 24/7 ejecutando la máquina CentOS que puedo usar para poner todo en order (tengo Jenkins y Tomcat corriendo en él atm)
  • time suficiente y fuerza de voluntad para tratar de hacer que su experiencia en este laboratorio bien valga la pena

++ un muy buen 'add-on' a todo esto sería usar algo como sonar como verificador de código Y verificar si hay código duplicado dentro de sus twigs (para ver si alguien copió una respuesta de otra persona)

¿Estoy en el path correcto al search un server de Jenkins, pensando en sonar, etc.? Estoy lejos? No creo que esto sea imposible. Puede ser difícil, sí, pero eso lo hace divertido ^^

El 'flujo' que quiero es:

  • cada alumno es parte de una organización git + repo
  • crean una twig del maestro local (impondré una restricción como 'solo usar una subcarpeta con tu nombre')
  • la twig principal contendrá las testings
  • trabajarán en sus tareas en su sucursal y luego lo enviarán a Jenkins / Gerrit / lo que sea
  • la twig se probará de alguna manera y si todas las testings pasan, se fusionará con el maestro.

En nombre de mis queridos estudiantes, gracias.

TL; DR: sí, lo que quiere hacer es factible, y ya está buscando las herramientas correctas.


Lo que quiere parece totalmente factible: instalar el plugin de Git para Jenkins, configurarlo para rastrear cada una de las twigs del repository, y ya es posible lanzar una compilation después de cada inserción.

Dado que puede ejecutar scripts arbitrarios durante una compilation de Jenkins, puede otorgar permissions de inserción al usuario de Jenkins y fusionarlo e insert el código si se superan todas las testings.

También puede instalar un server de sonar y llamarlo a través del complemento Sonar , y sus alumnos obtendrán estos comentarios adicionales.

Por otro lado, Gerrit podría ser un poco exagerado para lo que estás buscando. O más bien: es una herramienta valiosa, pero creo que no la necesita para la primera iteración.

Puedo pensar en dos types de dificultades:

  1. Scripting / Corner cases
  2. Si desea evitar que los estudiantes jueguen con el sistema

Para (1), quiero decir que tendrá que implementar sus reglas (por ejemplo, "solo comstackr la subcarpeta que pertenece al último commiter"; "no comstackr commits de fusión en el maestro"; …). Y es probable que te encuentres con problemas tales que:

  • No desea que un nuevo Jenkins ejecute un compromiso de fusión impulsado por un trabajo de Jenkins, por lo que tendrá que tenerlo en count en su script de compilation.
  • ¿Qué sucede si quieres permitir que varios Jenkins corran al mismo time, y dos carreras intentan fusionarse y empujar al mismo time?

Supongo que solo tendrás que arreglar esos fallos técnicos cuando los descubras. Solo piense en crear copys de security de su configuration de Jenkins (también podría savelas en un repository de git ad hoc).

Para (2), quiero decir que es posible que desee tener en count, por ejemplo, el caso en que un alumno eliminaría del repository las testings que su implementación no puede aprobar. O el caso del estudiante que presionaría directamente al maestro.

Creo que podría agregar muchos controles para evitar este tipo de trampa, sin embargo, en lugar de entrar en un "conflicto tecnológico", creo que sería más saludable simplemente decirles que confía en ellos.