Documentation Index
Fetch the complete documentation index at: https://docs.devin.ai/llms.txt
Use this file to discover all available pages before exploring further.
Die Devin-API ist ein leistungsstarkes Tool. Bitte lies den folgenden Artikel, bevor du mit dieser Anleitung fortfährst.
-
Pull Request wird eröffnet: Ein Pull Request (PR) mit Änderungen wird im Repository eingereicht, die Probleme enthalten können, die von einem Code-Scanning-Tool identifiziert wurden.
-
GitLab Action wird ausgelöst: Das Öffnen des PR löst automatisch einen GitHub-Action-Workflow aus.
-
GitLab Action ruft Devin API auf: Die GitHub Action sendet eine Anfrage an die Devin API und übergibt die identifizierten Probleme zur automatisierten Behebung.
-
Devin-Session wird initialisiert: Eine Devin-Session wird gestartet, erhält den Kontext des Problems und versucht, es auf Grundlage der bereitgestellten Daten zu lösen.
-
Devin schlägt PR zur Überprüfung durch Personen vor: Sobald das Problem behoben ist, erzeugt Devin einen PR mit den vorgeschlagenen Änderungen und reicht ihn zur Überprüfung durch Personen ein.
2. Schritte zur Umsetzung
- GitLab-Umgebung zur Speicherung der erforderlichen Secrets konfigurieren:
- Richten Sie die GitLab-Umgebung so ein, dass die notwendigen Secrets wie Authentifizierungstoken und Konfigurationsschlüssel sicher gespeichert werden, um mit Devins API und anderen integrierten Tools zu interagieren.
Sobald diese Schritte abgeschlossen sind, ist Ihre Pipeline bereit, Probleme automatisch mithilfe von Devins API zu lösen, wodurch der Prozess beschleunigt und der Bedarf an manuellen Eingriffen reduziert wird.
- Die Integration testen
Sobald Ihr Setup abgeschlossen ist, können Sie die Integration testen, indem Sie eine GitLab Action manuell auslösen. Dadurch können Sie überprüfen, ob die Action die Devin API korrekt aufruft und die identifizierten Probleme löst.
- Devin Sessions-Seite anzeigen
Nachdem der GitLab Build ausgelöst wurde und Devin die Probleme verarbeitet hat, können Sie den Status und die Ergebnisse auf der Devin Sessions-Seite einsehen. Diese Seite bietet detaillierte Einblicke in die gelösten Probleme und die vorgeschlagenen Änderungen.
Wie bereits erwähnt, sind die benötigten Werte von SonarQube:
Um die Integration zu konfigurieren, müssen Sie die folgenden drei Werte von Ihrer
SonarQube-Instanz abrufen:
Sie benötigen drei_Werte von SonarQube: {SONAR_TOKEN, SONAR_ORG, SONAR_PROJECT_KEY}
Sobald Sie alle erforderlichen Werte haben, können Sie die GitLab Action konfigurieren.
Dies setzt voraus, dass Sie eine lokale SonarCloud-Properties-Datei sonar-project.properties haben, die Folgendes angibt:sonar.projectKey={PROJECT_KEY}
sonar.sources=FILE_PATH (in der Regel ".")
Die GitLab Action hat den folgenden Quellcode
stages:
- analyze
- remediate
variables:
SONAR_TOKEN: "$SONAR_TOKEN"
SONAR_ORG: "$SONAR_ORG"
SONAR_PROJECT_KEY: "Colhodm_juice-shop"
DEVIN_API_KEY: "$DEVIN_API_KEY"
GIT_STRATEGY: clone
analyze:
stage: analyze
image: sonarsource/sonar-scanner-cli:latest
script:
- sonar-scanner -Dsonar.organization=$SONAR_ORG
only:
- branches
- merge_requests
setup_python:
stage: remediate
image: python:3.9
before_script:
- python --version
- pip install aiohttp
script:
- git config --global user.name "GitLab Runner"
- git config --global user.email "runner@gitlab.com"
- python3 $CI_PROJECT_DIR/.gitlab/scripts/devin_remediation.py
only:
- branches
- merge_requests
Zur Erinnerung: devin_remediation.py sieht folgendermaßen aus:
python
import asyncio
import aiohttp
import os
from datetime import datetime
# Umgebungsvariablen
GITHUB_REPOSITORY = os.getenv("GITHUB_REPOSITORY")
SONAR_TOKEN = os.getenv("SONAR_TOKEN")
DEVIN_API_KEY = os.getenv("DEVIN_API_KEY")
SONAR_ORG = os.getenv("SONAR_ORG")
SONAR_PROJECT_KEY = os.getenv("SONAR_PROJECT_KEY")
DEVIN_API_BASE = "https://api.devin.ai/v1"
async def get_sonarcloud_issues():
"""Ruft offene Schwachstellen von SonarCloud ab."""
url = "https://sonarcloud.io/api/issues/search"
headers = {"Authorization": f"Bearer {SONAR_TOKEN}"}
params = {
"organization": SONAR_ORG,
"projectKeys": SONAR_PROJECT_KEY,
"types": "VULNERABILITY",
"statuses": "OPEN"
}
async with aiohttp.ClientSession() as session:
async with session.get(url, headers=headers, params=params) as response:
if response.status != 200:
print(f"Fehler beim Abrufen der SonarCloud-Issues: {await response.text()}")
return []
result = await response.json()
print(f"{len(result.get('issues', []))} Issues gefunden")
return result.get('issues', [])
async def delegate_task_to_devin(issue):
"""Delegiert die gesamte Aufgabe (Beheben, Committen und Pushen) an Devin AI."""
async with aiohttp.ClientSession() as session:
headers = {"Authorization": f"Bearer {DEVIN_API_KEY}"}
prompt = f"""
Behebe die folgende Schwachstelle in {GITHUB_REPOSITORY}: {issue['message']} in Datei {issue['component']}.
1. Erstelle einen neuen Branch mit dem Namen 'devin/{issue['key']}-fix-vulnerability'.
2. Implementiere die Behebung.
3. Schreibe eine detaillierte Commit-Nachricht, die die Änderungen erklärt:
- Issue Key: {issue['key']}
- Component: {issue['component']}
- Fixed by Devin AI at {datetime.now().isoformat()}
- Include 'Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>'.
4. Pushe den Branch in das Remote-Repository.
5. Öffne einen Pull Request mit einer Beschreibung der Behebung.
"""
data = {"prompt": prompt, "idempotent": True}
async with session.post(f"{DEVIN_API_BASE}/sessions", json=data, headers=headers) as response:
if response.status != 200:
print(f"Fehler beim Delegieren der Aufgabe an Devin: {await response.text()}")
return None
result = await response.json()
print(f"Devin-Session erstellt: {result}")
return result
async def monitor_devin_session(session_id):
"""Überwacht den Fortschritt von Devin, bis die Aufgabe abgeschlossen ist."""
async with aiohttp.ClientSession() as session:
headers = {"Authorization": f"Bearer {DEVIN_API_KEY}"}
while True:
async with session.get(f"{DEVIN_API_BASE}/sessions/{session_id}", headers=headers) as response:
if response.status != 200:
print(f"Fehler beim Überwachen der Devin-Session: {await response.text()}")
return None
result = await response.json()
status = result.get("status_enum")
if status in ["completed", "stopped"]:
print(f"Devin hat die Aufgabe abgeschlossen: {result}")
return result
elif status == "blocked":
print("Devin ist auf ein Problem gestoßen. Bitte manuell prüfen.")
return None
await asyncio.sleep(5)
async def main():
try:
issues = await get_sonarcloud_issues()
for issue in issues:
print(f"Issue wird verarbeitet: {issue['key']}")
# Aufgabe an Devin AI delegieren
session_data = await delegate_task_to_devin(issue)
if session_data:
session_id = session_data["session_id"]
# Fortschritt von Devin überwachen
await monitor_devin_session(session_id)
except Exception as e:
print(f"Fehler aufgetreten: {str(e)}")
raise
if __name__ == "__main__":
asyncio.run(main())
Um sicherzustellen, dass die GitLab-Action die richtigen Umgebungsvariablen setzt, fügen Sie sie zu den GitLab CI/CD Secrets hinzu.
Die Navigation zu den richtigen Einstellungen kann knifflig sein. Gehen Sie zu Settings und bearbeiten Sie Secrets. Fügen Sie SONAR_TOKEN und DEVINS_API unter Repository Secrets hinzu.
Wenn Sie selbstgehostetes GitLab verwenden, besteht der einzige Unterschied darin:
Sobald alles konfiguriert ist, können Sie Ihre laufende GitLab-Action überwachen. Wenn sie erfolgreich ausgeführt wird, sieht sie wie folgt aus:
Sie können Devin-Sitzungen im Session Manager einsehen.
Sobald der Vorgang abgeschlossen ist, öffnet Devin automatisch Pull Requests. Für GitLab-Benutzer:innen siehe den verlinkten Leitfaden.