homepage/CONTRIBUTING.md

127 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Entwickler-Dokumentation
## Struktur
Das Projekt läuft mit dem Static-Site-Generator [Eleventy](https://www.11ty.dev/).
Anders als bei anderen Eleventy-Projekten liegt hier aber nicht nur einen Internetauftritt, sondern mehrere.
Alle teilen sich gemeinsames CSS, CGI-Skripte und noch ein paar andere Geschichten.
Sie unterscheiden sich nur durch die konkreten Inhalte.
Du solltest nach dem Auschecken (oder in der Online-GUI) folgende Ordnerstruktur vorfinden:
- **assets/** Hilfsdateien für alle Auftritte. Dieser Ordner ist später unter `/assets` per HTTP verfügbar. Alles, was in diesem Ordner liegt, wird 1:1 kopiert.
- **cgi-bin/** CGI-Skripte liegen hier. Diese sind zwar für alle Auftritte verfügbar, sind aber nicht überall genutzt. Diese Skripte werden auch nicht direkt von außen aufgerufen. Stattdessen schreibt der HTTP-Server relevante Anfragen um.
- **includes/** Layout und Template-Dateien. Siehe dazu die [Eleventy-Dokumentation](https://www.11ty.dev/docs/config/#directory-for-includes).
- **nix/** [Nix](https://nixos.org/)-spezifisches. Wahrscheinlich musst du hier nichts tun.
- **playground/** Das ist die Spielwiese. Wenn du irgendetwas ausprobieren möchtest, was grob zum Projekt passt, aber sonst keinen Platz in der Ordnerstruktur hat, leg es hier ab.
- **sites/** Hier bekommt jeder Internetauftritt einen eigenen Unterordner.
- **<name>/**
- **\_static/** Statischer Inhalt, der nur für diesen Auftritt gedacht ist. Inhalte in diesem Ordner werden ohne Änderungen später live verfügbar sein.
- **assets/** Hilfsdateien für diesen Auftritt. Diese sind später unter `/assets` per HTTP verfügbar.
- **\_data/** [Globale Datendateien](https://www.11ty.dev/docs/data-global/) für Eleventy. Hier sind Metadaten zu dem Internetauftritt gespeichert.
- **\_images/** Hier sind Bilder gespeichert, die vor der Liveschaltung nochmals angepasst werden. Dazu gehört Beispiel die automatisierte Konvertierung in verschiedene Formate.
- **httpd.conf** Konfigurationsdatei für den HTTP-Server [lighttpd](https://redmine.lighttpd.net/projects/lighttpd/wiki#Documentation). Diese bestimmt die finale Auslieferung der Seite
- _Alles andere_ in diesem Ordner sind Inhalte für die eigentliche Homepage.
- **styles/** [SCSS](https://sass-lang.com/)-Dateien. Alles, was hier nicht mit einem Unterstrich beginnt, ist später in `/assets/css` verfügbar.
- **.eleventy.js** [Eleventy-Konfigurationsdatei](https://www.11ty.dev/docs/config/). Unsere Config ist so aufgesetzt, dass die entsprechend eingestellte Seite (siehe unten) geladen wird.
- **.eleventyignore** Ignore-Datei für Eleventy. Diese enthält Pfade, die beim Bauen der Seite ignoriert werden.
## Lokale Entwicklung
Um das Projekt lokal zu bauen, musst du zunächst [Node](https://nodejs.org) sowie [git](https://git-scm.com/) installieren.
Dann kannst du das Repository klonen (stelle sicher, dass ein SSH Schlüssel in deinem Codeberg-Account [hinterlegt](https://docs.codeberg.org/security/ssh-key/) ist):
```shell
git clone git@codeberg.org:angestoepselt/homepage.git
```
Dann führst du im Ordner des Projekts (`cd homepage`) folgenden Befehl aus:
```shell
npm install
```
Das installiert sämtliche zur Entwicklung benötigten Abhängigkeiten.
Evtl. dauert das ein paar Minutenhol dir ruhig einen Kaffee!
Du kannst `npm install` ruhig alle paar Wochen mal ausführen, um auf dem aktuellen Stand zu bleiben.
Anschließend kompilierst du die CSS-Dateien, damit du später nicht nur eine weiße Textwand zu sehen bekommst:
```shell
npm run build:styles
```
Wenn du allerdings explizit an den CSS-Dateien arbeiten willst, solltest du stattdessen `dev:styles` ausführen.
Solange der Prozess läuft, werden die Stylesheets stets neu kompiliert, wenn du sie veränderst.
Jetzt kannst du die eigentliche Webseite starten.
Dazu musst du zunächst den Namen des Unterordners von **sites/** notieren, der zu der Webseite passt, an der du arbeiten möchtest.
Diesen Namen schreibst du in die Umgebungsvariable `SITE`.
Anschließend kannst du den Server starten.
Hier beispielhaft für die Angestöpselt-Seite:
```shell
# Unter Linux / Mac:
export SITE=angestoepselt
# Oder in der PowerShell (Windows):
$Env:SITE='angestoepselt'
# Und dann im Anschluss:
npm run dev:site
```
## Deployment
Der `main`-Zweig wird automatisch durch unseren [CI-Server](https://drone.z31.it) deployt.
Das bedeutet: **alles, was auf `main` ist, ist live**!
Hier sind die jeweiligen URLs:
- Angestöpselt: [angestoepselt.de](https://angestoepselt.de/)
- CoderDojo: [coderdojo-wue.de](https://coderdojo-wue.de/)
Das Deployment funktioniert via [Portainer](https://portainer.pub.z31.it).
Verwendet wird dazu die [docker-compose.yml](https://codeberg.org/angestoepselt/homepage/src/branch/main/docker-compose.yml) aus diesem Repository.
### Konfiguration
Damit das Docker-Deployment (auch lokal) funktioniert, müssen ein paar Umgebungsvariablen gesetzt sein.
Hier sind sie, zusammen mit ihren Standards:
- `ZAMMAD_URL=https://ticket.z31.it` Basis-URL der Zammad-Instanz, die durch die Kontaktformulare befüllt wird.
- `ZAMMAD_GROUP=""` Ist diese Variable gesetzt (das ist sie in der Staging-Umgebung), landen alle Kontaktformular-Einträge in dieser Zammad-Gruppe. Standardmäßig (wenn dieser Wert leer ist) werden sie je nach Thema in die korrekte Gruppe einsortiert.
- `ZAMMAD_TOKEN` API-Schlüssel zur Zammad-Instanz. Dieser Schlüssel muss die `ticket.agent`-Berechtigung haben.
- `HCAPTCHA_SITE_KEY` Quasi-öffentlicher Schlüssel zum [Einbinden von hCaptcha](https://docs.hcaptcha.com/#add-the-hcaptcha-widget-to-your-webpage).
- `HCAPTCHA_SECRET_KEY` Geheimer Schlüssel für die [Serverseitige Kontrolle der hCaptcha-Antworten](https://docs.hcaptcha.com/#verify-the-user-response-server-side).
Die letzten drei sind pflicht.
Wenn du das Image lokal bauen möchtest, musst du das [Argument](https://docs.docker.com/build/guide/build-args/) `SITE` mitgeben, genau wie bei der lokalen Entwicklung.
## Staging-Umgebung
Wir haben für die beiden großen Seiten jeweils eine Staging-Umgebung:
- Angestöpselt: [csw.stage.angestoepselt.de](https://csw.stage.angestoepselt.de/)
- CoderDojo: [coderdojo.stage.angestoepselt.de](https://coderdojo.stage.angestoepselt.de/)
Die Staging-Umgebung **zeigt immer auf die zeitlich neuste Änderung aus allen nicht-`main`-Zweigen**.
Wenn mehrere Personen gleichzeitig an unterschiedlichen Zweigen arbeiten wird die Staging-Umgebung immer das zeigen, was als letztes gepusht wurde.
Natürlich ist das nicht ganz ideal, aber für unsere aktuelle Entwicklungsfrequenz dürfte das reichen.
## Workflow für Änderungen
Wenn du deine Änderungen gerne online stellen möchtest, musst du einen [Pull-Request](https://docs.codeberg.org/collaborating/pull-requests-and-git-flow/) einreichen.
Ein Pull-Request bündelt deine Änderungen, sodass sie jemand vom Homepage-Team anschauen, genehmigen und einpflegen kann.
Wenn du deine Änderungen über das Webinterface von Codeberg erstellst, wählst du beim Bearbeiten einer Datei im *Änderungen Commiten*-Dialog die Option "Einen neuen Branch für diesen Commit erstellen und einen Pull Request starten".
Wenn du anschließend in den Pull-Request noch eine weitere Änderung aufnehmen möchtest, sucher [hier](https://codeberg.org/angestoepselt/homepage/branches) deinen entsprechenden Branch und wähle ab der zweiten Bearbeitung in dem erwähnten Dialog "Direkt in den Branch `...` einchecken".
Wenn du Mitglied des [Homepage](https://codeberg.org/org/angestoepselt/teams/homepage)-Teams auf Codeberg bist, kannst du ohne Forken direkt auf unserem Repository arbeiten.
Dann kannst du auch die Staging-Umgebung verwenden (siehe oben).
Falls du gerne Mitglied werden willst, melde dich bitte bei [Matthias](https://codeberg.org/matti) oder [Yannik](https://codeberg.org/yrd).
Du kannst auch hier im Projekt ein Issue erstellen.
Du kannst so viele Pull-Requests gleichzeitig erstellen wie du magst (musst also nicht warten, bis der erste genehmigt ist).
Bitte erstelle einen neuen PR für jedes "Thema" das du anschneidest.
Aktuell kümmern sich [Matthias](https://codeberg.org/matti) und [Yannik](https://codeberg.org/yrd) um das Zusammenführen der PRs.