Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 64 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: CI

on:
push:
branches: [main]
pull_request:

jobs:
spdx-header:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check SPDX headers
run: |
fehlend=$(find packages template -type f ! -empty \( -name '*.py' -o -name '*.ts' -o -name '*.tsx' -o -name '*.css' \) \
! -path '*/node_modules/*' ! -path '*/migrations/*' ! -path '*/dist/*' \
-exec grep -L 'SPDX-License-Identifier: Apache-2.0' {} +) || true
if [ -n "$fehlend" ]; then
echo "Dateien ohne SPDX-Header:"
echo "$fehlend"
exit 1
fi
echo "SPDX-Header vollständig."

integrations-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install --quiet ./packages/django/basicbar-integrations
- run: cd packages/django/basicbar-integrations && python runtests.py

auth-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install --quiet ./packages/django/basicbar-auth
- run: cd packages/django/basicbar-auth && python runtests.py

lti-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install --quiet ./packages/django/basicbar-lti
- run: cd packages/django/basicbar-lti && python runtests.py

ui-build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "22"
- run: cd packages/ui && npm ci --no-fund --no-audit
- run: cd packages/ui && npm run build
- run: cd packages/ui && npx tsc --noEmit
49 changes: 49 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
name: Publish ui package

# Django packages need no publish step: GitHub's tag-archive tarball URLs
# (https://github.com/virtUOS/basicbar/archive/refs/tags/<pkg>/vX.Y.Z.tar.gz)
# are public and reachable as soon as the tag is pushed.
#
# @basicbar/ui is packed with `npm pack` and attached as a GitHub Release
# asset — a plain public tarball URL, no npm registry/account/token needed
# (same rationale as the GitLab Generic Package Registry before the move).

on:
push:
tags:
- "ui/v*"

permissions:
contents: write

jobs:
ui-publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: "22"

- name: Verify tag matches package.json version
run: |
VERSION="${GITHUB_REF_NAME#ui/v}"
PKG_VERSION="$(node -p "require('./packages/ui/package.json').version")"
if [ "$VERSION" != "$PKG_VERSION" ]; then
echo "Tag $GITHUB_REF_NAME ≠ package.json-Version $PKG_VERSION"; exit 1
fi
echo "VERSION=$VERSION" >> "$GITHUB_ENV"

- run: cd packages/ui && npm ci --no-fund --no-audit
- run: cd packages/ui && npm run build
- run: cd packages/ui && npm pack

- name: Attach tarball to GitHub Release
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release create "$GITHUB_REF_NAME" \
"packages/ui/basicbar-ui-$VERSION.tgz" \
--title "$GITHUB_REF_NAME" \
--notes "Siehe CHANGELOG.md für Migrationsschritte."
75 changes: 0 additions & 75 deletions .gitlab-ci.yml

This file was deleted.

23 changes: 14 additions & 9 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@

Gemeinsame Basis der virtUOS „-bar“-Tools (ausleihbar, abstimmbar,
erkennbar, …): **vier versionierte Pakete + ein Copier-Template**, kein
lauffähiges Produkt. Konsumenten sind die Tool-Repos daneben in
`~/dev/<tool>` bzw. `virtuos/digitale-dienste/<tool>`.
lauffähiges Produkt. Konsumenten sind die Tool-Repos daneben in `~/dev/<tool>`
— teils noch auf der Uni-GitLab (`virtuos/digitale-dienste/<tool>`), teils
öffentlich auf GitHub (z. B. `virtUOS/abstimmbar`). basicbar selbst liegt seit
2026-08-04 auf `github.com/virtUOS/basicbar` (ADR-0004), u. a. damit
GitHub-Actions-Runner öffentlicher „-bar“-Tools die Pakete erreichen können.

## Layout

Expand Down Expand Up @@ -41,15 +44,17 @@ pipx run copier copy . /tmp/probe --trust --defaults --vcs-ref HEAD --data proje

## Workflow & Releases

- **Branch + MR, nie direkt auf main** (main ist geschützt); der Mensch merged.
- **Branch + PR, nie direkt auf main** (main ist geschützt); der Mensch merged.
- Release eines Pakets: Version in `pyproject.toml`/`package.json` heben,
`CHANGELOG.md`-Eintrag **mit Migrationsschritten für die Tools**, MR.
`CHANGELOG.md`-Eintrag **mit Migrationsschritten für die Tools**, PR.
**Tag `<paket>/vX.Y.Z` erst nach dem Merge** auf den main-Commit setzen
(sonst zeigt er auf verwaiste Commits). Beim Tag `ui/v*` published die CI
den npm-Tarball in die Generic Package Registry; die Django-Pakete werden
von den Tools direkt als GitLab-Archiv-Tarball vom Tag installiert
(`/-/archive/<tag>/…#subdirectory=…` — Repo ist deshalb öffentlich).
- Nach dem Paket-Release: Konsumenten-MRs in den Tools (Version bumpen,
(sonst zeigt er auf verwaiste Commits). Beim Tag `ui/v*` packt die CI
`@basicbar/ui` per `npm pack` und hängt den Tarball als GitHub-Release-Asset
an; die Django-Pakete werden von den Tools direkt als GitHub-Archiv-Tarball
vom Tag installiert (`/archive/refs/tags/<tag>.tar.gz#subdirectory=…` — Repo
ist deshalb öffentlich). Details/Gründe des Hosts:
[ADR-0004](docs/ADR/0004-umzug-nach-github.md).
- Nach dem Paket-Release: Konsumenten-PRs in den Tools (Version bumpen,
Migrationsschritte aus dem Changelog ausführen, Suite + Build grün).

## Konventionen
Expand Down
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Basicbar

Die gemeinsame Basis der virtUOS „-bar“-Tools ([ausleihBAR](https://gitlab.uni-osnabrueck.de/virtuos/digitale-dienste/ausleihbar),
[abstimmBAR](https://gitlab.uni-osnabrueck.de/virtuos/digitale-dienste/abstimmbar),
[abstimmBAR](https://github.com/virtUOS/abstimmbar),
[erkennBAR](https://gitlab.uni-osnabrueck.de/virtuos/digitale-dienste/erkennbar), …).

Dieses Repo ist **kein lauffähiges Produkt**, sondern liefert zwei Dinge:
Expand Down Expand Up @@ -32,7 +32,7 @@ Details und Begründungen: [docs/ADR/](docs/ADR/) · Historie und Vorgehen:
## Neues Tool erzeugen

```bash
pipx run copier copy --vcs-ref HEAD https://gitlab.uni-osnabrueck.de/virtuos/digitale-dienste/basicbar.git mein-tool
pipx run copier copy --vcs-ref HEAD https://github.com/virtUOS/basicbar.git mein-tool
cd mein-tool
git init -b main && git add -A && git commit -m "Gerüst aus basicbar-Template"
docker compose up -d
Expand All @@ -53,14 +53,14 @@ Release-Eintrag nennt die Migrationsschritte.
Git-Tag, ohne Registry und ohne git im Docker-Image:

```
basicbar-auth @ https://…/basicbar/-/archive/auth/v0.1.0/basicbar-auth-v0.1.0.tar.gz#subdirectory=packages/django/basicbar-auth
basicbar-auth @ https://github.com/virtUOS/basicbar/archive/refs/tags/auth/v0.1.0.tar.gz#subdirectory=packages/django/basicbar-auth
```

- **`@basicbar/ui`** (`frontend/package.json`) — npm-Tarball aus der GitLab
Generic Package Registry (die CI published beim Tag `ui/vX.Y.Z`):
- **`@basicbar/ui`** (`frontend/package.json`) — Tarball-URL auf ein GitHub
Release (die CI hängt den Tarball beim Tag `ui/vX.Y.Z` als Release-Asset an):

```
"@basicbar/ui": "https://…/api/v4/projects/1511/packages/generic/ui/0.2.1/basicbar-ui-0.2.1.tgz"
"@basicbar/ui": "https://github.com/virtUOS/basicbar/releases/download/ui/v0.2.1/basicbar-ui-0.2.1.tgz"
```

- **Projektgerüst** (compose, Caddy, CI, config, App-Shell) —
Expand All @@ -78,11 +78,11 @@ sind Paket-Features.

## An der Basis mitarbeiten

- Branch + MR (main ist geschützt); CI: SPDX-Header-Check, Testsuiten aller
- Branch + PR (main ist geschützt); CI: SPDX-Header-Check, Testsuiten aller
drei Django-Pakete, UI-Build, Tag-Publish.
- Paket-Tests lokal: `cd packages/django/<paket> && python runtests.py` ·
UI: `cd packages/ui && npm install && npm run build && npx tsc --noEmit`.
- Release: Version heben, CHANGELOG-Eintrag mit Migrationsschritten, MR;
- Release: Version heben, CHANGELOG-Eintrag mit Migrationsschritten, PR;
**nach dem Merge** Tag `<paket>/vX.Y.Z` auf `main` setzen.
- **Rule of Two:** Extrahiert wird nur, was mindestens zwei Tools konkret
brauchen und eines erprobt hat. Fachlogik und konkrete User-Models bleiben
Expand Down
2 changes: 1 addition & 1 deletion copier.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Copier-Template der virtUOS "-bar"-Tools (Basicbar Phase 6).
# Neues Tool erzeugen:
# pipx run copier copy https://gitlab.uni-osnabrueck.de/virtuos/digitale-dienste/basicbar.git mein-tool
# pipx run copier copy https://github.com/virtUOS/basicbar.git mein-tool
# Später Template-Updates einspielen: `pipx run copier update` im Projekt.

_subdirectory: template/project
Expand Down
24 changes: 16 additions & 8 deletions docs/ADR/0002-versionierung-und-sync.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,19 @@ passieren.

- **SemVer pro Paket**, Git-Tags im Schema `<paket>/vX.Y.Z`
(z. B. `integrations/v1.2.0`, `ui/v0.3.1`).
- **pip-Pakete: als GitLab-Archiv-Tarball vom Tag**, kein Registry-Betrieb und
- **pip-Pakete: als Git-Archiv-Tarball vom Tag**, kein Registry-Betrieb und
kein ``git`` im Docker-Image nötig (Entscheidung 2026-07-19: Repo ist dafür
öffentlich, damit Docker-Builds ohne Credentials installieren):
`basicbar-integrations @ https://gitlab.uni-osnabrueck.de/virtuos/digitale-dienste/basicbar/-/archive/integrations/v0.1.0/basicbar-integrations-v0.1.0.tar.gz#subdirectory=packages/django/basicbar-integrations`
- **npm-Paket: GitLab Package Registry** des basicbar-Projekts (npm kann —
anders als pip — nicht aus einem Unterverzeichnis eines Git-Repos
installieren). Publish per CI-Job beim Taggen von `ui/vX.Y.Z`.
`basicbar-integrations @ https://github.com/virtUOS/basicbar/archive/refs/tags/integrations/v0.1.0.tar.gz#subdirectory=packages/django/basicbar-integrations`
(ursprünglich als GitLab-Archiv-Tarball, seit dem Umzug auf GitHub — siehe
[ADR-0004](0004-umzug-nach-github.md) — als GitHub-Archiv-Tarball, gleiches
Prinzip).
- **npm-Paket: GitHub Release Asset** (npm kann — anders als pip — nicht aus
einem Unterverzeichnis eines Git-Repos installieren, und ein öffentliches
Release-Asset braucht wie die Django-Tarballs keine Registry/Credentials).
Publish per CI-Job beim Taggen von `ui/vX.Y.Z`.
- **Template:** Copier arbeitet direkt gegen das Git-Repo
(`copier copy gl:virtuos/digitale-dienste/basicbar …`); `copier update`
(`copier copy https://github.com/virtUOS/basicbar.git …`); `copier update`
nutzt die im Projekt hinterlegte Template-Version (`.copier-answers.yml`).
- **Changelog als Upgrade-Vertrag:** Jeder Release-Eintrag im CHANGELOG.md
nennt nötige Migrationsschritte der Tools. Breaking Change ⇒ Major-Bump.
Expand All @@ -37,6 +41,10 @@ passieren.

- Kein Auto-Update: Tools können Versionen unterschiedlich lange fahren;
divergierende Optik zwischen Releases ist akzeptiert und gewollt reversibel.
- Die GitLab-npm-Registry braucht einmalig ein Deploy-Token/CI-Setup (Phase 3).
- Sollte die Paketzahl oder Release-Frequenz stark wachsen, kann später auf
die GitLab-PyPI-Registry umgestellt werden, ohne die Tags zu ändern.
eine PyPI-/npm-Registry umgestellt werden, ohne die Tags zu ändern.

**Update 2026-08-04:** Repo-Host von GitLab auf GitHub gewechselt (Details und
Gründe: [ADR-0004](0004-umzug-nach-github.md)); die Distributionsmechanik
(Archiv-Tarball für pip, Release-Asset für npm) bleibt unverändert, nur die
URLs zeigen jetzt auf `github.com/virtUOS/basicbar`.
67 changes: 67 additions & 0 deletions docs/ADR/0004-umzug-nach-github.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# ADR-0004: Umzug von GitLab nach GitHub

Status: angenommen (2026-08-04)

## Kontext

basicbar lag bislang auf der internen Uni-Osnabrück-GitLab-Instanz
(`gitlab.uni-osnabrueck.de`), öffentlich sichtbar, damit Tools die
Django-Pakete als Archiv-Tarball ohne Credentials installieren können
(ADR-0002). Das reicht für Tools, die selbst auf derselben Instanz liegen
oder zumindest aus dem Uni-Netz/per VPN bauen.

abstimmBAR ist als erstes „-bar“-Tool zusätzlich öffentlich auf GitHub
gespiegelt (`github.com/virtUOS/abstimmbar`) und baut sein Release-Image über
GitHub Actions auf GitHub-gehosteten Runnern. Diese Runner haben keinen
Netzwerkzugriff auf `gitlab.uni-osnabrueck.de` — das ist keine
Auth-/Sichtbarkeitsfrage (das Projekt war bereits public), sondern schlicht
Netzwerk-Nichterreichbarkeit von außerhalb des Uni-Netzes
(„Network is unreachable“, kein 401/404). Der Image-Build schlug entsprechend
beim `pip install` der basicbar-Pakete fehl.

Zusätzlich: Ziel ist, Beiträge auch von anderen Hochschulen zu ermöglichen —
das setzt einen für Externe leicht auffindbaren, ohne Uni-Zugang nutzbaren
Ort voraus.

## Entscheidung

**basicbar zieht vollständig nach `github.com/virtUOS/basicbar` um** (nicht
nur eine Paket-Spiegelung). Historie und alle Paket-Tags wurden per
`git push --mirror` übernommen. GitHub ist ab sofort der kanonische Ort für
Quelle, Issues/PRs und Releases.

Damit einher:

- **CI**: `.gitlab-ci.yml` durch `.github/workflows/ci.yml` (SPDX-Check,
Paket-Tests, UI-Build) und `.github/workflows/publish.yml`
(Release-Publish bei `ui/v*`-Tags) ersetzt.
- **Django-Pakete**: weiterhin Archiv-Tarball vom Tag, jetzt von
`github.com/virtUOS/basicbar/archive/refs/tags/<tag>.tar.gz` statt vom
GitLab-Pendant — gleiches Prinzip, andere URL.
- **`@basicbar/ui`**: statt GitLab Generic Package Registry jetzt ein
GitHub-Release-Asset (`npm pack` in der CI, Upload als Release-Anhang beim
`ui/v*`-Tag). Bewusst **kein** öffentlicher npm-Registry-Publish — das hätte
ein `@basicbar`-npm-Scope, ein Account und ein Token samt Rotation
gebraucht; ein Release-Asset ist wie der Django-Tarball eine reine
öffentliche URL ohne Registry-Betrieb oder Credentials.
- **Copier-Template**: Quelle für `copier copy`/`copier update` ist jetzt
`https://github.com/virtUOS/basicbar.git`.
- **Workflow-Sprache**: „Branch + MR“ → „Branch + PR“ (siehe CLAUDE.md).

Für andere zukünftige öffentliche „-bar“-Tools ist das derselbe,
wiederverwendbare Distributionsweg — kein Sonderfall nur für abstimmBAR.

## Konsequenzen

- Die alte GitLab-Instanz war der einzige kanonische Ort; ob das
GitLab-Projekt archiviert oder gelöscht wird, ist eine
Hosting-/Policy-Entscheidung der Uni und nicht Teil dieser ADR.
- Interne „-bar“-Tools, die noch auf der Uni-GitLab liegen (z. B.
ausleihBAR, erkennBAR) und die alten GitLab-Archiv-URLs referenzieren,
brauchen eigene Folge-MRs, um auf die neuen GitHub-URLs umzustellen. Ihr CI
läuft weiter auf der Uni-GitLab-Instanz; das ist unproblematisch, solange
ausgehende Verbindungen zu github.com von dort erlaubt sind (in aller Regel
der Fall, anders als der umgekehrte Weg).
- Kein Registry-Betrieb für `@basicbar/ui` nötig, dafür kein `npm view`/keine
Semver-Ranges für Konsumenten — Tarball-URL muss bei jedem Update exakt
gehoben werden (wie schon zuvor bei der GitLab Generic Package Registry).
Loading
Loading