====== Das classroom50-Repository ====== Jede Klasse hat ein privates Repository ''/classroom50''. Es ist die **einzige** Konfigurationsquelle des Klassenzimmers: Aufgaben, Klassenliste, Autograder, Resultate und die Workflows liegen dort. Angelegt wird es von ''gh teacher classroom add''. ===== Aufbau ===== classroom50/ ├── .github/workflows/ │ ├── autograde-runner.yaml ← zentraler Reusable Workflow (von gh teacher) │ ├── publish-pages.yaml ← stellt Autograder und Bundles auf GitHub Pages │ ├── collect-scores.yaml ← sammelt nachts alle Releases ein │ └── moodle-sync.yaml ← BZZ-eigen: Übertrag nach Moodle └── / ← ein Ordner pro Klassenzimmer ├── classroom.json ← Kurzname und Stammdaten ├── assignments.json ← alle Aufgaben, Templates, Termine ├── roster.csv ← Klassenliste (Anzeigedaten) ├── autograder.py ← Klassen-Default: startet pygrader50 ├── autograders// ← optional: Bewertungs-Bundle je Aufgabe ├── scores.json ← eingesammelte Resultate └── moodle-state.json ← was schon nach Moodle übertragen wurde Ein Repository kann **mehrere** Klassenzimmer enthalten — je einen Ordner. Der Ordnername ist der Kurzname aus ''classroom.json'' und muss nicht dem Organisationsnamen entsprechen. ===== Die Pages-Site ===== ''publish-pages'' veröffentlicht Teile des Repos unter ''https://.github.io/classroom50/''. Von dort holt der Runner bei jeder Abgabe: ^ Datei ^ URL ^ | Klassen-Default | ''https://.github.io/classroom50//autograder.py'' | | Bewertungs-Bundle | ''https://.github.io/classroom50//autograders/.tar.gz'' | | Aufgabenliste | ''https://.github.io/classroom50//assignments.json'' | Das Klassen-Segment im Pfad ist Pflicht. ''…/classroom50/autograder.py'' **ohne** ''/'' liefert 404. Nach einem Push dauert der Deploy rund 30 Sekunden. ===== Wie eine Abgabe bewertet wird ===== Im Studi-Repo liegt ''.github/workflows/autograde-runner.yaml''. Die Datei wird beim Anlegen des Repos eingesetzt und ruft nur den **zentralen** Reusable Workflow des Config-Repos auf. Der Lauf wird übersprungen, wenn die Commit-Message ''CLASSROOM 50'' oder ''NOACTION'' enthält. - Der ''setup''-Job liest ''.classroom50.yaml'' aus dem Studi-Repo und den passenden Eintrag aus ''assignments.json'' der Pages-Site. - Der ''grade''-Job holt ''runner.py'' von der Pages-Site und startet es. - ''runner.py'' lädt ''autograders/.tar.gz'' und sucht dann in dieser Reihenfolge: aufgaben-eigenes ''autograder.py'' → aufgaben-eigene ''tests.json'' → ''/autograder.py'' → 0/0. - An der BZZ greift der dritte Punkt: ''/autograder.py'' installiert [[https://github.com/BZZ-Commons/pygrader50|pygrader50]] in gepinnter Version und startet es im Studi-Checkout. - ''runner.py'' liest danach ''result.json'', validiert es und publiziert Release und Commit-Status. Der alte Weg über ''BZZ-Commons/pygrader'' und ''py_autograding.yml'' ist abgelöst. Wer ihn noch in einem Repo findet, siehe [[.:classroom50:migration|Migration von GitHub Classroom]]. ===== Bewertungs-Konfiguration ===== Die drei Dateien ''unittests.json'', ''lint.json'' und ''pylintrc'' können entweder im Studi-Repo unter ''.github/autograding/'' liegen (Fallback aus der GitHub-Classroom-Zeit) oder manipulationssicher als Bundle im Config-Repo unter ''/autograders//''. Details und Vorrangregeln: [[.:classroom50:bewertung|Wie bewertet wird]]. ===== Sicherheit ===== Der Moodle-Token liegt **nur** hier, nicht in der Studi-Organisation. Der Bewertungs-Job bekommt gar keine Secrets: ''autograde-runner.yaml'' deklariert in seinem ''workflow_call:''-Block nur ''outputs:''. Der Job ist ausdrücklich **keine** Isolationsgrenze gegen selbst hinzugefügte Studi-Workflows — alles Vertrauliche gehört deshalb ins Config-Repo. ===== Weiter ===== * [[.:classroom50:start|Überblick Classroom 50]] * [[.:classroom50:lehrpersonen|Klassenzimmer und Aufgaben verwalten]] * [[.:classroom50:einrichtung|Ein Klassenzimmer einrichten]] * [[.:template|Template-Repositories]]