Form to Wipe — GitHub Actions Deployment
Dieses Handbuch behandelt die GitHub Actions-Implementierung von Form to Wipe. Jede Löschanfrage ist ein Pull Request. Branch-Schutzregeln erzwingen, dass der Anfragender seinen eigenen PR nicht zusammenführen kann. Wenn ein Genehmiger ihn zusammenführt, führt der Workflow den Löschbefehl aus und postet Ergebnisse als PR-Kommentar. Die gesamte Historie befindet sich in Git — dauerhaft, durchsuchbar und fälschungssicher. Keine Infrastruktur erforderlich.
Funktionsweise
1. Anfragender öffnet ein Issue mithilfe der Wipe Request-Vorlage
2. Anfragender erstellt einen Branch und PR, der auf das Issue verweist
3. Ein Kollege (nicht der Anfragender) überprüft und führt den PR zusammen
4. GitHub Actions läuft: analysiert PR-Body, löst Geräte-IDs auf, sendet Löschbefehle
5. Ergebnisse werden als PR-Kommentar gepostet
6. Der zusammengeführte PR ist Ihr Audit-Log
Voraussetzungen
- GitHub-Repository (öffentlich oder privat mit Actions-Minuten)
- Jamf Platform API OAuth2-Client mit Löschberechtigungen (siehe Form to Wipe)
- Ein designiertes Genehmiger-Team in Ihrer GitHub-Organisation
Setup
Schritt 1 — Repository forken oder klonen
git clone https://github.com/YOUR_ORG/FTW-Form-to-Wipe.git
cd FTW-Form-to-Wipe
Oder kopieren Sie den Inhalt des Verzeichnisses github-workflow/ in Ihr Repository-Root.
Schritt 2 — Repository-Geheimnisse
Gehen Sie zu Settings → Secrets and variables → Actions → New repository secret und fügen Sie hinzu:
| Secret | Wert |
|---|---|
JAMF_CLIENT_ID |
Ihre Jamf Platform API-Client-ID |
JAMF_CLIENT_SECRET |
Ihr Jamf Platform API-Client-Secret |
JAMF_TOKEN_URL |
Token-Endpoint, z.B. https://YOUR_INSTANCE.jamfcloud.com/api/oauth/token |
JAMF_REGION |
us, eu oder apac — bestimmt das API Gateway URL-Präfix |
GitHub-Geheimnisse werden niemals in Workflow-Ausgabe protokolliert oder offengelegt. Das zur Laufzeit abgerufene Token wird über add-mask maskiert.
Schritt 3 — Branch-Schutzregeln
Dies ist der kritischste Schritt. Branch-Schutz ist es, was erzwingt, dass niemand seine eigene Löschanfrage genehmigen kann.
Gehen Sie zu Settings → Branches → Add branch protection rule
Branch-Name-Muster:
main(oder Ihr Standard-Branch)Aktivieren Sie die folgenden Einstellungen:
Einstellung Erforderlich Require a pull request before merging ✅ Require approvals — auf 1 gesetzt ✅ Dismiss stale reviews when new commits are pushed ✅ Require review from Code Owners Empfohlen Restrict who can dismiss pull request reviews Empfohlen Do not allow bypassing the above settings ✅ Kritisch
"Do not allow bypassing" verhindert, dass Repository-Admins ihre eigenen Anfragen zusammenführen. Ohne diese Einstellung können Admins die Genehmigung vollständig umgehen.
Schritt 4 — CODEOWNERS (Empfohlen)
Erstellen Sie .github/CODEOWNERS, um eine Überprüfung durch ein bestimmtes Team für jede Datei im Verzeichnis requests/ zu erfordern:
# .github/CODEOWNERS
requests/ @your-org/jamf-admins
Dies bedeutet, dass jeder PR, der requests/ berührt, automatisch eine Überprüfung vom Team jamf-admins erfordert. Mitglieder des Teams können immer noch nicht ihre eigenen PRs genehmigen.
Schritt 5 — Anfrageverzeichnis erstellen
mkdir requests
echo "# Wipe Requests\n\nMerged PRs in this directory represent executed device wipes." > requests/README.md
git add requests/
git commit -m "Add requests directory"
git push
Der Workflow wird bei pull_request → closed-Ereignissen für jeden PR ausgelöst, der requests/**.md berührt.
Einreichen einer Löschanfrage
Als Anfragender
Öffnen Sie ein Issue mithilfe der Device Wipe Request-Vorlage. Füllen Sie alle Felder genau wie beschriftet aus. Beachten Sie die Issue-Nummer (z.B.
#42).Erstellen Sie einen Branch:
git checkout -b wipe/issue-42-device-wipeErstellen Sie die Anfragedatei:
cat > requests/wipe-$(date +%Y%m%d-%H%M%S).md << 'EOF' **Tenant Name:** Production **Tenant ID:** aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee **Device Type:** computer **Device IDs:** 42,87 **Reason:** Employee offboarding — devices not returned **Find My PIN:** EOF git add requests/ git commit -m "Wipe request for devices 42, 87 - fixes #42" git push -u origin wipe/issue-42-device-wipeÖffnen Sie einen Pull Request — Titel:
Device Wipe Request — fixes #42. Fordern Sie eine Überprüfung von einem Kollegen an.
Als Genehmiger
- Überprüfen Sie den PR — verifizieren Sie, dass die Geräte-IDs und der Grund legitim sind
- Bestätigen Sie, dass Sie nicht der PR-Autor sind (GitHub erzwingt dies, aber überprüfen Sie)
- Genehmigen und Führen zusammen, indem Sie einen Merge-Commit verwenden (nicht Squash, nicht Rebase — Merge-Commit bewahrt die vollständige Historie)
- Der Workflow wird automatisch beim Zusammenführen ausgeführt
- Überprüfen Sie die PR-Kommentare auf Ergebnisse
Audit-Trail
Jeder zusammengeführte Löschanfrage-PR ist ein permanenter Audit-Datensatz, der Folgendes enthält:
| Feld | Quelle |
|---|---|
| Wer angefordert hat | PR-Autor |
| Wer genehmigt hat | Zusammengeführt von |
| Welche Geräte | PR-Body / Anfragedatei |
| Welcher Tenant | PR-Body |
| Wann genehmigt | Zeitstempel zusammenführen |
| Ergebnis | Workflow PR-Kommentar |
So durchsuchen Sie frühere Löschungen:
# Liste alle zusammengeführten Wipe-PRs nach Label auf
gh pr list --label wipe-request --state merged
# Nach Geräte-ID suchen
gh pr list --state merged --search "device 42"
Sicherheitsüberlegungen
- Jamf Platform API-Credentials live als Repository-Geheimnisse — niemals in Workflow-Code oder Request-Bodies
- Branch-Schutz verhindert Selbstgenehmigung auf der Plattformebene
CODEOWNERSstellt sicher, dass nur designierte Admins Löschanfragen genehmigen können- Der Workflow überprüft Anfragender ≠ Genehmiger zur Laufzeit als zweite Kontrolle
- Workflow-Ergebnis-Kommentare werden dem PR angehängt und können nach der Tatsache nicht geändert werden
- Das Verzeichnis
requests/sammelt einen permanenten, unveränderlichen Datensatz jeder ausgeführten Löschung
Einschränkungen vs. n8n
| Feature | GitHub Actions | n8n |
|---|---|---|
| Oberfläche | GitHub Issue + PR | Slack-Modal |
| Real-time-Genehmigungs-UX | ⚠️ Async PR-Review | ✅ Slack DM |
| Genehmigungs-Timeout | ❌ Manuelle Schließung | ✅ Konfigurierbar |
| Audit-Trail | ✅ Git-Verlauf (unveränderlich) | Slack-Kanal |
| Erforderliche Infrastruktur | Keine | n8n-Instanz |
| Multi-Tenant | ✅ Pro Anfragedatei | ✅ Pro Dropdown |
| Kosten | Kostenlos (öffentlich) / Actions-Minuten | n8n-Lizenz |