====== Migration von GitHub Classroom auf Classroom 50 ======
Diese Seite beschreibt, was beim Umstieg einer bestehenden Klasse zu tun ist.
Ein neues Klassenzimmer von Grund auf: [[.:einrichtung|Einrichtung]].
Solange beide Wege parallel installiert sind, laufen bei **jedem Push zwei
Autograder** nebeneinander — der alte scheitert dabei am Moodle-Aufruf. Die
Migration ist erst mit Schritt 2 abgeschlossen.
===== Was sich ändert =====
^ ^ vorher ^ nachher ^
| Bewertung ausgelöst von | ''.github/workflows/classroom.yml'' im Studi-Repo | zentralem ''autograde-runner.yaml'' |
| Bewertungs-Logik | ''BZZ-Commons/pygrader'' | ''BZZ-Commons/pygrader50'', per Tag gepinnt |
| Moodle-Übertrag | direkt aus dem Studi-Repo | nachts, zentral aus dem Config-Repo |
| Moodle-Token | in der Org, per ''secrets: inherit'' überall lesbar | nur im Config-Repo |
| Zuordnung zu Moodle | GitHub-Name im Moodle-Profil | Moodle-Benutzername = GitHub-Login |
| Konfigurationsdateien | ''.github/autograding/'' | Bundle im Config-Repo, ''.github/autograding/'' bleibt Fallback |
Die drei Dateien ''unittests.json'', ''lint.json'' und ''pylintrc'' behalten ihr
Format. Es ist **kein** Umschreiben der Aufgaben nötig.
===== 1. Klassen-Default setzen =====
Erst wenn ''/autograder.py'' im Config-Repo liegt, bewertet
Classroom 50 überhaupt etwas — vorher liefert es überall ''0/0''.
Ablauf und Prüfungen: [[.:einrichtung|Einrichtung, Schritt 2]].
===== 2. Alten Workflow entfernen =====
==== 2.1 Was raus muss ====
''.github/workflows/classroom.yml''. Zwei Jobs stecken darin:
^ Job ^ Was damit passiert ^
| ''grading'' | ruft den alten pygrader-Workflow — ersetzt durch Classroom 50 |
| ''copy-issues'' | läuft nur unter ''if: contains(github.actor, ''classroom'')'', also nur beim GitHub-Classroom-Bot; unter Classroom 50 feuert er nie |
Ein separates ''copyissues.yml'' mit ''workflow_dispatch'' macht dasselbe
manuell. Beim Löschen von ''classroom.yml'' geht also **keine Funktion
verloren**.
==== 2.2 Was bleiben muss ====
''.github/autograding/'' mit ''unittests.json'', ''lint.json'' und ''pylintrc''
— das ist der Fallback, solange nicht jede Aufgabe ein Bundle im Config-Repo
hat.
''requirements.txt'' und Hilfsskripte wie ''_run_pylint.py'' stören die
Bewertung nicht: pygrader50 installiert die Studi-Abhängigkeiten bewusst nicht.
Für die lokale Arbeit der Lernenden zählt die Datei trotzdem, deshalb hält sie
ein eigenes Skript aktuell — siehe
[[.:cli#scriptssync-template-pinspy_pins_aktualisieren|sync-template-pins.py]].
==== 2.3 Die Zielliste richtig bilden ====
**Nicht** die Repos der Template-Organisation auflisten. Dort liegen auch
Templates von Modulen, die noch auf dem alten Pfad laufen — ihnen den Workflow
zu nehmen, stoppt dort **still** die Bewertung.
Massgeblich ist der ''template''-Block in ''/assignments.json'':
gh api repos//classroom50/contents//assignments.json \
-H 'Accept: application/vnd.github.raw' \
| jq -r '.assignments[] | "\(.template.owner)/\(.template.repo)"' | sort -u
==== 2.4 Ausführen ====
scripts/remove-legacy-classroom-yml.sh # Trockenlauf
scripts/remove-legacy-classroom-yml.sh --apply # löschen
Das Skript nimmt die Liste aus 2.3 und ergänzt die bereits angenommenen
Studi-Repos. Es ist wiederholbar; fehlende Dateien meldet es als ''absent''.
**Template-Änderungen erreichen bestehende Repos nicht.** Ein Studi-Repo trägt
seine Kopie aus dem Moment der Annahme — deshalb behandelt das Skript beide
Seiten. Umgekehrt sind Repos früherer Klassen, die dasselbe Template benutzt
haben, von der Template-Änderung nicht betroffen.
===== 3. Alten Moodle-Token entwerten =====
**Sicherheitsrelevant.** Der alte Workflow reichte den Moodle-Token per
''secrets: inherit'' an den Bewertungs-Workflow weiter. Jede Person mit
Schreibrecht auf ein Studi-Repo konnte ihn mit drei Zeilen auslesen — und der
Token kann Noten für beliebige Personen setzen.
- Secret in **allen** betroffenen Organisationen löschen — typischerweise die Studi-Org //und// die Template-Org. Namen prüfen: es gibt ''MOODLE_TOKEN'' und ''MOODLE_TOKEN2''.
- Den Token **in Moodle neu erzeugen und den alten invalidieren.** Löschen allein beendet nur die künftige Exposition, nicht die vergangene.
gh secret list --org
===== 4. Moodle-Seite umstellen =====
Unter GitHub Classroom trugen die Lernenden ihren GitHub-Namen im Moodle-Profil
ein. Classroom 50 vergleicht stattdessen direkt **Moodle-Benutzername und
GitHub-Login**. Vor dem ersten echten Übertrag prüfen, ob das für alle
Teilnehmenden zutrifft.
Der Rest — Aktivität //External Assignment//, Slug als Name, Token im
Config-Repo — steht unter [[.:moodle|Noten nach Moodle übertragen]].
===== 5. Prüfen, dass wirklich umgestellt ist =====
* In einem Studi-Repo pushen: Es startet **genau ein** Bewertungslauf.
* Das Release zeigt eine echte Punktzahl, nicht ''0/0''.
* ''gh secret list --org '' listet keinen Moodle-Token mehr.
* Ein ''moodle-sync''-Trockenlauf zeigt die erwarteten Personen und Punkte.