JobCon ist eine leichtgewichtige, performante und Linux-native Deployment- und Execution-Engine für versionierte Jobs auf Zielservern.
Ursprünglich als moderner, schlanker Ersatz für das Talend Administration Center (TAC) / Job Conductor konzipiert, entwickelt sich JobCon kontinuierlich zu einer universellen Steuerzentrale für beliebige Batch-, ETL- und Hintergrundjobs (z. B. Talend, Python, Bash-Skripte oder native Linux-Binaries). Aktuell ist als Artefakt-Transportmittel primär Sonatype Nexus (Maven ZIP-Archive) angebunden; die modulare Struktur bereitet jedoch bereits den Weg für künftige Repository-Alternativen wie Git Releases vor.
- Single-Binary & Container-Ready: Entwickelt in reiner Go-Standardbibliothek + CGO-freiem SQLite (
modernc.org/sqlite). Keine Java-, Node- oder Python-Laufzeitabhängigkeiten auf dem JobCon-Host. - Entkopplung von Deployment & Execution:
- Deployment & Undeployment: Download aus Nexus, versionierte Ablage (
releases/{version}), atomares Umschalten des Symlinkscurrentsowie sauberes Undeployen/Entfernen von Zielservern. - Execution: Lokaler Start ohne TAC-Overhead via schlanke Starter-Skripte für JS7 / SOS JobScheduler, Cron oder über JobCon SSH-Runner.
- Deployment-Status: Direkte Visualisierung (grüner/grauer Statuspunkt), ob Jobs auf den Zielservern bereitgestellt sind.
- Deployment & Undeployment: Download aus Nexus, versionierte Ablage (
- Externe Zielserver-Skripte: Skripte (
jobcon_ctl.sh,run_job.sh) sind vollständig extern im Verzeichnis./scripts/ausgelagert und nicht im Binary fest einkompiliert. Sie können ad-hoc angepasst oder für alternative Job-Typen erweitert werden. - Multi-Job Steuerung (Bulk Actions):
- Komfortable Mehrfachauswahl via Klick, Shift+Klick (Bereich) und Strg/Cmd+Klick (Toggle) ganz ohne Checkboxen.
- Bulk-Aktionsleiste für Direktausführung (
▶ Startohne Modal-Popup), Deployment (🚀 Deploy) und Undeployment (🗑️ Undeploy). - Dedizierter „Details“-Button zum Öffnen des Sidepanels.
- Umgebungs-Kennzeichnung (Environment Badge): Konfigurierbare Anzeige der Umgebung (z. B.
DEV,TEST,PROD) inklusive Farbakzentstreifen im UI. - Mehrsprachigkeit (i18n): Native Unterstützung für Englisch und Deutsch, umschaltbar im Header und benutzerbezogen gespeichert.
- Umgebungsvariablen (.env): Automatisches Sourcing von
.env-Dateien auf Zielsystemen pro Server oder individuell pro Job. - Authentifizierung & Sicherheit:
- HTTP BasicAuth und Session-Cookies.
- Benutzerverwaltung mit
bcrypt-Passwort-Hashing. - Rollenbasiertes Rechtesystem (
admin,operator,viewer). - Vorbereitet für LDAP / Active Directory.
- Native TLS-Unterstützung oder Betrieb hinter Nginx/Traefik Reverse-Proxy.
- Echtzeit-Transparenz: Live-Streaming von
stdoutundstderrvia Server-Sent Events (SSE) in ein schlankes Web-Terminal. - CI/CD Integration (Jenkins): REST-API mit API-Bearer-Tokens und blockierender Ausführung (
?wait=true) als moderner MetaServlet-Ersatz. - Einstellungsdialog: Integrierte Web-UI zur Verwaltung von Benutzern, Execution-Servern (inkl. Live-SSH-Verbindungstest) und Systemparametern.
JobCon kann wahlweise via Docker Compose, als Systemd-Service auf Linux oder direkt als Single-Binary betrieben werden.
JobCon läuft in einem gehärteten Container basierend auf Debian 13 (Trixie Slim) unter dem Non-Root User jobcon (UID 1000).
-
Konfiguration vorbereiten:
cp config.example.yaml config.yaml
-
Container starten:
docker compose up -d
-
Logs einsehen:
docker compose logs -f
- Persistenz: Datenbank und Logs werden unter
./datagespeichert. - Externe Skripte: Das Verzeichnis
./scripts/ist als Volume gemountet. Änderungen an den Server-Skripten werden sofort ohne Container-Neubau wirksam!
Das Build-Skript erzeugt eine saubere, sofort verteilbare Distributionsstruktur:
make build
# oder: ./build.shDas erstellte Verzeichnis target/ enthält:
jobcon: Statisch gelinktes Linux-Binary.scripts/: Externe Zielserver-Skripte (jobcon_ctl.sh,run_job.sh).config.example.yaml: Beispiel-Konfiguration.jobcon.service: Systemd-Service-Unit für Linux/Debian.jobcon-linux-amd64.tar.gz/.zip: Distributionsarchive.
sudo cp -r target/* /opt/jobcon/
sudo useradd -r -s /bin/false -d /opt/jobcon jobcon || true
sudo chown -R jobcon:jobcon /opt/jobcon
sudo cp /opt/jobcon/jobcon.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now jobconDie Skripte für Zielserver liegen extern im Verzeichnis ./scripts/ und werden nicht in das Binary einkompiliert. Dadurch können sie jederzeit angepasst und um neue Job-Typen erweitert werden:
jobcon_ctl.sh(Universal-Controller auf dem Zielserver):- Deployt Releases nach
/opt/talend/jobs/{job_name}/releases/{version}. - Rotiert atomar die Symlinks (
current,current-1, etc.). - Bereinigt unverlinkte Versionen anhand der Retention-Policy.
- Bindet
.env-Dateien ein und startet den Job in einer eigenen Prozessgruppe (setsid).
- Deployt Releases nach
run_job.sh(Schlanker Starter für JS7 / SOS JobScheduler oder Cron):- Führt das jeweils aktive Release direkt lokal aus:
/opt/talend/scripts/run_job.sh <job_name> [optionale params...]
- Führt das jeweils aktive Release direkt lokal aus:
Beim Einrichten eines Servers über die Web-UI oder API lädt JobCon automatisch alle .sh-Skripte aus dem konfigurierten Skriptverzeichnis (./scripts) per SSH auf den Zielserver.
Alle API-Aufrufe erfordern Authentifizierung via Authorization: Bearer <TOKEN> oder HTTP BasicAuth.
| Methode | Endpunkt | Beschreibung |
|---|---|---|
GET |
/healthz |
Health-Check (ohne Auth) |
GET |
/api/v1/jobs |
Liste aller Jobs |
POST |
/api/v1/jobs |
Neuen Job anlegen (Admin) |
DELETE |
/api/v1/jobs/{id} |
Job löschen (optional ?undeploy=true) |
POST |
/api/v1/jobs/{id}/deploy |
Version auf Zielserver installieren |
POST |
/api/v1/jobs/{id}/undeploy |
Job vom Zielserver entfernen |
POST |
/api/v1/jobs/{id}/run |
Job starten (optional mit ?wait=true) |
POST |
/api/v1/jobs/bulk/run |
Mehrere Jobs gleichzeitig starten |
POST |
/api/v1/jobs/bulk/deploy |
Mehrere Jobs gleichzeitig deployen |
POST |
/api/v1/jobs/bulk/undeploy |
Mehrere Jobs gleichzeitig undeployen |
GET |
/api/v1/jobs/{id}/artifact |
Nexus Download-URL und Metadaten |
GET |
/api/v1/executions |
Ausführungshistorie |
GET |
/api/v1/executions/{id}/logs |
Logs als Plain-Text oder SSE |
POST |
/api/v1/executions/{id}/abort |
Laufende Ausführung abbrechen |
POST |
/api/v1/servers/{id}/test |
SSH-Verbindung zum Zielserver prüfen |
curl -X POST "http://jobcon:8080/api/v1/jobs/sync_sap/run?wait=true" \
-H "Authorization: Bearer ${JOBCON_TOKEN}" \
-H "Content-Type: application/json" \
-d '{"context": "Production", "params": {"batchSize": "1000"}}'- Binary kopieren:
sudo cp jobcon /usr/local/bin/ sudo chmod +x /usr/local/bin/jobcon
- Konfiguration anlegen:
sudo mkdir -p /etc/jobcon /var/lib/jobcon/data /var/lib/jobcon/logs sudo cp config.example.yaml /etc/jobcon/config.yaml
- Benutzer und Rechte:
sudo useradd -r -s /bin/false jobcon sudo chown -R jobcon:jobcon /var/lib/jobcon /etc/jobcon
- Service-Unit installieren:
sudo cp packaging/jobcon.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now jobcon
Dieses Projekt wurde mit Unterstützung von Künstlicher Intelligenz (KI) entwickelt.
Dieses Projekt ist unter der GNU General Public License v3.0 lizenziert.
