> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devinenterprise.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Nächtliche E2E-Tests in der Staging-Umgebung ausführen

export const UseCaseHero = ({title, description, prompt, category, features, devinUrl, agent, intent, playbookId, type}) => {
  const encodedPrompt = encodeURIComponent(prompt || '');
  const tag = 'docs-use-case-gallery';
  const utm = 'utm_source=docs&utm_medium=use-case-gallery&utm_campaign=hero-cta';
  const agentParams = (agent ? '&agent=' + agent : '') + (intent ? '&intent=' + intent : '') + (playbookId ? '&playbookId=' + playbookId : '');
  const devinHref = type === 'schedule' ? 'https://app.devin.ai/settings/schedules/create?' + utm + agentParams + (prompt ? '&prompt=' + encodedPrompt : '') : type === 'review' ? 'https://app.devin.ai/review?' + utm : agent === 'ada' ? 'https://app.devin.ai/search?' + utm + '&noSubmit=true' + (prompt ? '&prompt=' + encodedPrompt : '') : devinUrl ? devinUrl.includes('?') ? devinUrl + '&' + utm + agentParams : devinUrl + '?' + utm + agentParams : prompt ? 'https://app.devin.ai/?tags=' + tag + '&' + utm + agentParams + '&prompt=' + encodedPrompt : 'https://app.devin.ai/?' + utm + agentParams;
  const buttonLabel = type === 'schedule' ? 'Schedule in Devin ↗' : type === 'review' ? 'Set Up Devin Review ↗' : agent === 'advanced' ? 'Try in Devin ↗' : agent === 'dana' ? 'Try in Dana ↗' : agent === 'ada' ? 'Try in Ask Devin ↗' : 'Try in Devin ↗';
  const featureList = features ? features.split(',').map(f => f.trim()) : [];
  return <div className="uc-hero">
      <div className="uc-hero-inner">
        <div className="uc-hero-left">
          <h1 className="uc-hero-title">{title}</h1>
          <p className="uc-hero-desc">{description}</p>
          <div>
            <a href={devinHref} target="_blank" rel="noopener noreferrer" className="try-in-devin-btn">
              {buttonLabel}
            </a>
          </div>
        </div>
        <div className="uc-hero-meta">
          <div className="uc-meta-item">
            <span className="uc-meta-label">Author</span>
            <span className="uc-meta-value">Cognition</span>
          </div>
          <div className="uc-meta-item">
            <span className="uc-meta-label">Category</span>
            <span className="uc-meta-value">{category}</span>
          </div>
          {featureList.length > 0 && <div className="uc-meta-item">
              <span className="uc-meta-label">Features</span>
              <span className="uc-meta-value">{featureList.join(', ')}</span>
            </div>}
        </div>
      </div>
    </div>;
};

export const PromptBlock = ({children, type, agent, intent, playbookId}) => {
  var utm = 'utm_source=docs&utm_medium=use-case-gallery&utm_campaign=prompt-block';
  var tag = 'docs-use-case-gallery';
  var agentParams = (agent ? '&agent=' + agent : '') + (intent ? '&intent=' + intent : '') + (playbookId ? '&playbookId=' + playbookId : '');
  var label = type === 'schedule' ? 'Schedule in Devin' : type === 'playbook' ? 'Create Playbook' : type === 'knowledge' ? 'Add to Knowledge' : agent === 'advanced' ? 'Try in Devin' : agent === 'dana' ? 'Try in Dana' : agent === 'ada' ? 'Try in Ask Devin' : 'Try in Devin';
  var buildUrl = function (text) {
    var encoded = encodeURIComponent(text);
    if (type === 'schedule') return 'https://app.devin.ai/settings/schedules/create?' + utm + agentParams + '&prompt=' + encoded;
    if (type === 'playbook') return 'https://app.devin.ai/settings/playbooks/create?' + utm + '&body=' + encoded;
    if (type === 'knowledge') return 'https://app.devin.ai/knowledge?' + utm + '&body=' + encoded;
    if (agent === 'ada') return 'https://app.devin.ai/search?' + utm + '&noSubmit=true&prompt=' + encoded;
    return 'https://app.devin.ai/?tags=' + tag + '&' + utm + agentParams + '&prompt=' + encoded;
  };
  const ref = React.useRef(null);
  const [href, setHref] = React.useState('#');
  React.useEffect(() => {
    if (!ref.current) return;
    var codeEl = ref.current.querySelector('pre code');
    if (codeEl) {
      var text = codeEl.textContent.trim();
      if (text) setHref(buildUrl(text));
    }
    var header = ref.current.querySelector('[data-component-part="code-block-header"]');
    if (header && !header.querySelector('.prompt-block-devin-link')) {
      var link = document.createElement('a');
      link.href = href;
      link.target = '_blank';
      link.rel = 'noopener noreferrer';
      link.className = 'prompt-block-devin-link';
      link.style.cssText = 'display:inline-flex;align-items:center;gap:6px;text-decoration:none;color:#fff;font-size:11px;font-weight:500;padding:4px 10px;border-radius:6px;white-space:nowrap;background:#317CFF;transition:background 0.2s;margin-left:8px;';
      link.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg> ' + label;
      link.onmouseenter = function () {
        link.style.background = '#2968D9';
      };
      link.onmouseleave = function () {
        link.style.background = '#317CFF';
      };
      header.appendChild(link);
    }
    var existingLink = ref.current.querySelector('.prompt-block-devin-link');
    if (existingLink && href !== '#') existingLink.href = href;
  });
  return <div className="prompt-block" ref={ref}>{children}</div>;
};

<UseCaseHero title="Nächtliche E2E-Tests in der Staging-Umgebung ausführen" description="Plane Devin so ein, dass deine End-to-End-Test-Suite jede Nacht gegen die Staging-Umgebung läuft und Tickets für fehlgeschlagene Tests erstellt." prompt="Hilf mir, einen nächtlichen Devin-Zeitplan einzurichten, der unsere E2E-Test-Suite gegen die Staging-Umgebung ausführt. Folge der Anleitung unter https://docs.devin.ai/use-cases/gallery/api-scheduled-sessions und führe mich Schritt für Schritt durch jeden einzelnen Schritt: das Anlegen eines Service-Benutzerkontos, das Schreiben des Test-Playbooks und das Erstellen des Zeitplans über die API." category="Automatisierungen" features="API, Zeitpläne, Playbooks" />

<div className="uc-detail-wrapper">
  <Tip>Möchten Sie dies nicht manuell einrichten? Fügen Sie einen Link zu dieser Seite in eine Devin-Sitzung ein und bitten Sie Devin, alles für Sie einzurichten.</Tip>

  Diese Anleitung beschreibt die Verwaltung von Zeitplänen über die [v3 API](/de/api-reference/v3/overview), was für Automatisierungs- und Infrastructure-as-Code-Workflows nützlich ist. Sie können Zeitpläne auch direkt in der [Devin-Benutzeroberfläche](https://app.devin.ai/settings/schedules?utm_source=docs\&utm_medium=use-case-gallery) erstellen und verwalten – ganz ohne API-Einrichtung.

  <Steps>
    <Step title="Service-Benutzer für den API-Zugriff einrichten">
      Über die API erstellte geplante Sitzungen benötigen einen Service User mit den richtigen Berechtigungen. Sie richten ihn einmal ein und verwenden dann seinen API key in allen folgenden Aufrufen.

      1. Gehen Sie zu [app.devin.ai](https://app.devin.ai/?utm_source=docs\&utm_medium=use-case-gallery) > **Settings** > **Service Users** und klicken Sie auf **Create Service User**
      2. Weisen Sie eine Rolle zu, die die Berechtigung `ManageOrgSchedules` enthält
      3. Speichern Sie den nach der Erstellung angezeigten API key — er wird nur einmal angezeigt und Sie verwenden ihn als Ihren `Bearer`-Token

      Um Ihre **organization ID** zu erhalten, rufen Sie den Endpunkt [List Organizations](/de/api-reference/v3/organizations/enterprise-organizations) mit Ihrem Service-User-Token auf:

      ```bash theme={null}
      curl "https://api.devin.ai/v3/enterprise/organizations" \
        -H "Authorization: Bearer $DEVIN_API_KEY"
      ```

      Exportieren Sie beide Werte, damit die Befehle in dieser Anleitung wie angegeben funktionieren:

      ```bash theme={null}
      export DEVIN_API_KEY="sk-your-service-user-key"
      export ORG_ID="your-org-id"
      ```

      Weitere Informationen zu Servicebenutzern und Berechtigungen finden Sie in der [Dokumentation zur API-Authentifizierung](/de/api-reference/authentication).
    </Step>

    <Step title="Schreiben Sie ein Playbook für den Testlauf">
      Bevor Sie den Zeitplan erstellen, schreiben Sie ein [Playbook](/de/product-guides/creating-playbooks), das Devin genau vorgibt, wie Ihre E2E-Suite auszuführen ist und was anschließend mit den Ergebnissen zu tun ist. Gehen Sie zu [**Settings > Playbooks**](https://app.devin.ai/settings/playbooks?utm_source=docs\&utm_medium=use-case-gallery) und erstellen Sie ein neues Playbook – oder bitten Sie Devin, anhand einer Beschreibung Ihres Testworkflows eines für Sie zu generieren. Hier ist ein Beispiel für eine Playwright-Suite:

      <PromptBlock type="playbook">
        ```txt Nightly E2E test playbook theme={null}
        You are running the nightly E2E test suite for acme/web-app against staging.

        Steps:
        1. Run the Playwright E2E suite targeting staging:
           `PLAYWRIGHT_BASE_URL=https://staging.acme.dev npx playwright test --reporter=json`
        2. Parse the JSON results. For each failing test:
           - Create a Linear ticket in the "QA" team with:
             - Title: "[Nightly E2E] <test name>"
             - Description: the full error message, stack trace, and the test file path
             - Label: "nightly-e2e-failure"
             - Priority: High if the test is in tests/critical/*, otherwise Medium
           - Attach any failure screenshots from the Playwright report
        3. If all tests pass, post a summary to the #qa-results Slack channel:
           "Nightly E2E: all <N> tests passed against staging (<date>)"
        4. If any tests fail, post to #qa-results:
           "Nightly E2E: <N> of <total> tests failed — <count> Linear tickets created"
           Include a list of the failing test names.
        ```
      </PromptBlock>

      Notieren Sie sich die Playbook-ID nach dem Speichern – Sie benötigen sie für den API-Aufruf. Sie finden sie in der URL, wenn Sie das Playbook anzeigen (`app.devin.ai/.../playbooks/{playbook_id}`).

      <Tip>Installieren Sie die [Linear-Integration](/de/integrations/linear), damit Devin im Rahmen des Playbooks Tickets erstellen kann. Wenn Sie [den Zeitplan erstellen](https://app.devin.ai/settings/schedules/create?utm_source=docs\&utm_medium=use-case-gallery), können Sie außerdem einen **Slack-Channel** (z. B. `#qa-results`) festlegen, sodass Ihr Team automatisch benachrichtigt wird. Gewähren Sie Devin nur Lesezugriff auf die Secrets Ihrer Staging-Umgebung (Datenbank-URLs, API keys) über [organization secrets](/de/product-guides/secrets), falls Ihre Tests sie benötigen.</Tip>
    </Step>

    <Step title="Richten Sie den nächtlichen Zeitplan über die API ein">
      Verwenden Sie nun den Endpoint `POST /v3/organizations/{org_id}/schedules`, um den Zeitplan zu registrieren. In diesem Beispiel wird der Zeitplan jede Nacht um 2:00 Uhr UTC ausgeführt:

      ```bash theme={null}
      curl -X POST "https://api.devin.ai/v3/organizations/$ORG_ID/schedules" \
        -H "Authorization: Bearer $DEVIN_API_KEY" \
        -H "Content-Type: application/json" \
        -d '{
          "title": "Nightly E2E — staging",
          "prompt": "Run the nightly E2E test suite against staging. Follow the playbook exactly.",
          "schedule_type": "recurring",
          "frequency": "0 2 * * *",
          "playbook_id": "your-playbook-id"
        }'
      ```

      Die Antwort enthält eine `schedule_id`, die Sie später zur Verwaltung dieses Zeitplans verwenden. Speichern Sie sie:

      ```bash theme={null}
      export SCHEDULE_ID="a1b2c3d4-e5f6-7890-abcd-ef1234567890"  # aus der Antwort
      ```

      Das Feld `frequency` verwendet die Standard-Cron-Syntax. Einige nützliche Alternativen:

      | Pattern       | When it runs                      |
      | ------------- | --------------------------------- |
      | `0 2 * * *`   | Jeden Tag um 2 Uhr morgens UTC    |
      | `0 2 * * 1-5` | Nur an Wochentagen (Mo–Fr)        |
      | `0 6 * * 1`   | Jeden Montag um 6 Uhr morgens UTC |

      Warum 2 Uhr morgens? Sie möchten, dass Tests laufen, nachdem das letzte Deployment des Tages in der Staging-Umgebung stabil ist, aber früh genug, damit Fehler sichtbar sind, wenn Engineers mit der Arbeit beginnen. Passen Sie dies an die Zeitzone und Deployment-Frequenz Ihres Teams an.

      Siehe die [Dokumentation zum Create‑Schedule‑Endpoint](/de/api-reference/v3/schedules/post-organizations-schedules) für alle verfügbaren Felder.
    </Step>

    <Step title="Überprüfen Sie den ersten Lauf und verfeinern Sie den Prompt">
      Nachdem der Zeitplan das erste Mal ausgelöst wurde, überprüfe die Session, um sicherzustellen, dass Devin die Tests korrekt ausgeführt hat und die Ausgabe deinen Erwartungen entspricht.

      1. Öffne das Devin-Dashboard und suche die Session unter **Past Sessions** – sie ist mit dem Namen des Zeitplans getaggt.
      2. Wurde die Playwright-Suite ausgeführt? Wurden Linear-Tickets für tatsächliche Fehler (nicht für flaky Tests) erstellt?
      3. Überprüfe den `#qa-results` Slack-Channel auf die Zusammenfassungsnachricht.

      Häufige Probleme beim ersten Durchlauf und wie du sie behebst:

      * **Devin kann nicht auf Staging zugreifen**: Füge deine Staging-Umgebungsvariablen (wie `STAGING_API_KEY` oder `DATABASE_URL`) als [organization secrets](/de/product-guides/secrets) hinzu, damit sie in jeder geplanten Session verfügbar sind.
      * **Zu viele Tickets durch flaky Tests**: Füge deinem Playbook einen Retry hinzu: "Führe jeden fehlgeschlagenen Test einmal erneut aus, bevor du ein Ticket erstellst. Erstelle nur Tickets für Tests, die zweimal fehlschlagen."
      * **Tests dauern zu lange**: Schränke den Umfang der Suite ein – z. B. "Führe nur Tests in `tests/critical/` und `tests/smoke/` aus" – oder erhöhe das Session-Timeout.

      <PromptBlock agent="advanced">
        ```txt Prompt tweak: filter out flaky tests theme={null}
        Aktualisiere das nächtliche E2E-Playbook: Bevor du ein Linear-Ticket für einen
        fehlgeschlagenen Test erstellst, führe ihn einmal erneut aus mit
        `npx playwright test <test-file> --retries=1`.
        Erstelle nur dann ein Ticket, wenn der Test auch beim erneuten Ausführen fehlschlägt. Füge
        jedem Test, der beim Retry bestanden hat, ein "flaky"-Label hinzu und erwähne
        ihn in der Slack-Zusammenfassung.
        ```
      </PromptBlock>
    </Step>

    <Step title="Zeitpläne als Code verwalten">
      Sobald Ihr nächtlicher Durchlauf stabil ist, sollten Sie ihn gemeinsam mit Ihren anderen Zeitplänen verwalten — ihn während Deployment-Freezes pausieren, den Prompt aktualisieren, wenn sich Ihre Testsuite ändert, oder einen zweiten Zeitplan für eine andere Umgebung einrichten.

      **Pausieren Sie den Zeitplan** während eines Deployment-Freezes oder Wartungsfensters:

      ```bash theme={null}
      curl -X PATCH "https://api.devin.ai/v3/organizations/$ORG_ID/schedules/$SCHEDULE_ID" \
        -H "Authorization: Bearer $DEVIN_API_KEY" \
        -H "Content-Type: application/json" \
        -d '{"enabled": false}'
      ```

      **Aktivieren Sie ihn wieder**, sobald der Freeze endet:

      ```bash theme={null}
      curl -X PATCH "https://api.devin.ai/v3/organizations/$ORG_ID/schedules/$SCHEDULE_ID" \
        -H "Authorization: Bearer $DEVIN_API_KEY" \
        -H "Content-Type: application/json" \
        -d '{"enabled": true}'
      ```

      **Alle Zeitpläne auflisten**, um zu prüfen, was aktuell läuft:

      ```bash theme={null}
      curl "https://api.devin.ai/v3/organizations/$ORG_ID/schedules" \
        -H "Authorization: Bearer $DEVIN_API_KEY"
      ```

      Für Teams, die mehrere Zeitpläne verwalten müssen, können Devin bitten, ein CLI-Tool zu erstellen, das Zeitplandefinitionen aus einer YAML-Konfigurationsdatei synchronisiert — sodass Sie Ihre Zeitpläne zusammen mit Ihrer Testkonfiguration unter Versionskontrolle stellen können:

      <PromptBlock>
        ```txt Schedules-as-code CLI theme={null}
        Write a Python script that reads schedule definitions from a file called
        devin-schedules.yaml and syncs them to the Devin API.

        The YAML file should look like:
          schedules:
            - title: "Nightly E2E — staging"
              prompt: "Run the nightly E2E suite against staging."
              frequency: "0 2 * * *"
              playbook_id: "a1b2c3d4e5f6789012345678"
            - title: "Nightly E2E — preview"
              prompt: "Run the E2E suite against the preview environment."
              frequency: "0 3 * * 1-5"
              playbook_id: "a1b2c3d4e5f6789012345678"

        The script should:
        1. Compare the YAML definitions against existing schedules from the API
        2. Create new schedules, update changed ones, and disable schedules
           removed from the file
        3. Support a --dry-run flag that shows what would change
        4. Use the endpoints at /v3/organizations/{org_id}/schedules
        ```
      </PromptBlock>
    </Step>
  </Steps>
</div>
