Skip to main content
Die Devin-API ist ein leistungsstarkes Tool. Bitte lies den folgenden Artikel, bevor du mit dieser Anleitung fortfährst.

1. Prozessübersicht

  1. 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.
  2. GitLab Action wird ausgelöst: Das Öffnen des PR löst automatisch einen GitHub-Action-Workflow aus.
  3. GitLab Action ruft Devin API auf: Die GitHub Action sendet eine Anfrage an die Devin API und übergibt die identifizierten Probleme zur automatisierten Behebung.
  4. 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.
  5. 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

  1. 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.
  1. 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.
  1. 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 "[email protected]"
    - 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.
SonarQube
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:
SonarQube
Sie können Devin-Sitzungen im Session Manager einsehen.
SonarQube
Sobald der Vorgang abgeschlossen ist, öffnet Devin automatisch Pull Requests. Weitere Informationen für GitLab-Nutzer finden Sie im verlinkten Leitfaden.