{"meta":{"title":"Wiederverwenden von Workflows","intro":"Hier erfährst du, wie du beim Erstellen eines Workflows Duplizierungen vermeiden kannst, indem du bereits vorhandene Workflows erneut verwendest.","product":"GitHub Actions","breadcrumbs":[{"href":"/de/actions","title":"GitHub Actions"},{"href":"/de/actions/how-tos","title":"Anleitungen"},{"href":"/de/actions/how-tos/reuse-automations","title":"Wiederverwenden von Automatisierungen"},{"href":"/de/actions/how-tos/reuse-automations/reuse-workflows","title":"Wiederverwenden von Workflows"}],"documentType":"article"},"body":"# Wiederverwenden von Workflows\n\nHier erfährst du, wie du beim Erstellen eines Workflows Duplizierungen vermeiden kannst, indem du bereits vorhandene Workflows erneut verwendest.\n\n## Erstellen eines wiederverwendbaren Workflows\n\nWiederverwendbare Workflows sind Dateien mit YAML-Code, die anderen Workflowdateien sehr ähneln. Wie andere Workflowdateien auch, findest du wiederverwendbare Workflows im Verzeichnis `.github/workflows` eines Repositorys. Unterverzeichnisse des Verzeichnisses `workflows` werden nicht unterstützt.\n\nDamit ein Workflow wiederverwendbar ist, müssen die Werte für `on``workflow_call` beinhalten:\n\n```yaml\non:\n  workflow_call:\n```\n\n## Verwenden von Eingaben und Geheimnissen in einem wiederverwendbaren Workflow\n\nDu kannst Eingaben und Geheimnisse definieren, die vom aufrufenden Workflow übergeben und im aufgerufenen Workflow verwendet werden können. Für die Verwendung einer Eingabe oder eines Geheimnisses in einem wiederverwendbaren Workflow sind drei Schritte erforderlich.\n\n1. Verwende im wiederverwendbaren Workflow die Schlüsselwörter `inputs` und `secrets`, um Eingaben oder Geheimnisse zu definieren, die von einem aufrufenden Workflow übergeben werden.\n\n   ```yaml\n   on:\n     workflow_call:\n       inputs:\n         config-path:\n           required: true\n           type: string\n       secrets:\n         personal_access_token:\n           required: true\n   ```\n\nAusführliche Informationen zur Syntax zum Definieren von Eingaben und Geheimnissen findest du unter [`on.workflow_call.inputs`](/de/actions/using-workflows/workflow-syntax-for-github-actions#onworkflow_callinputs) und [`on.workflow_call.secrets`](/de/actions/using-workflows/workflow-syntax-for-github-actions#onworkflow_callsecrets).\n\n1. Verweise im wiederverwendbaren Workflow auf die Eingabe oder das Geheimnis, die bzw. das du im vorherigen Schritt im Schlüssel `on` definiert hast.\n\n   > \\[!NOTE]\n   > Wenn die Geheimnisse durch Verwendung von `secrets: inherit` im aufrufenden Workflow geerbt werden, kannst du auch dann auf sie verweisen, wenn sie im `on`-Schlüssel nicht explizit definiert sind. Weitere Informationen findest du unter [Workflowsyntax für GitHub Actions](/de/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idsecretsinherit).\n\n   ```yaml\n   jobs:\n     reusable_workflow_job:\n       runs-on: ubuntu-latest\n       steps:\n       - uses: actions/labeler@v6\n         with:\n           repo-token: ${{ secrets.personal_access_token }}\n           configuration-path: ${{ inputs.config-path }}\n   ```\n\n   Im obigen Beispiel ist `personal_access_token` ein auf Repository- oder Organisationsebene definiertes Geheimnis.\n\n   > \\[!WARNING]\n   > Umgebungsgeheimnisse können nicht vom aufrufenden Workflow übergeben werden, da `on.workflow_call` das Schlüsselwort `environment` nicht unterstützt. Wenn du `environment` in den wiederverwendbaren Workflow auf Auftragsebene einschließen, wird das Umgebungsgeheimnis verwendet und nicht das vom aufrufenden Workflow übergebene Geheimnis. Weitere Informationen findest du unter [Verwalten von Umgebungen für die Bereitstellung](/de/actions/deployment/targeting-different-environments/managing-environments-for-deployment#environment-secrets) und [Workflowsyntax für GitHub Actions](/de/actions/writing-workflows/workflow-syntax-for-github-actions#onworkflow_call).\n\n2. Übergib die Eingabe oder das Geheimnis aus dem aufrufenden Workflow.\n\n   Verwende das Schlüsselwort `with` in einem Auftrag, um benannte Eingaben an einen aufgerufenen Workflow zu übergeben. Verwende das Schlüsselwort `secrets`, um benannte Geheimnisse zu übergeben. Bei Eingaben muss der Datentyp des Eingabewerts dem Typ entsprechen, der im aufgerufenen Workflow angegeben ist (boolescher Wert, Zahl oder Zeichenfolge).\n\n   ```yaml\n   jobs:\n     call-workflow-passing-data:\n       uses: octo-org/example-repo/.github/workflows/reusable-workflow.yml@main\n       with:\n         config-path: .github/labeler.yml\n       secrets:\n         personal_access_token: ${{ secrets.token }}\n   ```\n\n   Workflows, die wiederverwendbare Workflows in derselben Organisation oder im selben Unternehmen aufrufen, können Geheimnisse mithilfe des Schlüsselworts `inherit` implizit übergeben.\n\n   ```yaml\n   jobs:\n     call-workflow-passing-data:\n       uses: octo-org/example-repo/.github/workflows/reusable-workflow.yml@main\n       with:\n         config-path: .github/labeler.yml\n       secrets: inherit\n   ```\n\n### Beispiel für einen wiederverwendbaren Workflow\n\nIn dieser Datei namens `workflow-B.yml` mit einem wiederverwendbaren Workflow (wir verweisen später im [Beispiel für einen aufrufenden Workflow](#example-caller-workflow) darauf) werden eine Eingabezeichenfolge und ein Geheimnis aus dem aufrufenden Workflow abgerufen und in einer Aktion verwendet.\n\n```yaml copy\nname: Reusable workflow example\n\non:\n  workflow_call:\n    inputs:\n      config-path:\n        required: true\n        type: string\n    secrets:\n      token:\n        required: true\n\njobs:\n  triage:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/labeler@v6\n      with:\n        repo-token: ${{ secrets.token }}\n        configuration-path: ${{ inputs.config-path }}\n```\n\n## Aufrufen eines wiederverwendbaren Workflows\n\nZum Aufrufen eines wiederverwendbaren Workflows wird das Schlüsselwort `uses` verwendet. Anders als bei der Verwendung von Aktionen in einem Workflow werden wiederverwendbare Workflows direkt in einem Auftrag aufgerufen und nicht in Auftragsschritten.\n\n[`jobs.<job_id>.uses`](/de/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_iduses)\n\nSie verweisen auf wiederverwendbare Workflowdateien mithilfe einer der folgenden Syntaxen:\n\n* `{owner}/{repo}/.github/workflows/{filename}@{ref}` für wiederverwendbare Workflows in öffentlichen und privaten Repositorys.\n* `./.github/workflows/{filename}` für wiederverwendbare Workflows im selben Repository.\n\nBei der ersten Option kann `{ref}` ein SHA, ein Releasetag oder ein Branchname sein. Wenn ein Releasetag und ein Branch denselben Namen aufweisen, hat das Releasetag Vorrang vor dem Branchnamen. Die Verwendung des Commit-SHA-Werts ist die beste Option im Hinblick auf Stabilität und Sicherheit. Weitere Informationen finden Sie unter [Referenz zur sicheren Verwendung](/de/actions/security-guides/security-hardening-for-github-actions#reusing-third-party-workflows).\n\nWenn du die zweite Syntaxoption verwendest (ohne `{owner}/{repo}` und `@{ref}`), stammt der aufgerufene Workflow aus demselben Commit wie der aufrufende Workflow. Verweispräfixe wie `refs/heads` und `refs/tags` sind nicht zulässig. In diesem Schlüsselwort kannst Du keine Kontexte oder Ausdrücke verwenden.\n\nDu kannst mehrere Workflows aufrufen, indem du jeweils in einem eigenen Auftrag auf diese verweist.\n\n```yaml\njobs:\n  call-workflow-1-in-local-repo:\n    uses: octo-org/this-repo/.github/workflows/workflow-1.yml@172239021f7ba04fe7327647b213799853a9eb89\n  call-workflow-2-in-local-repo:\n    uses: ./.github/workflows/workflow-2.yml\n  call-workflow-in-another-repo:\n    uses: octo-org/another-repo/.github/workflows/workflow.yml@v1\n```\n\n### Beispiel für einen aufrufenden Workflow\n\nIn dieser Workflowdatei werden zwei Workflowdateien aufgerufen. Der zweiten davon (`workflow-B.yml`, im [Beispiel für einen wiederverwendbaren Workflow](#example-reusable-workflow) zu sehen) werden eine Eingabe (`config-path`) und ein Geheimnis (`token`) übergeben.\n\n```yaml copy\nname: Call a reusable workflow\n\non:\n  pull_request:\n    branches:\n      - main\n\njobs:\n  call-workflow:\n    uses: octo-org/example-repo/.github/workflows/workflow-A.yml@v1\n\n  call-workflow-passing-data:\n    permissions:\n      contents: read\n      pull-requests: write\n    uses: octo-org/example-repo/.github/workflows/workflow-B.yml@main\n    with:\n      config-path: .github/labeler.yml\n    secrets:\n      token: ${{ secrets.GITHUB_TOKEN }}\n```\n\n## Übergeben von Eingaben und Geheimnissen an einen wiederverwendbaren Workflow\n\nVerwende das Schlüsselwort `with` in einem Auftrag, um benannte Eingaben an einen aufgerufenen Workflow zu übergeben. Verwende das Schlüsselwort `secrets`, um benannte Geheimnisse zu übergeben. Bei Eingaben muss der Datentyp des Eingabewerts dem Typ entsprechen, der im aufgerufenen Workflow angegeben ist (boolescher Wert, Zahl oder Zeichenfolge).\n\n```yaml\njobs:\n  call-workflow-passing-data:\n    uses: octo-org/example-repo/.github/workflows/reusable-workflow.yml@main\n    with:\n      config-path: .github/labeler.yml\n    secrets:\n      personal_access_token: ${{ secrets.token }}\n```\n\nWorkflows, die wiederverwendbare Workflows in derselben Organisation oder im selben Unternehmen aufrufen, können Geheimnisse mithilfe des Schlüsselworts `inherit` implizit übergeben.\n\n```yaml\njobs:\n  call-workflow-passing-data:\n    uses: octo-org/example-repo/.github/workflows/reusable-workflow.yml@main\n    with:\n      config-path: .github/labeler.yml\n    secrets: inherit\n```\n\n## Verwenden einer Matrixstrategie mit einem wiederverwendbaren Workflow\n\nAufträge, die die Matrixstrategie verwenden, können einen wiederverwendbaren Workflow aufrufen.\n\nMithilfe einer Matrixstrategie kannst du Variablen in einer Auftragsdefinition verwenden, um automatisch mehrere Auftragsausführungen zu erstellen, die auf Kombinationen dieser Variablen basieren. Beispielsweise kannst du eine Matrixstrategie verwenden, um verschiedene Eingaben an einen wiederverwendbaren Workflow zu übergeben. Weitere Informationen zu Matrizen findest du unter [Varianten von Aufgaben in einem Workflow ausführen](/de/actions/using-jobs/using-a-matrix-for-your-jobs).\n\nDer folgende Beispielauftrag ruft einen wiederverwendbaren Workflow auf und verweist auf den Matrixkontext, indem die Variable `target` mit den Werten `[dev, stage, prod]` definiert wird. Er führt drei Aufträge aus, einen für jeden Wert in der Variablen.\n\n```yaml copy\njobs:\n  ReusableMatrixJobForDeployment:\n    strategy:\n      matrix:\n        target: [dev, stage, prod]\n    uses: octocat/octo-repo/.github/workflows/deployment.yml@main\n    with:\n      target: ${{ matrix.target }}\n```\n\n## Schachteln wiederverwendbarer Workflows\n\nSie können maximal zehn Ebenen von Workflows verbinden, also den Anrufer-Workflow auf oberster Ebene und bis zu neun Ebenen von wiederverwendbaren Workflows. Beispiel: *caller-workflow\\.yml →\\_\\_called-workflow-1.yml* → *called-workflow-2.yml* → *called-workflow-3.yml* → ... → *called-workflow-9.yml*.\n\nSchleifen in der Workflowstruktur sind nicht zulässig.\n\n> \\[!NOTE] Geschachtelte wiederverwendbare Workflows erfordern, dass der Aufrufer auf alle Workflows in der Kette zugreifen kann, und Berechtigungen können nur in der gesamten Kette beibehalten oder verringert – aber nicht erhöht – werden. Weitere Informationen findest du unter [Wiederverwenden von Workflowkonfigurationen](/de/actions/reference/reusable-workflows-reference#access-and-permissions-for-nested-workflows).\n\nAus einem wiederverwendbaren Workflow kannst du einen anderen wiederverwendbaren Workflow aufrufen.\n\n```yaml copy\nname: Reusable workflow\n\non:\n  workflow_call:\n\njobs:\n  call-another-reusable:\n    uses: octo-org/example-repo/.github/workflows/another-reusable.yml@v1\n```\n\n## Übergeben von Geheimnissen an geschachtelte Workflows\n\nDu kannst `jobs.<job_id>.secrets` in einem aufrufenden Workflow verwenden, um benannte Geheimnisse an einen direkt aufgerufenen Workflow zu übergeben. Alternativ kannst du mit `jobs.<job_id>.secrets.inherit` alle Geheimnisse des aufrufenden Workflows an einen direkt aufgerufenen Workflow übergeben. Weitere Informationen findest du weiter oben im Abschnitt [Wiederverwenden von Workflows](/de/actions/using-workflows/reusing-workflows#passing-inputs-and-secrets-to-a-reusable-workflow) oben und im Referenzartikel [Workflowsyntax für GitHub Actions](/de/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idsecretsinherit). Geheimnisse werden nur an einen direkt aufgerufenen Workflow übergeben. In der Workflowkette A > B > C erhält Workflow C nur dann Geheimnisse von A, wenn sie von A an B und dann von B an C übergeben werden.\n\nIm folgenden Beispiel übergibt Workflow A über das Schlüsselwort `inherit` alle Geheimnisse an Workflow B. Workflow B übergibt jedoch nur ein Geheimnis an Workflow C. Alle übrigen Geheimnisse, die an Workflow B übergeben werden, sind für Workflow C nicht verfügbar.\n\n```yaml\njobs:\n  workflowA-calls-workflowB:\n    uses: octo-org/example-repo/.github/workflows/B.yml@main\n    secrets: inherit # pass all secrets\n```\n\n```yaml\njobs:\n  workflowB-calls-workflowC:\n    uses: different-org/example-repo/.github/workflows/C.yml@main\n    secrets:\n      repo-token: ${{ secrets.personal_access_token }} # pass just this secret\n```\n\n## Verwenden von Ausgaben eines wiederverwendbaren Workflows\n\nEin wiederverwendbarer Workflow generiert möglicherweise Daten, die du im aufrufenden Workflow verwenden möchtest. Damit du diese Ausgaben verwenden kannst, musst du sie als Ausgaben des wiederverwendbaren Workflows angeben.\n\nWenn ein wiederverwendbarer Workflow, der eine Ausgabe festlegt, mit einer Matrixstrategie ausgeführt wird, enthält die Ausgabe den Ausgabewert des letzten erfolgreich abgeschlossenen wiederverwendbaren Workflows der Matrix, der einen tatsächlichen Wert festlegt.\nDas bedeutet, wenn der letzte erfolgreich abgeschlossene wiederverwendbare Workflow eine leere Zeichenfolge als Ausgabe festlegt und der vorletzte erfolgreich abgeschlossene wiederverwendbare Workflow einen tatsächlichen Wert als Ausgabe festlegt, enthält die Ausgabe den Wert des vorletzten abgeschlossenen wiederverwendbaren Workflows.\n\nDer folgende wiederverwendbare Workflow besteht aus einem Auftrag mit zwei Schritten. In jedem dieser Schritte wird ein einzelnes Wort als Ausgabe festgelegt: erst „hello“ und dann „world“. Im Abschnitt `outputs` des Auftrags werden diese Schrittausgaben den Auftragsausgaben `output1` und `output2` zugeordnet. Im Abschnitt `on.workflow_call.outputs` werden dann zwei Ausgaben für den Workflow selbst definiert, eine namens `firstword`, die `output1` zugeordnet wird, und eine namens `secondword`, die `output2` zugeordnet wird.\n\nDer `value` muss auf den Wert einer Ausgabe auf Auftragsebene im aufgerufenen Workflow festgelegt werden. Ausgaben auf Schrittebene müssen zunächst den Ausgaben auf Auftragsebene zugeordnet werden, wie unten dargestellt.\n\nWeitere Informationen findest du unter [Übergeben von Informationen zwischen Jobs](/de/actions/using-jobs/defining-outputs-for-jobs#overview) und [Workflowsyntax für GitHub Actions](/de/actions/using-workflows/workflow-syntax-for-github-actions#onworkflow_calloutputs).\n\n```yaml copy\nname: Reusable workflow\n\non:\n  workflow_call:\n    # Map the workflow outputs to job outputs\n    outputs:\n      firstword:\n        description: \"The first output string\"\n        value: ${{ jobs.example_job.outputs.output1 }}\n      secondword:\n        description: \"The second output string\"\n        value: ${{ jobs.example_job.outputs.output2 }}\n\njobs:\n  example_job:\n    name: Generate output\n    runs-on: ubuntu-latest\n    # Map the job outputs to step outputs\n    outputs:\n      output1: ${{ steps.step1.outputs.firstword }}\n      output2: ${{ steps.step2.outputs.secondword }}\n    steps:\n      - id: step1\n        run: echo \"firstword=hello\" >> $GITHUB_OUTPUT\n      - id: step2\n        run: echo \"secondword=world\" >> $GITHUB_OUTPUT\n```\n\nNun können die Ausgaben im aufrufenden Workflow genau so verwendet werden wie die Ausgaben eines Auftrags im selben Workflow. Zum Verweisen auf die Ausgaben werden die auf Workflowebene im wiederverwendbaren Workflow definierten Namen `firstword` und `secondword` verwendet. In diesem Workflow wird in `job1` der wiederverwendbare Workflow aufgerufen, und in `job2` werden die Ausgaben des wiederverwendbaren Workflows („hello world“) in der Standardausgabe im Workflowprotokoll ausgegeben.\n\n```yaml copy\nname: Call a reusable workflow and use its outputs\n\non:\n  workflow_dispatch:\n\njobs:\n  job1:\n    uses: octo-org/example-repo/.github/workflows/called-workflow.yml@v1\n\n  job2:\n    runs-on: ubuntu-latest\n    needs: job1\n    steps:\n      - run: echo ${{ needs.job1.outputs.firstword }} ${{ needs.job1.outputs.secondword }}\n```\n\nWeitere Informationen zur Verwendung von Auftragsausgaben findest du unter [Workflowsyntax für GitHub Actions](/de/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idoutputs). Wenn du etwas anderes als eine Variable (z. B. ein Buildartefakt) zwischen Workflows freigeben möchtest, lies [Speichern und Freigeben von Daten mit Workflowartefakten](/de/actions/using-workflows/storing-workflow-data-as-artifacts).\n\n## Überwachen der verwendeten Workflows\n\nOrganisationen, die GitHub Enterprise Cloud verwenden, können über die GitHub-REST-API mit dem Überwachungsprotokoll interagieren, um zu überwachen, welche Workflows verwendet werden. Weitere Informationen findest du unter [Dokumentation zu GitHub Enterprise Cloud](/de/enterprise-cloud@latest/organizations/keeping-your-organization-secure/managing-security-settings-for-your-organization/reviewing-the-audit-log-for-your-organization#using-the-audit-log-api).\n\n## Nächste Schritte\n\nInformationen zu den Feinheiten bei der Wiederverwendung von Workflows findest du unter [Wiederverwenden von Workflowkonfigurationen](/de/actions/reference/reusable-workflows-reference)."}