[{"data":1,"prerenderedAt":709},["ShallowReactive",2],{"/de-de/blog/tutorial-automated-release-and-release-notes-with-gitlab/":3,"navigation-de-de":40,"banner-de-de":459,"footer-de-de":471,"Ben Ridley":681,"next-steps-de-de":694},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"seo":8,"content":16,"config":30,"_id":33,"_type":34,"title":35,"_source":36,"_file":37,"_stem":38,"_extension":39},"/de-de/blog/tutorial-automated-release-and-release-notes-with-gitlab","blog",false,"",{"title":9,"description":10,"ogTitle":9,"ogDescription":10,"noIndex":6,"ogImage":11,"ogUrl":12,"ogSiteName":13,"ogType":14,"canonicalUrls":12,"schema":15},"GitLab-Tutorial: Releases & Versionshinweise automatisieren","Mit GitLab kannst du Release-Artefakte, Versionshinweise und Änderungsprotokolle, die benutzerbezogenen Software-Änderungen enthalten, automatisieren.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659978/Blog/Hero%20Images/automation.png","https://about.gitlab.com/blog/tutorial-automated-release-and-release-notes-with-gitlab","https://about.gitlab.com","Artikel","\n                        {\n        \"@context\": \"https://schema.org\",\n        \"@type\": \"Article\",\n        \"headline\": \"Tutorial: Releases und Versionshinweise mit GitLab automatisieren\",\n        \"author\": [{\"@type\":\"Person\",\"name\":\"Ben Ridley\"}],\n        \"datePublished\": \"2023-11-01\",\n      }",{"title":9,"description":10,"authors":17,"heroImage":11,"date":19,"body":20,"category":21,"tags":22,"updatedDate":29},[18],"Ben Ridley","2023-11-01","***Update 2025** - Die Änderungsprotokoll-API wurde weiterentwickelt und enthält jetzt geniale neue Funktionen, auf die wir in diesem Blog nicht eingehen, wie die Möglichkeit, benutzerdefinierte Änderungsprotokolle mit Vorlagenwerten aus deinem Commit-Verlauf bereitzustellen. [Mehr dazu erfährst du in der offiziellen Dokumentation zu Änderungsprotokollen (nur in englischer Sprache verfügbar).](https://docs.gitlab.com/user/project/changelogs/)*\n\nWenn du Software entwickelst, auf die sich Benutzer(innen) verlassen, ist eine effektive Kommunikation über Änderungen bei jeder Release unerlässlich. Indem du Benutzer(innen) über neue Funktionen sowie darüber informierst, was geändert oder entfernt wurde, stellst du sicher, dass sie die Vorteile der Software wirklich nutzen können und sie bei Upgrades keine unangenehmen Überraschungen erwarten.\n\nIn der Vergangenheit war das Erstellen von Versionshinweisen und die Pflege eines Änderungsprotokolls eine mühsame Aufgabe, bei der Entwickler(innen) die Änderungen extern überwachen oder eigene Release Manager den Verlauf der Zusammenführungen durcharbeiten mussten. Mit der Änderungsprotokoll-API von GitLab kannst du den umfassenden Verlauf, der in unserem Git-Repository gespeichert ist, heranziehen, um ganz einfach Versionshinweise zu erstellen und ein Änderungsprotokoll zu führen.\n\nIn diesem Tutorial sehen wir uns an, wie du Releases mit GitLab automatisieren kannst und finden heraus, wie man Release-Artefakte, Versionshinweise und ein umfassendes Änderungsprotokoll, das alle benutzerbezogenen Software-Änderungen enthält, erstellt.\n\n## Releases in GitLab\nZuerst wollen wir uns ansehen, wie Releases in GitLab funktionieren.\n\nIn GitLab ist eine Release eine bestimmte Version deines Codes, die durch ein Git-Tag identifiziert wird. Dieses enthält Details zu den Änderungen seit der letzten Release (und Versionshinweise) sowie zugehörige Artefakte, die aus dieser Version des Codes erstellt wurden, wie Docker-Images, Installationspakete und Dokumentation.\n\nDu kannst Releases in GitLab über die UI erstellen und nachverfolgen, indem du unsere Release-API aufrufst oder den Job `release` innerhalb einer CI-Pipeline aufrufst. In diesem Tutorial verwenden wir den Job `release` in einer CI/CD-Pipeline, sodass wir die Automatisierung, die wir in unserer Pipeline zum Testen, für Code-Scans und mehr verwenden, auch für automatisierte Releases nutzen können.\n\nUm unsere Releases zu automatisieren, müssen wir zunächst die folgende Frage beantworten: Wo bekommen wir für unsere Versionshinweise und unser Änderungsprotokoll Informationen zu den vorgenommenen Änderungen? Die Antwort: In unserem Git-Repository, in dem wir durch Commit-Nachrichten und den Merge-Commit-Verlauf eine umfassende Übersicht über die Entwicklungsaktivitäten haben. Sehen wir uns an, ob wir diesen umfassenden Verlauf nutzen können, um automatisch unsere Versionshinweise und Änderungsprotokolle zu erstellen.\n\n## Einführung in Commit-Trailer\n[Commit-Trailer](https://git-scm.com/docs/git-interpret-trailers) sind strukturierte Einträge in deinen Git-Commits, die erstellt werden, indem du einfach die Formatierungsnachrichten `\u003CHEADER>:\u003CBODY>` am Ende deines Commits einfügst. Das CLI-Tool `git` kann diese dann parsen und für die Verwendung in anderen Systemen extrahieren. Ein Beispiel, das du vielleicht schon einmal verwendet hast, ist `git commit --sign-off`, um ein Commit zu beenden. Dies wird implementiert, indem der Trailer `Signed-off-by: \u003CDein Name>` zum Commit hinzugefügt wird. Wir können hier beliebige strukturierte Daten hinzufügen, sodass dies eine tolle Möglichkeit ist, Informationen zu speichern, die für das Änderungsprotokoll nützlich sein könnten.\n\nWenn wir in unseren Commits den Trailer `Changelog: \u003Cadded/changed/removed>` verwenden, parst die Änderungsprotokoll-API von GitLab diese und verwendet sie, um automatisch ein Änderungsprotokoll für uns zu erstellen!\n\nSehen wir uns das in Aktion an, indem wir Änderungen an einer echten Codebase vornehmen, eine Release durchführen und dann Versionshinweise und Änderungsprotokoll-Einträge generieren.\n\n## Beispielprojekt\nFür diesen Blog verwende ich ein einfaches Python-Web-App-Repository. Nehmen wir an, dass Version 1.0.0 der Anwendung gerade veröffentlicht wurde und die aktuelle Version des Codes ist. Ich habe auch die Release 1.0.0 in GitLab erstellt, was ich manuell tun musste, da wir unsere automatisierte Release-Pipeline ja noch nicht erstellt haben:\n\n![Ein Screenshot der GitLab-UI, die eine Release für Version 1.0.0 zeigt](https://about.gitlab.com/images/blogimages/2023-08-22-automated-release-and-release-notes-with-gitlab/1-0-release.png)\n\n## Nehmen wir unsere Änderungen vor\nWir entwickeln rasend schnell und arbeiten daher schon daran, Version 2.0.0 unserer Anwendung heute zu veröffentlichen. Im Rahmen unserer Release 2.0.0 fügen wir eine neue Funktion zu unserer App hinzu: einen Chatbot! Wir werden auch die Quanten-Blockchain-Funktion entfernen, da wir diese nur für die erste Finanzierungsrunde benötigt haben. Außerdem fügen wir einen automatisierten Release-Job zu unserer CI/CD-Pipeline für unsere Release 2.0.0 hinzu.\n\nZuerst entfernen wir die nicht benötigten Funktionen. Ich habe einen Merge Request erstellt, der die notwendigen Änderungen enthält. Wir müssen sicherstellen, dass wir eine Commit-Nachricht haben, die den Trailer `Changelog: removed` enthält. Dazu gibt es mehrere Möglichkeiten: Wir können ihn unter anderem direkt in einen Commit einbauen oder einen interaktiven Rebase durchführen und über das CLI hinzufügen. Der einfachste Weg in unserem Fall ist meiner Meinung nach, bis zum Ende zu warten und dann die Schaltfläche `Edit commit message` in GitLab zu verwenden, um den Trailer folgendermaßen zum Merge-Commit hinzuzufügen:\n\n![Screenshot der GitLab-UI, der einen Merge Request zum Entfernen nicht verwendeter Funktionen zeigt](https://about.gitlab.com/images/blogimages/2023-08-22-automated-release-and-release-notes-with-gitlab/remove-unused-features-mr.png)\n\nMit dieser Methode kannst du auch den Titel des Merge-Commits auf einen prägnanteren Titel ändern. Ich habe den Titel meines Merge-Commit auf „Nicht verwendete Funktionen entfernen“ geändert, da dies im Eintrag im Änderungsprotokoll angezeigt wird.\n\nAls nächstes fügen wir einige neue Funktionen für die Version 2.0.0 hinzu. Hier müssen wir nur einen weiteren Merge Request öffnen, der unsere neuen Funktionen enthält, und dann den Merge-Commit bearbeiten, sodass er den Trailer `Changelog: added` enthält, und dann den Commit-Titel auf einen prägnanteren Titel ändern:\n\n![Screenshot der GitLab-UI, der einen Merge Request zum Hinzufügen neuer Funktionen zeigt](https://about.gitlab.com/images/blogimages/2023-08-22-automated-release-and-release-notes-with-gitlab/add-chatbot-mr.png)\n\nJetzt sind wir eigentlich bereit, 2.0.0 zu veröffentlichen. Aber dieses Mal möchten wir unsere Release nicht manuell erstellen. Deshalb fügen wir vor der Release einige Jobs zur Datei `.gitlab-ci.yml` hinzu, die die Release automatisch für uns durchführen und die entsprechenden Versionshinweise und Einträge ins Änderungsprotokoll erstellen, wenn wir unseren Code mit einer neuen Version wie z. B. `2.0.0` taggen.\n\n**Hinweis:** Wenn du Änderungsprotokoll-Trailer erzwingen möchtest, solltest du überlegen, etwas wie [Gefahr bei der Durchführung automatischer Überprüfungen für MR-Konventionen (nur in englischer Sprache verfügbar)](https://docs.gitlab.com/ee/development/dangerbot.html) zu verwenden.\n\n## Erstellen einer automatisierten Release-Pipeline\nDamit unsere Pipeline funktioniert, müssen wir ein Projektzugriffstoken erstellen, mit dem wir die GitLab-API aufrufen können, damit sie die Einträge im Änderungsprotokoll erstellt. [Erstelle ein Projektzugriffstoken im API-Bereich (nur in englischer Sprache verfügbar)](https://docs.gitlab.com/ee/user/project/settings/project_access_tokens.html#create-a-project-access-token) und [speichere das Token dann als CI/CD-Variable (nur in englischer Sprache verfügbar)]((https://docs.gitlab.com/ee/ci/variables/#define-a-cicd-variable-in-the-ui) mit dem Namen `CI_API_TOKEN`. Wir verweisen auf diese Variable, um uns bei der API zu authentifizieren.\n\nNun fügen wir zwei neue Jobs zu unserer Datei `gitlab-ci.yml` hinzu:\n```yaml\nprepare_job:\n  stage: prepare\n  image: alpine:latest\n  rules:\n  - if: '$CI_COMMIT_TAG =~ /^v?\\d+\\.\\d+\\.\\d+$/'\n  script:\n    - apk add curl jq\n    - 'curl -H \"PRIVATE-TOKEN: $CI_API_TOKEN\" \"$CI_API_V4_URL/projects/$CI_PROJECT_ID/repository/changelog?version=$CI_COMMIT_TAG\" | jq -r .notes > release_notes.md'\n  artifacts:\n    paths:\n    - release_notes.md\n\nrelease_job:\n  stage: release\n  image: registry.gitlab.com/gitlab-org/release-cli:latest\n  needs:\n    - job: prepare_job\n      artifacts: true\n  rules:\n  - if: '$CI_COMMIT_TAG =~ /^v?\\d+\\.\\d+\\.\\d+$/'\n  script:\n    - echo \"Creating release\"\n  release:\n    name: 'Release $CI_COMMIT_TAG'\n    description: release_notes.md\n    tag_name: '$CI_COMMIT_TAG'\n    ref: '$CI_COMMIT_SHA'\n    assets:\n      links:\n        - name: 'Container Image $CI_COMMIT_TAG'\n          url: \"https://$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA\"\n```\n\nIn der oben angeführten Konfiguration verwendet `prepare_job` die Befehle `curl` und `jq`, um den Endpunkt der Änderungsprotokoll-API von GitLab aufzurufen und übergibt dies dann an unser `release_job`, um die Release zu erstellen. Genauer gesagt sieht das so aus:\n- Wir verwenden das Projektzugriffstoken, dass wir zuvor erstellt haben, um die Änderungsprotokoll-API von GitLab aufzurufen, die dann die Versionshinweise erstellt. Wir speichern dies als Artefakt.\n- Wir verwenden die Variable `$CI_COMMIT_TAG` als Version. Dazu müssen wir eine semantische Versionierung für unsere Tags verwenden (beispielsweise so etwas wie `2.0.0`). Du wirst auch bemerkt haben, dass ich den Release-Job mit dem Abschnitt `rules` eingeschränkt habe, der auf ein semantisches Versions-Tag überprüft.\n\t- Damit die Änderungsprotokoll-API von GitLab funktioniert, ist eine semantische Versionierung erforderlich. Sie verwendet dieses Format, um die neueste Release zu finden und sie mit unserer aktuellen Release zu vergleichen.\n- Wir verwenden das offizielle Image `release-cli` von GitLab. „release-cli“ ist erforderlich, um das Schlüsselwort `release` in einem Job zu verwenden.\n- Wir verwenden das Schlüsselwort `release`, um eine Release in GitLab zu erstellen. Dies ist ein spezielles Job-Schlüsselwort, das für die Erstellung einer Release und das Ausfüllen der erforderlichen Felder reserviert ist.\n- Wir können eine Datei als Argument an die `description` der Release übergeben. In unserem Fall ist es die Datei, die wir in `prepare_job` erstellt haben und die als Artefakt an diesen Job übergeben wurde.\n- Wir haben auch unser Container-Image, das früher in der Pipeline erstellt wurde, als Release-Asset hinzugefügt. Du kannst alle Assets aus deinem Build-Prozess anhängen, die du möchtest, z. B. Binärdateien oder Dokumentationen, indem du eine URL zu dem Ort angibst, an den du sie zuvor in der Pipeline hochgeladen hast.\n\n## Durchführen einer automatisierten Release\nMit dieser Konfiguration müssen wir nur ein Tag in unser Repository übertragen, das unserem Versionsschema entspricht, um eine Release durchzuführen. Du kannst einfach ein Tag mit dem CLI pushen. Für dieses Beispiel wird die GitLab-UI verwendet, um ein Tag im main-Branch zu erstellen. Erstelle ein Tag, indem du in der Seitenleiste „Code“ -> „Tags“ -> „Neues Tag“ auswählst:\n![Screenshot der GitLab-UI, der zeigt, wie man ein Tag erstellt](https://about.gitlab.com/images/blogimages/2023-08-22-automated-release-and-release-notes-with-gitlab/create-2-tag.png)\n\nNach der Erstellung werden unsere Pipelines ausgeführt. Die Änderungsprotokoll-API von GitLab generiert automatisch Versionshinweise für uns als Markdown, der alle Änderungen zwischen dieser Release und der vorherigen Release enthält. Hier ist der Markdown, der in unserem Beispiel generiert wurde:\n\n```md\n## 2.0.0 (2023-08-25)\n\n### added (1 change)\n\n- [Add ChatBot](gl-demo-ultimate-bridley/super-devsecops-incorporated/simply-notes-release-demo@0c3601a45af617c5481322bfce4d71db1f911b02) ([merge request](gl-demo-ultimate-bridley/super-devsecops-incorporated/simply-notes-release-demo!4))\n\n### removed (1 change)\n\n- [Remove Unused Features](gl-demo-ultimate-bridley/super-devsecops-incorporated/simply-notes-release-demo@463d453c5ae0f4fc611ea969e5442e3298bf0d8a) ([merge request](gl-demo-ultimate-bridley/super-devsecops-incorporated/simply-notes-release-demo!3))\n```\n\nWie du sehen kannst, hat GitLab die Einträge für unsere Versionshinweise automatisch mit unseren Git-Commit-Trailern extrahiert. Außerdem werden hilfreiche Links zum Merge Request bereitgestellt, damit die Leser(innen) weitere Details und Diskussionen zu den Änderungen sehen können.\n\nUnd jetzt folgt unsere letzte Release:\n![GitLab-Release-UI, die ein Release für Version 2.0.0 zeigt](https://about.gitlab.com/images/blogimages/2023-08-22-automated-release-and-release-notes-with-gitlab/2-0-release.png)\n\n## Erstellen des Änderungsprotokolls\nAls nächstes möchten wir unser Änderungsprotokoll aktualisieren (das im Grunde ein gesammelter Verlauf aller deiner Versionshinweise ist). Du kannst dazu eine `POST`-Anfrage an den Änderungsprotokoll-API-Endpunkt senden, den wir zuvor verwendet haben.\n\nDu kannst dies auch als Teil deiner Release-Pipeline tun, wenn du möchtest. Dazu kannst du beispielswiese den folgenden Code in den Abschnitt `script` deines Vorbereitungsjobs einfügen:\n```sh\n'curl -H \"PRIVATE-TOKEN: $CI_API_TOKEN\" -X POST \"$CI_API_V4_URL/projects/$CI_PROJECT_ID/repository/changelog?version=$CI_COMMIT_TAG\"\n```\n\n**Beachte dabei, dass dies das Repository ändert.** Es wird ein Commit erstellt, um die neuesten Notizen zu einer Datei `CHANGELOG.md` hinzuzufügen:\n![Screenshot des Repositorys, der einen Commit zeigt, der die Änderungsprotokolldatei aktualisiert](https://about.gitlab.com/images/blogimages/2023-08-22-automated-release-and-release-notes-with-gitlab/changelog-api-commit.png)\n\nUnd das war’s auch schon! Indem wir den umfassenden Verlauf, den uns `git` bietet, mit praktischen Commit-Trailern nutzen, können wir die leistungsstarke API und die CI/CD-Pipelines von GitLab optimal einsetzen, um unsere Release-Prozesse zu automatisieren und Versionshinweise für uns zu erstellen.\n\n> Wenn du das Projekt erkunden möchtest, das wir für diesen Artikel verwendet haben, [findest du es unter diesem Link](https://gitlab.com/gitlab-learn-labs/sample-projects/release-automation-demo).\n","product",[23,24,25,26,27,28],"Tutorial","CI","CI/CD","DevOps","DevSecOps","Git","2025-06-05",{"slug":31,"featured":6,"template":32},"tutorial-automated-release-and-release-notes-with-gitlab","BlogPost","content:de-de:blog:tutorial-automated-release-and-release-notes-with-gitlab.yml","yaml","Tutorial Automated Release And Release Notes With Gitlab","content","de-de/blog/tutorial-automated-release-and-release-notes-with-gitlab.yml","de-de/blog/tutorial-automated-release-and-release-notes-with-gitlab","yml",{"_path":41,"_dir":42,"_draft":6,"_partial":6,"_locale":7,"data":43,"_id":455,"_type":34,"title":456,"_source":36,"_file":457,"_stem":458,"_extension":39},"/shared/de-de/main-navigation","de-de",{"logo":44,"freeTrial":49,"sales":54,"login":59,"items":64,"search":396,"minimal":432,"duo":446},{"config":45},{"href":46,"dataGaName":47,"dataGaLocation":48},"/de-de/","gitlab logo","header",{"text":50,"config":51},"Kostenlose Testversion anfordern",{"href":52,"dataGaName":53,"dataGaLocation":48},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":55,"config":56},"Vertrieb kontaktieren",{"href":57,"dataGaName":58,"dataGaLocation":48},"/de-de/sales/","sales",{"text":60,"config":61},"Anmelden",{"href":62,"dataGaName":63,"dataGaLocation":48},"https://gitlab.com/users/sign_in/","sign in",[65,109,207,212,317,377],{"text":66,"config":67,"cards":69,"footer":92},"Plattform",{"dataNavLevelOne":68},"platform",[70,76,84],{"title":66,"description":71,"link":72},"Die umfassendste KI-basierte DevSecOps-Plattform",{"text":73,"config":74},"Erkunde unsere Plattform",{"href":75,"dataGaName":68,"dataGaLocation":48},"/de-de/platform/",{"title":77,"description":78,"link":79},"GitLab Duo (KI)","Entwickle Software schneller mit KI in jeder Phase der Entwicklung",{"text":80,"config":81},"Lerne GitLab Duo kennen",{"href":82,"dataGaName":83,"dataGaLocation":48},"/de-de/gitlab-duo/","gitlab duo ai",{"title":85,"description":86,"link":87},"Gründe, die für GitLab sprechen","10 Gründe, warum Unternehmen sich für GitLab entscheiden",{"text":88,"config":89},"Mehr erfahren",{"href":90,"dataGaName":91,"dataGaLocation":48},"/de-de/why-gitlab/","why gitlab",{"title":93,"items":94},"Erste Schritte mit",[95,100,105],{"text":96,"config":97},"Platform Engineering",{"href":98,"dataGaName":99,"dataGaLocation":48},"/de-de/solutions/platform-engineering/","platform engineering",{"text":101,"config":102},"Entwicklererfahrung",{"href":103,"dataGaName":104,"dataGaLocation":48},"/de-de/developer-experience/","Developer experience",{"text":106,"config":107},"MLOps",{"href":108,"dataGaName":106,"dataGaLocation":48},"/de-de/topics/devops/the-role-of-ai-in-devops/",{"text":110,"left":111,"config":112,"link":114,"lists":118,"footer":189},"Produkt",true,{"dataNavLevelOne":113},"solutions",{"text":115,"config":116},"Alle Lösungen anzeigen",{"href":117,"dataGaName":113,"dataGaLocation":48},"/de-de/solutions/",[119,144,167],{"title":120,"description":121,"link":122,"items":127},"Automatisierung","CI/CD und Automatisierung zur Beschleunigung der Bereitstellung",{"config":123},{"icon":124,"href":125,"dataGaName":126,"dataGaLocation":48},"AutomatedCodeAlt","/de-de/solutions/delivery-automation/","automated software delivery",[128,131,135,140],{"text":25,"config":129},{"href":130,"dataGaLocation":48,"dataGaName":25},"/de-de/solutions/continuous-integration/",{"text":132,"config":133},"KI-unterstützte Entwicklung",{"href":82,"dataGaLocation":48,"dataGaName":134},"AI assisted development",{"text":136,"config":137},"Quellcodeverwaltung",{"href":138,"dataGaLocation":48,"dataGaName":139},"/de-de/solutions/source-code-management/","Source Code Management",{"text":141,"config":142},"Automatisierte Softwarebereitstellung",{"href":125,"dataGaLocation":48,"dataGaName":143},"Automated software delivery",{"title":145,"description":146,"link":147,"items":152},"Sicherheit","Entwickle schneller, ohne die Sicherheit zu gefährden",{"config":148},{"href":149,"dataGaName":150,"dataGaLocation":48,"icon":151},"/de-de/solutions/security-compliance/","security and compliance","ShieldCheckLight",[153,157,162],{"text":154,"config":155},"Sicherheit und Compliance",{"href":149,"dataGaLocation":48,"dataGaName":156},"Security & Compliance",{"text":158,"config":159},"Schutz der Software-Lieferkette",{"href":160,"dataGaLocation":48,"dataGaName":161},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":163,"config":164},"Compliance und Governance",{"href":165,"dataGaLocation":48,"dataGaName":166},"/de-de/solutions/continuous-software-compliance/","Compliance and governance",{"title":168,"link":169,"items":174},"Bewertung",{"config":170},{"icon":171,"href":172,"dataGaName":173,"dataGaLocation":48},"DigitalTransformation","/de-de/solutions/visibility-measurement/","visibility and measurement",[175,179,184],{"text":176,"config":177},"Sichtbarkeit und Bewertung",{"href":172,"dataGaLocation":48,"dataGaName":178},"Visibility and Measurement",{"text":180,"config":181},"Wertstrommanagement",{"href":182,"dataGaLocation":48,"dataGaName":183},"/de-de/solutions/value-stream-management/","Value Stream Management",{"text":185,"config":186},"Analysen und Einblicke",{"href":187,"dataGaLocation":48,"dataGaName":188},"/de-de/solutions/analytics-and-insights/","Analytics and insights",{"title":190,"items":191},"GitLab für",[192,197,202],{"text":193,"config":194},"Enterprise",{"href":195,"dataGaLocation":48,"dataGaName":196},"/de-de/enterprise/","enterprise",{"text":198,"config":199},"Kleinunternehmen",{"href":200,"dataGaLocation":48,"dataGaName":201},"/de-de/small-business/","small business",{"text":203,"config":204},"den öffentlichen Sektor",{"href":205,"dataGaLocation":48,"dataGaName":206},"/de-de/solutions/public-sector/","public sector",{"text":208,"config":209},"Preise",{"href":210,"dataGaName":211,"dataGaLocation":48,"dataNavLevelOne":211},"/de-de/pricing/","pricing",{"text":213,"config":214,"link":216,"lists":220,"feature":304},"Ressourcen",{"dataNavLevelOne":215},"resources",{"text":217,"config":218},"Alle Ressourcen anzeigen",{"href":219,"dataGaName":215,"dataGaLocation":48},"/de-de/resources/",[221,254,276],{"title":222,"items":223},"Erste Schritte",[224,229,234,239,244,249],{"text":225,"config":226},"Installieren",{"href":227,"dataGaName":228,"dataGaLocation":48},"/de-de/install/","install",{"text":230,"config":231},"Kurzanleitungen",{"href":232,"dataGaName":233,"dataGaLocation":48},"/de-de/get-started/","quick setup checklists",{"text":235,"config":236},"Lernen",{"href":237,"dataGaLocation":48,"dataGaName":238},"https://university.gitlab.com/","learn",{"text":240,"config":241},"Produktdokumentation",{"href":242,"dataGaName":243,"dataGaLocation":48},"https://docs.gitlab.com/","product documentation",{"text":245,"config":246},"Best-Practice-Videos",{"href":247,"dataGaName":248,"dataGaLocation":48},"/de-de/getting-started-videos/","best practice videos",{"text":250,"config":251},"Integrationen",{"href":252,"dataGaName":253,"dataGaLocation":48},"/de-de/integrations/","integrations",{"title":255,"items":256},"Entdecken",[257,262,266,271],{"text":258,"config":259},"Kundenerfolge",{"href":260,"dataGaName":261,"dataGaLocation":48},"/de-de/customers/","customer success stories",{"text":263,"config":264},"Blog",{"href":265,"dataGaName":5,"dataGaLocation":48},"/de-de/blog/",{"text":267,"config":268},"Remote",{"href":269,"dataGaName":270,"dataGaLocation":48},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"text":272,"config":273},"TeamOps",{"href":274,"dataGaName":275,"dataGaLocation":48},"/de-de/teamops/","teamops",{"title":277,"items":278},"Vernetzen",[279,284,289,294,299],{"text":280,"config":281},"GitLab-Services",{"href":282,"dataGaName":283,"dataGaLocation":48},"/de-de/services/","services",{"text":285,"config":286},"Community",{"href":287,"dataGaName":288,"dataGaLocation":48},"/community/","community",{"text":290,"config":291},"Forum",{"href":292,"dataGaName":293,"dataGaLocation":48},"https://forum.gitlab.com/","forum",{"text":295,"config":296},"Veranstaltungen",{"href":297,"dataGaName":298,"dataGaLocation":48},"/events/","events",{"text":300,"config":301},"Partner",{"href":302,"dataGaName":303,"dataGaLocation":48},"/de-de/partners/","partners",{"backgroundColor":305,"textColor":306,"text":307,"image":308,"link":312},"#2f2a6b","#fff","Perspektiven für die Softwareentwicklung der Zukunft",{"altText":309,"config":310},"the source promo card",{"src":311},"/images/navigation/the-source-promo-card.svg",{"text":313,"config":314},"Lies die News",{"href":315,"dataGaName":316,"dataGaLocation":48},"/de-de/the-source/","the source",{"text":318,"config":319,"lists":321},"Unternehmen",{"dataNavLevelOne":320},"company",[322],{"items":323},[324,329,335,337,342,347,352,357,362,367,372],{"text":325,"config":326},"Über",{"href":327,"dataGaName":328,"dataGaLocation":48},"/de-de/company/","about",{"text":330,"config":331,"footerGa":334},"Karriere",{"href":332,"dataGaName":333,"dataGaLocation":48},"/jobs/","jobs",{"dataGaName":333},{"text":295,"config":336},{"href":297,"dataGaName":298,"dataGaLocation":48},{"text":338,"config":339},"Geschäftsführung",{"href":340,"dataGaName":341,"dataGaLocation":48},"/company/team/e-group/","leadership",{"text":343,"config":344},"Team",{"href":345,"dataGaName":346,"dataGaLocation":48},"/company/team/","team",{"text":348,"config":349},"Handbuch",{"href":350,"dataGaName":351,"dataGaLocation":48},"https://handbook.gitlab.com/","handbook",{"text":353,"config":354},"Investor Relations",{"href":355,"dataGaName":356,"dataGaLocation":48},"https://ir.gitlab.com/","investor relations",{"text":358,"config":359},"Trust Center",{"href":360,"dataGaName":361,"dataGaLocation":48},"/de-de/security/","trust center",{"text":363,"config":364},"AI Transparency Center",{"href":365,"dataGaName":366,"dataGaLocation":48},"/de-de/ai-transparency-center/","ai transparency center",{"text":368,"config":369},"Newsletter",{"href":370,"dataGaName":371,"dataGaLocation":48},"/company/contact/","newsletter",{"text":373,"config":374},"Presse",{"href":375,"dataGaName":376,"dataGaLocation":48},"/press/","press",{"text":378,"config":379,"lists":380},"Kontakt",{"dataNavLevelOne":320},[381],{"items":382},[383,386,391],{"text":55,"config":384},{"href":57,"dataGaName":385,"dataGaLocation":48},"talk to sales",{"text":387,"config":388},"Support",{"href":389,"dataGaName":390,"dataGaLocation":48},"/support/","get help",{"text":392,"config":393},"Kundenportal",{"href":394,"dataGaName":395,"dataGaLocation":48},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":397,"login":398,"suggestions":405},"Schließen",{"text":399,"link":400},"Um Repositories und Projekte zu durchsuchen, melde dich an bei",{"text":401,"config":402},"gitlab.com",{"href":62,"dataGaName":403,"dataGaLocation":404},"search login","search",{"text":406,"default":407},"Vorschläge",[408,411,416,418,423,428],{"text":77,"config":409},{"href":82,"dataGaName":410,"dataGaLocation":404},"GitLab Duo (AI)",{"text":412,"config":413},"Code Suggestions (KI)",{"href":414,"dataGaName":415,"dataGaLocation":404},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":25,"config":417},{"href":130,"dataGaName":25,"dataGaLocation":404},{"text":419,"config":420},"GitLab auf AWS",{"href":421,"dataGaName":422,"dataGaLocation":404},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":424,"config":425},"GitLab auf Google Cloud",{"href":426,"dataGaName":427,"dataGaLocation":404},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":429,"config":430},"Warum GitLab?",{"href":90,"dataGaName":431,"dataGaLocation":404},"Why GitLab?",{"freeTrial":433,"mobileIcon":438,"desktopIcon":443},{"text":434,"config":435},"Kostenlos testen",{"href":436,"dataGaName":53,"dataGaLocation":437},"https://gitlab.com/-/trials/new/","nav",{"altText":439,"config":440},"GitLab-Symbol",{"src":441,"dataGaName":442,"dataGaLocation":437},"/images/brand/gitlab-logo-tanuki.svg","gitlab icon",{"altText":439,"config":444},{"src":445,"dataGaName":442,"dataGaLocation":437},"/images/brand/gitlab-logo-type.svg",{"freeTrial":447,"mobileIcon":451,"desktopIcon":453},{"text":448,"config":449},"Erfahre mehr über GitLab Duo",{"href":82,"dataGaName":450,"dataGaLocation":437},"gitlab duo",{"altText":439,"config":452},{"src":441,"dataGaName":442,"dataGaLocation":437},{"altText":439,"config":454},{"src":445,"dataGaName":442,"dataGaLocation":437},"content:shared:de-de:main-navigation.yml","Main Navigation","shared/de-de/main-navigation.yml","shared/de-de/main-navigation",{"_path":460,"_dir":42,"_draft":6,"_partial":6,"_locale":7,"title":461,"button":462,"config":466,"_id":468,"_type":34,"_source":36,"_file":469,"_stem":470,"_extension":39},"/shared/de-de/banner","Die GitLab Duo Agent Platform ist jetzt in der öffentlichen Beta-Phase!",{"text":88,"config":463},{"href":464,"dataGaName":465,"dataGaLocation":48},"/gitlab-duo/agent-platform/","duo banner",{"layout":467},"release","content:shared:de-de:banner.yml","shared/de-de/banner.yml","shared/de-de/banner",{"_path":472,"_dir":42,"_draft":6,"_partial":6,"_locale":7,"data":473,"_id":677,"_type":34,"title":678,"_source":36,"_file":679,"_stem":680,"_extension":39},"/shared/de-de/main-footer",{"text":474,"source":475,"edit":481,"contribute":486,"config":491,"items":496,"minimal":669},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":476,"config":477},"Quelltext der Seite anzeigen",{"href":478,"dataGaName":479,"dataGaLocation":480},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":482,"config":483},"Diese Seite bearbeiten",{"href":484,"dataGaName":485,"dataGaLocation":480},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":487,"config":488},"Beteilige dich",{"href":489,"dataGaName":490,"dataGaLocation":480},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":492,"facebook":493,"youtube":494,"linkedin":495},"https://x.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[497,520,575,605,639],{"title":66,"links":498,"subMenu":503},[499],{"text":500,"config":501},"DevSecOps-Plattform",{"href":75,"dataGaName":502,"dataGaLocation":480},"devsecops platform",[504],{"title":208,"links":505},[506,510,515],{"text":507,"config":508},"Tarife anzeigen",{"href":210,"dataGaName":509,"dataGaLocation":480},"view plans",{"text":511,"config":512},"Vorteile von Premium",{"href":513,"dataGaName":514,"dataGaLocation":480},"/de-de/pricing/premium/","why premium",{"text":516,"config":517},"Vorteile von Ultimate",{"href":518,"dataGaName":519,"dataGaLocation":480},"/de-de/pricing/ultimate/","why ultimate",{"title":521,"links":522},"Lösungen",[523,528,531,533,538,543,547,550,553,558,560,562,565,570],{"text":524,"config":525},"Digitale Transformation",{"href":526,"dataGaName":527,"dataGaLocation":480},"/de-de/topics/digital-transformation/","digital transformation",{"text":154,"config":529},{"href":149,"dataGaName":530,"dataGaLocation":480},"security & compliance",{"text":141,"config":532},{"href":125,"dataGaName":126,"dataGaLocation":480},{"text":534,"config":535},"Agile Entwicklung",{"href":536,"dataGaName":537,"dataGaLocation":480},"/de-de/solutions/agile-delivery/","agile delivery",{"text":539,"config":540},"Cloud-Transformation",{"href":541,"dataGaName":542,"dataGaLocation":480},"/de-de/topics/cloud-native/","cloud transformation",{"text":544,"config":545},"SCM",{"href":138,"dataGaName":546,"dataGaLocation":480},"source code management",{"text":25,"config":548},{"href":130,"dataGaName":549,"dataGaLocation":480},"continuous integration & delivery",{"text":180,"config":551},{"href":182,"dataGaName":552,"dataGaLocation":480},"value stream management",{"text":554,"config":555},"GitOps",{"href":556,"dataGaName":557,"dataGaLocation":480},"/de-de/solutions/gitops/","gitops",{"text":193,"config":559},{"href":195,"dataGaName":196,"dataGaLocation":480},{"text":198,"config":561},{"href":200,"dataGaName":201,"dataGaLocation":480},{"text":563,"config":564},"Öffentlicher Sektor",{"href":205,"dataGaName":206,"dataGaLocation":480},{"text":566,"config":567},"Bildungswesen",{"href":568,"dataGaName":569,"dataGaLocation":480},"/de-de/solutions/education/","education",{"text":571,"config":572},"Finanzdienstleistungen",{"href":573,"dataGaName":574,"dataGaLocation":480},"/de-de/solutions/finance/","financial services",{"title":213,"links":576},[577,579,581,583,586,588,591,593,595,597,599,601,603],{"text":225,"config":578},{"href":227,"dataGaName":228,"dataGaLocation":480},{"text":230,"config":580},{"href":232,"dataGaName":233,"dataGaLocation":480},{"text":235,"config":582},{"href":237,"dataGaName":238,"dataGaLocation":480},{"text":240,"config":584},{"href":242,"dataGaName":585,"dataGaLocation":480},"docs",{"text":263,"config":587},{"href":265,"dataGaName":5,"dataGaLocation":480},{"text":258,"config":589},{"href":590,"dataGaName":261,"dataGaLocation":480},"/customers/",{"text":267,"config":592},{"href":269,"dataGaName":270,"dataGaLocation":480},{"text":280,"config":594},{"href":282,"dataGaName":283,"dataGaLocation":480},{"text":272,"config":596},{"href":274,"dataGaName":275,"dataGaLocation":480},{"text":285,"config":598},{"href":287,"dataGaName":288,"dataGaLocation":480},{"text":290,"config":600},{"href":292,"dataGaName":293,"dataGaLocation":480},{"text":295,"config":602},{"href":297,"dataGaName":298,"dataGaLocation":480},{"text":300,"config":604},{"href":302,"dataGaName":303,"dataGaLocation":480},{"title":318,"links":606},[607,609,611,613,615,617,619,623,628,630,632,634],{"text":325,"config":608},{"href":327,"dataGaName":320,"dataGaLocation":480},{"text":330,"config":610},{"href":332,"dataGaName":333,"dataGaLocation":480},{"text":338,"config":612},{"href":340,"dataGaName":341,"dataGaLocation":480},{"text":343,"config":614},{"href":345,"dataGaName":346,"dataGaLocation":480},{"text":348,"config":616},{"href":350,"dataGaName":351,"dataGaLocation":480},{"text":353,"config":618},{"href":355,"dataGaName":356,"dataGaLocation":480},{"text":620,"config":621},"Sustainability",{"href":622,"dataGaName":620,"dataGaLocation":480},"/sustainability/",{"text":624,"config":625},"Vielfalt, Inklusion und Zugehörigkeit",{"href":626,"dataGaName":627,"dataGaLocation":480},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":358,"config":629},{"href":360,"dataGaName":361,"dataGaLocation":480},{"text":368,"config":631},{"href":370,"dataGaName":371,"dataGaLocation":480},{"text":373,"config":633},{"href":375,"dataGaName":376,"dataGaLocation":480},{"text":635,"config":636},"Transparenzerklärung zu moderner Sklaverei",{"href":637,"dataGaName":638,"dataGaLocation":480},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":640,"links":641},"Nimm Kontakt auf",[642,645,647,649,654,659,664],{"text":643,"config":644},"Sprich mit einem Experten/einer Expertin",{"href":57,"dataGaName":58,"dataGaLocation":480},{"text":387,"config":646},{"href":389,"dataGaName":390,"dataGaLocation":480},{"text":392,"config":648},{"href":394,"dataGaName":395,"dataGaLocation":480},{"text":650,"config":651},"Status",{"href":652,"dataGaName":653,"dataGaLocation":480},"https://status.gitlab.com/","status",{"text":655,"config":656},"Nutzungsbedingungen",{"href":657,"dataGaName":658,"dataGaLocation":480},"/terms/","terms of use",{"text":660,"config":661},"Datenschutzerklärung",{"href":662,"dataGaName":663,"dataGaLocation":480},"/de-de/privacy/","privacy statement",{"text":665,"config":666},"Cookie-Einstellungen",{"dataGaName":667,"dataGaLocation":480,"id":668,"isOneTrustButton":111},"cookie preferences","ot-sdk-btn",{"items":670},[671,673,675],{"text":655,"config":672},{"href":657,"dataGaName":658,"dataGaLocation":480},{"text":660,"config":674},{"href":662,"dataGaName":663,"dataGaLocation":480},{"text":665,"config":676},{"dataGaName":667,"dataGaLocation":480,"id":668,"isOneTrustButton":111},"content:shared:de-de:main-footer.yml","Main Footer","shared/de-de/main-footer.yml","shared/de-de/main-footer",[682],{"_path":683,"_dir":684,"_draft":6,"_partial":6,"_locale":7,"content":685,"config":689,"_id":691,"_type":34,"title":18,"_source":36,"_file":692,"_stem":693,"_extension":39},"/en-us/blog/authors/ben-ridley","authors",{"name":18,"config":686},{"headshot":687,"ctfId":688},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659973/Blog/Author%20Headshots/bridley-headshot.jpg","bridley",{"template":690},"BlogAuthor","content:en-us:blog:authors:ben-ridley.yml","en-us/blog/authors/ben-ridley.yml","en-us/blog/authors/ben-ridley",{"_path":695,"_dir":42,"_draft":6,"_partial":6,"_locale":7,"header":696,"eyebrow":697,"blurb":698,"button":699,"secondaryButton":703,"_id":705,"_type":34,"title":706,"_source":36,"_file":707,"_stem":708,"_extension":39},"/shared/de-de/next-steps","Stelle jetzt bessere Software schneller bereit","Mehr als 50 % der Fortune-100-Unternehmen vertrauen GitLab","Erlebe, was dein Team mit der intelligenten\n\n\nDevSecOps-Plattform erreichen kann.\n",{"text":50,"config":700},{"href":701,"dataGaName":53,"dataGaLocation":702},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":55,"config":704},{"href":57,"dataGaName":58,"dataGaLocation":702},"content:shared:de-de:next-steps.yml","Next Steps","shared/de-de/next-steps.yml","shared/de-de/next-steps",1754424480379]