arrow arrow--cut calendar callback check chevron chevron--large cross cross--large download filter kununu linkedin magnifier mail marker menu minus Flieger phone play plus quote share

CI Hackathon 2023: Projekt Lernplattform

Ein Erfahrungsbericht

Am 24.08.2023 war es so weit, nach zwei Jahren Coronapause (und für mich auch zum ersten Mal) gab es endlich wieder einen Hackathon @ CI . Mit gut 60 Leuten versammelten wir uns in unserer Lounge, pitchten Ideen und schlossen uns mit interessierten Kolleg*innen zusammen, um diese umzusetzen. 

Foto von Mario Breyer
Mario Breyer

Software Developer

Die Idee: eine interaktive Lernplattform

Eine Idee war es, eine eigene interaktive Lernplattform à la KodeCloud (oder ähnliche) zu realisieren. Konkret handelt es sich dabei um eine Webapplikation, in der man sich einen Kurs aussuchen kann. Dieser besteht aus mehreren Aufgaben, die nacheinander abgearbeitet werden müssen, wobei jedes Zwischenergebnis auf korrekte Lösung validiert wird. Alle notwendigen Tools, z.B. eine Shell, eine IDE, etc. sind direkt in der Webapplikation eingebunden.

Das anvisierte Ziel für die 24 Stunden des Hackathon war eine rudimentäre Weboberfläche mit zwei Seiten: eine Übersicht der verfügbaren Kurse und die eigentliche Kursseite. Dort sollten die Aufgaben angezeigt werden und eine Shell zur Bearbeitung der Aufgaben eingebunden sein. Im Hintergrund sollte auf einer Kubernetes-Instanz der notwendige Pod automatisch provisioniert und mit der Webseite verbunden werden. Diese Idee bot mir einige interessante technische Herausforderungen und ich schloss mich dieser Gruppe an.

Jetzt geht's los

In einem kurzen Brainstorming skizzierten wir die Lösung auf einem Flip-Chart und teilen uns nach Interesse und Können auf. Ich war schon immer viel in der Frontend-Entwicklung unterwegs und meldete mich dementsprechend für das Frontend. Voller Tatendrang begannen wir mit der Umsetzung, setzten uns zunächst zu zweit zusammen und wir entwarfen eine erste Idee für eine REST-API zwischen Frontend und Backend. Die anderen Kollegen bereiteten schonmal die Git-Infrastruktur vor, machten sich Gedanken, wie Kurse deklarativ beschrieben werden können und setzen eine einfache Kubernetes-Instanz auf.

Frontend Development

Da ich aus dem Java Umfeld komme, hatte ich immer viel mit serverseitig gerenderten Frontends zu tun. Den Hackathon wollte ich nutzen, um mal wieder in andere Ansätze und Frameworks zu schnuppern. Daher entscheid ich mich, das Frontend mit Vue.js zu realisieren und so direkt meine TypeScript-Kenntnisse wieder aufzufrischen.

Also schnell NPM installiert und mit Vue.js ein Projekt aufgesetzt. Der Einstieg war leicht und die beiden Seiten, bis auf ein paar Stolpersteine, recht schnell erstellt. Noch fix die Farben, Schriftart und Icons von der CI-Webseite übernommen und schon sah es ganz annehmbar aus. Zwar waren alle Daten erstmal nur gemockt, aber das Anbinden der echten Schnittstelle sollte nicht allzu schwer werden. Eine große Unbekannte gab es aber noch: Wie zeige ich eine Shell in einer Webseite an? So etwas hatte ich bisher noch nicht gemacht. Doch es stellte sich raus: Das gibt es schon fertig in xterm.js und ich musste es nur in unsere App einbinden. Damit war alles vorbereitet und ich brauchte nur noch die Schnittstellen, um die App mit Leben zu füllen.

Backend Development

Hier war ich nicht direkt eingebunden. Da die konkrete Lösung bestimmt auch einige interessiert, habe ich meinen Kollegen (Jochen) gebeten, uns einen kurzen Einblick zu geben:

Wir wollen das Rad nicht neu erfinden, unser Backend soll im Wesentlichen bestehende Technologien geschickt miteinander verknüpfen. Deshalb stellen wir uns auf die Schulter von Giganten: Wenn eine Übung gestartet wird, soll unser auf Spring-Boot basierendes Backend für diese Instanz dynamisch einen Kubernetes-Namespace erstellen und darin alle nötigen Komponenten für die Übung deployen. Welche Komponenten das sind, wird in einer YAML-Datei angegeben, die die Übung definiert. Dort wird auch angegeben, wie geprüft werden soll, ob die Übung erfolgreich absolviert wurde und welche Aufgabentexte dem Benutzer angezeigt werden.

Ein solches Setup könnte zum Beispiel ein nginx sein sowie ein Pod, um die Dateien der Webseite zu editieren (ubuntu mit vim). Der Benutzer bekommt dann eine Kommandozeile in eben diesen Pod und kann seine Aufgabenstellung dort abarbeiten. Klickt er auf “Lösung prüfen”, wird ein Script ausgeführt, welches die Webseite aufruft und nach einer Zeichekette in der Antwort prüft, die in der Aufgabe gefordert wurde. Hat alles funktioniert, bekommt der Benutzer den nächsten Schritt in der Aufgabe angezeigt. Das Backend muss all diese Komponenten verwalten und dafür sorgen, dass die Konsole über Websockets an den richtigen Browser geschickt wird. Eine weitere wesentliche Aufgabe sind Timeouts und Error-Handling.

In einer weiteren Ausbaustufe sollen neben Konsolen über iFrames auch beliebige Webanwendungen eingebunden werden können, die in dem Namespace laufen. So können z.B. auch VSCode oder novnc genutzt werden. Das ist jedoch für die kurze Zeit nicht mehr realistisch, obwohl technisch alles dazu vorbereitet ist.

Der Endspurt

Mittlerweile war es 17-18 Uhr, wir waren immer noch voller Tatendrang und alles soweit vorbereitet, um zusammengesteckt zu werden. Mit Hilfe von Axios machte ich mich daran, die REST-Schnittstelle anzubinden. Zuerst lief auch alles glatt, die Vorfreude stieg.

CI Hackathon 2023 Lernplattform Screenshot 1

Doch leider hatte ich mich für einen einfachen Routing-Mechanismus entscheiden und konnte damit die notwendigen Informationen nicht von der Kursübersicht an die Kursseite weitergeben. Also band ich vue-router ein und baute alles um. Doch wie es halt immer so läuft, klappte das nicht auf Anhieb und kam mit ein paar Fallstricken einher. So dauerte es bestimmt ein bis zwei Stunden, bis wieder alles lief. 

Anschließend lief es wieder besser und auch die Kursseite nahm schnell Gestalt an. Die wichtigste Baustelle (die interaktive Shell) stand allerdings noch aus. Ich denke, wir alle hatten davor ein bisschen Respekt und leichte Bedenken, ob alles funktionieren würde. Doch wie sich herausstellte, waren diese komplett unbegründet. Im Endeffekt war es ganz einfach: Das Backend stellte einen WebSocket bereit und ich verband diesen mit den beiden Hooks der xterm Komponente.

Screenshot CI Hackathon 2023 Lernplattfom 2

Wir hatten zwar noch ein paar Encoding-Probleme und einen Bug im Backend, doch alles in allem lief es sehr reibungslos. Innerhalb kürzester Zeit hatten wir ein funktionierende und performante Shell in unserer Webapplikation. Mit diesem erfolgreichen Durchstich hatten wir für den Tag auch genug und gingen um etwa 23 Uhr in den wohlverdienten Feierabend.

Den nächsten Vormittag nutzten wir, um letzten Schliff anzulegen, die App ein wenig aufzuhübschen, Optimierungen vorzunehmen und auch schon mit ein paar weiterreichenden Features zu beginnen. Schließlich war es Zeit, unser Ergebnis zu präsentieren. Ja, durchaus mit Stolz (schließlich hatten wir unser gesetztes Ziel erreicht) präsentierten wir unsere App in einer Live-Demo und freuten uns über das positive Feedback der anderen Teams.

Fazit

Die beiden Tage haben mir viel Freude bereitet. Ich konnte viel Neues lernen, interessante Technologien ausprobieren und auch mal wieder eng mit den CI Kolleg*innen zusammenarbeiten. Das kommt bei der Projektarbeit für Kunden manchmal leider zu kurz. Es war sehr schön und unglaublich motivierend mitzuerleben, wie die Idee zu den funktionierenden Prototypen herangewachsten ist und ich freue mich schon jetzt auf den Hackathon im nächsten Jahr!