Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| howto:git:classroom50:moodle [2026/08/14 11:14] – angelegt kmaurizi | howto:git:classroom50:moodle [2026/08/25 10:06] (aktuell) – Veraltet - Inhalt jetzt unter github.com/BZZ-Commons/pygrader50/docs admin | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== Classroom 50: Noten nach Moodle übertragen ====== | ||
| - | |||
| - | Der Übertrag läuft **zentral** aus dem '' | ||
| - | **nachts**, nicht bei jedem Push. | ||
| - | |||
| - | ===== Warum zentral und nachts ===== | ||
| - | |||
| - | Der Moodle-Webservice-Token kann Noten für **beliebige Personen** setzen. In | ||
| - | einem Studi-Repo liest ihn ein selbst hinzugefügter Workflow in drei Zeilen aus. | ||
| - | Genau so lief es unter GitHub Classroom ('' | ||
| - | '' | ||
| - | |||
| - | Technisch geht es unter Classroom 50 auch gar nicht anders: Der zentrale | ||
| - | Reusable Workflow '' | ||
| - | reicht **keine Secrets** an den Bewertungs-Job durch. | ||
| - | |||
| - | Nachts statt bei jedem Push, weil der direkte Weg einen Token in jedem | ||
| - | Studi-Repo, eine eigene Workflow-Datei je Repo, eine nachgebaute Skip-Logik und | ||
| - | rund 33 % mehr Actions-Minuten gekostet hätte — und ein Nacht-Fallback wäre | ||
| - | trotzdem nötig gewesen. | ||
| - | |||
| - | ===== Voraussetzungen auf der Moodle-Seite ===== | ||
| - | |||
| - | - Eine Aktivität vom Typ **External Assignment** ('' | ||
| - | - Ihr Name ist **exakt der Slug** der Aufgabe, z.B. '' | ||
| - | - Der **Moodle-Benutzername entspricht dem GitHub-Login** der lernenden Person. | ||
| - | - Die Person ist im Kurs eingeschrieben. | ||
| - | |||
| - | <WRAP center round important 90%> | ||
| - | '' | ||
| - | zwingend, dass die Aktivität fehlt. Das Plugin löst '' | ||
| - | gemeinsam auf und meldet denselben Text, wenn nur der **Benutzer** im Kurs | ||
| - | fehlt. Zum Testen deshalb einen echten Studi-Login nehmen — der eigene | ||
| - | Lehrer-Account ist im Kurs meist kein Teilnehmer. | ||
| - | </ | ||
| - | |||
| - | ===== Zugangsdaten ===== | ||
| - | |||
| - | Im **classroom50-Repo**, | ||
| - | |||
| - | ^ Art ^ Name ^ Wert ^ | ||
| - | | Secret | '' | ||
| - | | Variable | '' | ||
| - | | Variable | '' | ||
| - | |||
| - | <code bash> | ||
| - | gh secret | ||
| - | gh variable set MOODLE_URL | ||
| - | </ | ||
| - | |||
| - | Für den Token einen **eigenen Webservice-Benutzer** anlegen, der nur diese eine | ||
| - | Funktion darf. Je enger die Rechte, desto kleiner der Schaden bei einem Leck. | ||
| - | |||
| - | ===== Was übertragen wird ===== | ||
| - | |||
| - | Je Kombination aus Aufgabe und Person geht die **neueste** Abgabe raus. | ||
| - | |||
| - | ^ Moodle-Feld ^ Quelle ^ | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | |||
| - | ===== Zeitplan ===== | ||
| - | |||
| - | ^ Job ^ Zeit ^ Was er tut ^ | ||
| - | | '' | ||
| - | | '' | ||
| - | |||
| - | 40 Minuten Abstand, damit '' | ||
| - | |||
| - | Ein Zustandsfile ''< | ||
| - | übertragen wurde. Übersprungen wird nur, wenn Abgabe **und** Punktzahl | ||
| - | identisch sind — eine Nachbewertung derselben Abgabe geht also erneut raus. | ||
| - | |||
| - | ===== Von Hand auslösen ===== | ||
| - | |||
| - | Im classroom50-Repo unter **Actions → Moodle Sync → Run workflow**. | ||
| - | Eingaben: Klassenzimmer, | ||
| - | '' | ||
| - | mit einer '' | ||
| - | |||
| - | <code bash> | ||
| - | gh workflow run moodle-sync.yaml --repo < | ||
| - | -f classroom=< | ||
| - | </ | ||
| - | |||
| - | Trockenlauf-Ausgabe: | ||
| - | |||
| - | < | ||
| - | Moodle-Übertrag: | ||
| - | [dry-run] < | ||
| - | [dry-run] < | ||
| - | übertragen: | ||
| - | </ | ||
| - | |||
| - | ===== Lokal prüfen, ohne Zugangsdaten ===== | ||
| - | |||
| - | <code bash> | ||
| - | gh api repos/< | ||
| - | -H ' | ||
| - | GH_TOKEN=$(gh auth token) python -m pygrader50.moodle scores.json --dry-run | ||
| - | </ | ||
| - | |||
| - | Alle Optionen: [[.: | ||
| - | |||
| - | ===== Probleme ===== | ||
| - | |||
| - | ^ Meldung / Symptom ^ Ursache ^ | ||
| - | | '' | ||
| - | | '' | ||
| - | | Note kommt nicht an, Log sagt „unverändert" | ||
| - | | Nachtlauf jede Nacht rot, immer dieselbe Person | Karteileichen-Eintrag in '' | ||