feat: self-hosted LLM backend — point all workflows at the Jetson (Ollama, model=coder)

The Jetson Orin Nano (JetPack 7.2, Ollama on GPU) is live, so ci-ai runs fully
self-hosted: no Anthropic key, no cloud, no per-PR cost. AI_PROVIDER=ollama,
AI_BASE_URL=http://192.168.178.103:11434/v1. The Pi runner reaches it LAN-direct
(SNAT to .48, allowed by the Jetson UFW). Removed the dead ANTHROPIC_API_KEY
secret declarations.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-12 21:58:07 +02:00
parent eb0437b0ed
commit 2ae14a51e4
7 changed files with 26 additions and 40 deletions

View File

@@ -7,14 +7,11 @@
# secrets: inherit # secrets: inherit
# #
# Voraussetzungen: globaler Runner `eulernest`, anon-Clone für public Repos. # Voraussetzungen: globaler Runner `eulernest`, anon-Clone für public Repos.
# Ohne ANTHROPIC_API_KEY überspringt das Skript den KI-Schritt sauber (Job grün). # KI-Backend = Jetson-Ollama (self-hosted, LAN-direkt). Kein Secret nötig.
name: ci-ai · review (reusable) name: ci-ai · review (reusable)
on: on:
workflow_call: workflow_call: {}
secrets:
ANTHROPIC_API_KEY:
required: false
jobs: jobs:
review: review:
@@ -31,9 +28,9 @@ jobs:
- name: KI-Review (überspringt sauber ohne Key) - name: KI-Review (überspringt sauber ohne Key)
env: env:
AI_PROVIDER: anthropic AI_PROVIDER: ollama
AI_MODEL: claude-3-5-haiku-latest AI_MODEL: coder
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} AI_BASE_URL: http://192.168.178.103:11434/v1
GITEA_TOKEN: ${{ github.token }} GITEA_TOKEN: ${{ github.token }}
GITEA_API: https://git.eulernest.eu/api/v1 GITEA_API: https://git.eulernest.eu/api/v1
run: python /opt/ci-ai/scripts/ai_review.py run: python /opt/ci-ai/scripts/ai_review.py

View File

@@ -11,10 +11,7 @@
name: ci-ai · commands (reusable) name: ci-ai · commands (reusable)
on: on:
workflow_call: workflow_call: {}
secrets:
ANTHROPIC_API_KEY:
required: false
jobs: jobs:
command: command:
@@ -23,9 +20,9 @@ jobs:
image: python:3.12-slim image: python:3.12-slim
options: "--memory=512m --memory-swap=768m" options: "--memory=512m --memory-swap=768m"
env: env:
AI_PROVIDER: anthropic AI_PROVIDER: ollama
AI_MODEL: claude-3-5-haiku-latest AI_MODEL: coder
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} AI_BASE_URL: http://192.168.178.103:11434/v1
GITEA_TOKEN: ${{ github.token }} GITEA_TOKEN: ${{ github.token }}
GITEA_API: https://git.eulernest.eu/api/v1 GITEA_API: https://git.eulernest.eu/api/v1
steps: steps:

View File

@@ -8,17 +8,14 @@
# Voraussetzungen (einmalig zentral): # Voraussetzungen (einmalig zentral):
# - Runner instanzweit registriert (Label `eulernest`) # - Runner instanzweit registriert (Label `eulernest`)
# - anonymer Clone für public Repos erlaubt (für den ci-ai-Clone) # - anonymer Clone für public Repos erlaubt (für den ci-ai-Clone)
# - optional ANTHROPIC_API_KEY als Org-/Instanz-Secret (für die KI-Erklärung) # - KI-Backend = Jetson-Ollama (self-hosted, LAN); kein Secret nötig
# #
# python:3.12-slim (Debian: bash) + Memory-Cap (Pi). ⚠ ARM64-Binaries. # python:3.12-slim (Debian: bash) + Memory-Cap (Pi). ⚠ ARM64-Binaries.
# Gitleaks (Secrets) + Trivy config (IaC) — hart blockierend über den Gate-Schritt. # Gitleaks (Secrets) + Trivy config (IaC) — hart blockierend über den Gate-Schritt.
name: ci-ai · security (reusable) name: ci-ai · security (reusable)
on: on:
workflow_call: workflow_call: {}
secrets:
ANTHROPIC_API_KEY:
required: false
env: env:
GITLEAKS_VERSION: "8.18.4" GITLEAKS_VERSION: "8.18.4"
@@ -74,9 +71,9 @@ jobs:
if: failure() if: failure()
continue-on-error: true continue-on-error: true
env: env:
AI_PROVIDER: anthropic AI_PROVIDER: ollama
AI_MODEL: claude-3-5-haiku-latest AI_MODEL: coder
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} AI_BASE_URL: http://192.168.178.103:11434/v1
GITEA_TOKEN: ${{ github.token }} GITEA_TOKEN: ${{ github.token }}
GITEA_API: https://git.eulernest.eu/api/v1 GITEA_API: https://git.eulernest.eu/api/v1
run: | run: |

View File

@@ -3,7 +3,7 @@
# Läuft auf dem Pi-Runner (capacity 1, ~3-4 GB RAM) -> Memory-Cap + schlankes # Läuft auf dem Pi-Runner (capacity 1, ~3-4 GB RAM) -> Memory-Cap + schlankes
# python-Image. KEINE JS-Actions (kein node nötig): ci-ai wird manuell geklont, # python-Image. KEINE JS-Actions (kein node nötig): ci-ai wird manuell geklont,
# git.eulernest.eu löst per Runner-add-host auf die LAN-IP auf. Ohne # git.eulernest.eu löst per Runner-add-host auf die LAN-IP auf. Ohne
# ANTHROPIC_API_KEY überspringt das Skript den KI-Schritt sauber (Job bleibt grün). # Das KI-Backend ist die Jetson-Ollama (self-hosted, LAN-direkt, kein Key).
name: AI PR Review name: AI PR Review
on: on:
@@ -26,15 +26,10 @@ jobs:
- name: KI-Review (überspringt sauber ohne Key) - name: KI-Review (überspringt sauber ohne Key)
env: env:
AI_PROVIDER: anthropic AI_PROVIDER: ollama
AI_MODEL: claude-3-5-haiku-latest AI_MODEL: coder
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} AI_BASE_URL: http://192.168.178.103:11434/v1
GITEA_TOKEN: ${{ github.token }} GITEA_TOKEN: ${{ github.token }}
GITEA_API: https://git.eulernest.eu/api/v1 GITEA_API: https://git.eulernest.eu/api/v1
run: python /opt/ci-ai/scripts/ai_review.py run: python /opt/ci-ai/scripts/ai_review.py
# Jetson-Umstieg später (kein Code-Change, nur diese env):
# AI_PROVIDER: ollama
# AI_MODEL: qwen-light
# AI_BASE_URL: http://192.168.178.20:11434/v1
# JETSON_API_KEY: ${{ secrets.JETSON_API_KEY }}

View File

@@ -12,8 +12,8 @@
# Voraussetzungen (einmalig zentral eingerichtet): # Voraussetzungen (einmalig zentral eingerichtet):
# 1. Runner instanzweit registriert (Label `eulernest`) # 1. Runner instanzweit registriert (Label `eulernest`)
# 2. anonymer Clone für public Repos erlaubt # 2. anonymer Clone für public Repos erlaubt
# 3. ANTHROPIC_API_KEY als Org-/Instanz-Actions-Secret (für die KI-Schritte; # 3. KI-Backend = Jetson-Ollama (LAN, self-hosted). Kein Secret nötig; die
# ohne ihn laufen die Scans, die KI-Teile überspringen sich sauber) # Jetson-UFW lässt den Pi-Runner (.48) an Port 11434. Modell: coder.
# 4. für „hart blockieren": den `security`-Check in der Branch-Protection # 4. für „hart blockieren": den `security`-Check in der Branch-Protection
# als required markieren # als required markieren
name: CI-AI name: CI-AI

View File

@@ -26,9 +26,9 @@
# run: apt-get update -qq && apt-get install -y -qq --no-install-recommends git ca-certificates # run: apt-get update -qq && apt-get install -y -qq --no-install-recommends git ca-certificates
# - name: KI-Analyse # - name: KI-Analyse
# env: # env:
# AI_PROVIDER: anthropic # AI_PROVIDER: ollama
# AI_MODEL: claude-3-5-haiku-latest # AI_MODEL: coder
# ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} # AI_BASE_URL: http://192.168.178.103:11434/v1
# GITEA_TOKEN: ${{ github.token }} # GITEA_TOKEN: ${{ github.token }}
# GITEA_API: https://git.eulernest.eu/api/v1 # GITEA_API: https://git.eulernest.eu/api/v1
# run: | # run: |

View File

@@ -53,9 +53,9 @@ jobs:
- name: KI erklärt die Funde (nur bei Fehler, überspringt ohne Key) - name: KI erklärt die Funde (nur bei Fehler, überspringt ohne Key)
if: failure() if: failure()
env: env:
AI_PROVIDER: anthropic AI_PROVIDER: ollama
AI_MODEL: claude-3-5-haiku-latest AI_MODEL: coder
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} AI_BASE_URL: http://192.168.178.103:11434/v1
GITEA_TOKEN: ${{ github.token }} GITEA_TOKEN: ${{ github.token }}
GITEA_API: https://git.eulernest.eu/api/v1 GITEA_API: https://git.eulernest.eu/api/v1
run: | run: |