[{"data":1,"prerenderedAt":705},["ShallowReactive",2],{"/de-de/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way/":3,"navigation-de-de":36,"banner-de-de":455,"footer-de-de":468,"Sam Morris":677,"next-steps-de-de":690},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"seo":8,"content":16,"config":26,"_id":29,"_type":30,"title":31,"_source":32,"_file":33,"_stem":34,"_extension":35},"/de-de/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way","blog",false,"",{"title":9,"description":10,"ogTitle":9,"ogDescription":10,"noIndex":6,"ogImage":11,"ogUrl":12,"ogSiteName":13,"ogType":14,"canonicalUrls":12,"schema":15},"Einfaches Erstellen einer GitLab-CI/CD-Pipeline für ein Monorepo","Erfahre, wie du eine GitLab-CI/CD-Pipeline für ein Monorepo erstellst, um mehrere Anwendungen in einem Repository zu hosten.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749660151/Blog/Hero%20Images/blog-image-template-1800x945__26_.png","https://about.gitlab.com/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way","https://about.gitlab.com","article","\n                        {\n        \"@context\": \"https://schema.org\",\n        \"@type\": \"Article\",\n        \"headline\": \"Einfaches Erstellen einer GitLab-CI/CD-Pipeline für ein Monorepo\",\n        \"author\": [{\"@type\":\"Person\",\"name\":\"Sam Morris\"}],\n        \"datePublished\": \"2024-07-30\",\n      }",{"title":9,"description":10,"authors":17,"heroImage":11,"date":19,"body":20,"category":21,"tags":22,"updatedDate":25},[18],"Sam Morris","2024-07-30","Mit Monorepos kannst du den Code von mehreren Anwendungen in einem einzigen Repository hosten. In GitLab bedeutet das, dass du den Quellcode verschiedener Anwendungen in getrennten Verzeichnissen in einem Projekt ablegen musst. So kannst du zwar deinen Code versionskontrolliert speichern, aber die [CI/CD-Pipeline von GitLab](https://about.gitlab.com/de-de/topics/ci-cd/) nicht voll ausschöpfen … bis jetzt!\n\n## Der Idealfall: CI/CD in einem Monorepo\n\nDa du mehr als den Code einer Anwendung in deinem Repository hast, wirst du mehr als eine Pipeline-Konfiguration benötigen. Wenn du z. B. eine .NET-Anwendung und eine Spring-Anwendung in einem Projekt hast, kann es sein, dass für jede Anwendung unterschiedliche Build- und Testjobs ausgeführt werden müssen. Im Idealfall kannst du die Pipelines vollständig entkoppeln und jede Pipeline nur auf der Grundlage von Änderungen am Quellcode der jeweiligen Anwendung ausführen.\n\nDer technische Ansatz hierfür wäre eine `.gitlab-ci.yml`-Pipeline-Konfigurationsdatei auf Projektebene, die eine bestimmte YAML-Datei enthält, die auf Änderungen in einem bestimmten Verzeichnis basiert. Die `.gitlab-ci.yml`-Pipeline dient als Steuerungsebene, die auf der Grundlage der Änderungen am Code die entsprechende Pipeline anstößt.\n\n## Der Legacy-Ansatz\n\nVor GitLab 16.4 war es nicht möglich, eine YAML-Datei bei Änderungen an einem Verzeichnis oder einer Datei in einem Projekt einzubinden. Wir konnten diese Funktionalität jedoch mit einem Workaround realisieren.\n\nIn unserem Monorepo-Projekt haben wir zwei Verzeichnisse für verschiedene Anwendungen. In diesem Beispiel gibt es die Verzeichnisse `java` und `python`, die jeweils eine Java- und eine Python-Anwendung repräsentieren. Jedes Verzeichnis hat eine anwendungsspezifische YAML-Datei, um jede App zu bauen. In der Pipeline-Datei des Projekts binden wir einfach beide Anwendungspipeline-Dateien ein und führen die logische Verarbeitung direkt in diesen Dateien durch.\n\n`.gitlab-ci.yml`:\n\n```\nstages:\n  - build\n  - test\n  - deploy\n\ntop-level-job:\n  stage: build\n  script:\n    - echo \"Hello world...\"\n\ninclude:\n  - local: '/java/j.gitlab-ci.yml'\n  - local: '/python/py.gitlab-ci.yml'\n\n```\n\nIn jeder anwendungsspezifischen Pipeline-Datei erstellen wir einen versteckten Auftrag mit dem Namen .java-common oder .python-common, der nur ausgeführt wird, wenn es Änderungen im Verzeichnis der jeweiligen Anwendung gibt. [Versteckte Jobs (nur in englischer Sprache verfügbar](https://docs.gitlab.com/ee/ci/jobs/#hide-jobs) werden standardmäßig nicht ausgeführt und werden oft verwendet, um bestimmte Jobkonfigurationen wiederzuverwenden. Jede Pipeline erweitert diesen versteckten Job, um die Regeln zu übernehmen, die festlegen, welche Dateien auf Änderungen überwacht werden sollen, die dann den Pipeline-Job auslösen.\n\n`j.gitlab-ci.yml`:\n\n```\nstages:\n  - build\n  - test\n  - deploy\n\n.java-common:\n  rules:\n    - changes:\n      - '../java/*'\n\njava-build-job:\n  extends: .java-common\n  stage: build\n  script:\n    - echo \"Building Java\"\n\njava-test-job:\n  extends: .java-common\n  stage: test\n  script:\n    - echo \"Testing Java\"\n\n```\n\n`py.gitlab-ci.yml`:\n\n```\nstages:\n  - build\n  - test\n  - deploy\n\n.python-common:\n  rules:\n    - changes:\n      - '../python/*'\n\npython-build-job:\n  extends: .python-common\n  stage: build\n  script:\n    - echo \"Building Python\"\n\npython-test-job:\n  extends: .python-common\n  stage: test\n  script:\n    - echo \"Testing Python\"\n\n```\n\nDas hat einige Nachteile, z. B. muss der Job für jeden anderen Job in der YAML-Datei erweitert werden, um sicherzustellen, dass er mit den Regeln übereinstimmt, was eine Menge redundanten Code und Raum für menschliche Fehler schafft. Außerdem können erweiterte Jobs keine doppelten Schlüssel haben, so dass du nicht in jedem Job deine eigene `rules`-Logik definieren kannst, da es zu einer Kollision der Schlüssel kommen würde und ihre [Werte nicht zusammengeführt werden (nur in englischer Sprache verfügbar)](https://docs.gitlab.com/ee/ci/yaml/index.html#extends). \n\nDas führt dazu, dass eine Pipeline ausgeführt wird, die die `j.gitlab-ci.yml`-Jobs enthält, wenn `java/` aktualisiert wird, und `py.gitlab-ci.yml`-Jobs, wenn `python/` aktualisiert wird.\n\n## Der neue Ansatz: Bedingtes Einbeziehen von Pipeline-Dateien\n\n\u003C!-- blank line -->\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/6phvk8jioAo?si=y6ztZODvUtM-cHmZ\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\u003C!-- blank line -->\n\nIn GitLab 16.4 haben wir [`include` mit `rules:changes` für Pipelines (nur in englischer Sprache verfügbar)](https://docs.gitlab.com/ee/ci/yaml/includes.html#include-with-ruleschanges) eingeführt. Bisher konntest du `include` mit `rules:if` verwenden, aber nicht mit `rules:changes`. Das macht diese Aktualisierung extrem effizient. Jetzt kannst du einfach das Schlüsselwort `include` verwenden und die Monorepo-Regeln in deiner Projekt-Pipeline-Konfiguration definieren.\n\nNeue `.gitlab-ci.yml`:\n\n```\nstages:\n  - build\n  - test\n\ntop-level-job:\n  stage: build\n  script:\n    - echo \"Hello world...\"\n\ninclude:\n  - local: '/java/j.gitlab-ci.yml'\n    rules:\n      - changes:\n        - 'java/*'\n  - local: '/python/py.gitlab-ci.yml'\n    rules:\n      - changes:\n        - 'python/*'\n\n```\n\nJetzt kann sich die YAML jeder Anwendung nur noch auf das Erstellen und Testen des Codes dieser Anwendung konzentrieren, ohne dass ein versteckter Job wiederholt erweitert werden muss. Das ermöglicht mehr Flexibilität bei der Definition von Jobs und reduziert das Neuschreiben von Code für Entwickler(innen).\n\nNeue `j.gitlab-ci.yml`:\n\n```\nstages:\n  - build\n  - test\n  - deploy\n\njava-build-job:\n  stage: build\n  script:\n    - echo \"Building Java\"\n\njava-test-job:\n  stage: test\n  script:\n    - echo \"Testing Java\"\n\n```\n\nNeue `py.gitlab-ci.yml`:\n```\nstages:\n  - build\n  - test\n  - deploy\n\npython-build-job:\n  stage: build\n  script:\n    - echo \"Building Python\"\n\npython-test-job:\n  stage: test\n  script:\n    - echo \"Testing Python\"\n\n```\n\nDamit werden die Java- und Python-Jobs nur dann einbezogen, wenn ihre Verzeichnisse geändert werden. Bei deiner Implementierung solltest du bedenken, dass [Jobs unerwartet ausgeführt werden können, wenn du `changes` verwendest (nur in englischer Sprache verfügbar)](https://docs.gitlab.com/ee/ci/jobs/job_troubleshooting.html#jobs-or-pipelines-run-unexpectedly-when-using-changes). Die Regel „changes“ wird immer als wahr interpretiert, wenn ein neuer Branch oder ein neues Tag in GitLab gepusht wird, so dass alle Jobs unabhängig von der Definition von `rules:changes` beim ersten Push in einen Branch ausgeführt werden. Du kannst dieses Problem umgehen, indem du zuerst deinen Feature-Branch erstellst und dann eine Merge Request öffnest, um mit der Entwicklung zu beginnen, da der erste Push auf den Branch, wenn er erstellt wird, alle Jobs zur Ausführung zwingt.\n\nLetztlich sind Monorepos eine Strategie, die mit GitLab und CI/CD genutzt werden kann. Mit unserer neuen Funktion `include` mit `rules:changes` haben wir eine bessere bewährte Methode für die Nutzung von GitLab CI mit Monorepos. Um Monorepos zu verwenden, hol dir noch heute eine kostenlose Testversion von Gitlab Ultimate.\n\n## Weitere CI/CD-Ressourcen\n\n* [5 Tipps für die Verwaltung von Monorepos in GitLab (nur in englischer Sprache verfügbar)](https://about.gitlab.com/blog/tips-for-managing-monorepos-in-gitlab/)\n* [Der schnelle Einstieg in CI/CD (nur in englischer Sprache verfügbar)](https://about.gitlab.com/blog/how-to-learn-ci-cd-fast/)","engineering",[23,24],"CI/CD","tutorial","2025-05-26",{"slug":27,"featured":6,"template":28},"building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way","BlogPost","content:de-de:blog:building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way.yml","yaml","Building A Gitlab Ci Cd Pipeline For A Monorepo The Easy Way","content","de-de/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way.yml","de-de/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way","yml",{"_path":37,"_dir":38,"_draft":6,"_partial":6,"_locale":7,"data":39,"_id":451,"_type":30,"title":452,"_source":32,"_file":453,"_stem":454,"_extension":35},"/shared/de-de/main-navigation","de-de",{"logo":40,"freeTrial":45,"sales":50,"login":55,"items":60,"search":392,"minimal":428,"duo":442},{"config":41},{"href":42,"dataGaName":43,"dataGaLocation":44},"/de-de/","gitlab logo","header",{"text":46,"config":47},"Kostenlose Testversion anfordern",{"href":48,"dataGaName":49,"dataGaLocation":44},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":51,"config":52},"Vertrieb kontaktieren",{"href":53,"dataGaName":54,"dataGaLocation":44},"/de-de/sales/","sales",{"text":56,"config":57},"Anmelden",{"href":58,"dataGaName":59,"dataGaLocation":44},"https://gitlab.com/users/sign_in/","sign in",[61,105,203,208,313,373],{"text":62,"config":63,"cards":65,"footer":88},"Plattform",{"dataNavLevelOne":64},"platform",[66,72,80],{"title":62,"description":67,"link":68},"Die umfassendste KI-basierte DevSecOps-Plattform",{"text":69,"config":70},"Erkunde unsere Plattform",{"href":71,"dataGaName":64,"dataGaLocation":44},"/de-de/platform/",{"title":73,"description":74,"link":75},"GitLab Duo (KI)","Entwickle Software schneller mit KI in jeder Phase der Entwicklung",{"text":76,"config":77},"Lerne GitLab Duo kennen",{"href":78,"dataGaName":79,"dataGaLocation":44},"/de-de/gitlab-duo/","gitlab duo ai",{"title":81,"description":82,"link":83},"Gründe, die für GitLab sprechen","10 Gründe, warum Unternehmen sich für GitLab entscheiden",{"text":84,"config":85},"Mehr erfahren",{"href":86,"dataGaName":87,"dataGaLocation":44},"/de-de/why-gitlab/","why gitlab",{"title":89,"items":90},"Erste Schritte mit",[91,96,101],{"text":92,"config":93},"Platform Engineering",{"href":94,"dataGaName":95,"dataGaLocation":44},"/de-de/solutions/platform-engineering/","platform engineering",{"text":97,"config":98},"Entwicklererfahrung",{"href":99,"dataGaName":100,"dataGaLocation":44},"/de-de/developer-experience/","Developer experience",{"text":102,"config":103},"MLOps",{"href":104,"dataGaName":102,"dataGaLocation":44},"/de-de/topics/devops/the-role-of-ai-in-devops/",{"text":106,"left":107,"config":108,"link":110,"lists":114,"footer":185},"Produkt",true,{"dataNavLevelOne":109},"solutions",{"text":111,"config":112},"Alle Lösungen anzeigen",{"href":113,"dataGaName":109,"dataGaLocation":44},"/de-de/solutions/",[115,140,163],{"title":116,"description":117,"link":118,"items":123},"Automatisierung","CI/CD und Automatisierung zur Beschleunigung der Bereitstellung",{"config":119},{"icon":120,"href":121,"dataGaName":122,"dataGaLocation":44},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[124,127,131,136],{"text":23,"config":125},{"href":126,"dataGaLocation":44,"dataGaName":23},"/de-de/solutions/continuous-integration/",{"text":128,"config":129},"KI-unterstützte Entwicklung",{"href":78,"dataGaLocation":44,"dataGaName":130},"AI assisted development",{"text":132,"config":133},"Quellcodeverwaltung",{"href":134,"dataGaLocation":44,"dataGaName":135},"/de-de/solutions/source-code-management/","Source Code Management",{"text":137,"config":138},"Automatisierte Softwarebereitstellung",{"href":121,"dataGaLocation":44,"dataGaName":139},"Automated software delivery",{"title":141,"description":142,"link":143,"items":148},"Sicherheit","Entwickle schneller, ohne die Sicherheit zu gefährden",{"config":144},{"href":145,"dataGaName":146,"dataGaLocation":44,"icon":147},"/de-de/solutions/security-compliance/","security and compliance","ShieldCheckLight",[149,154,159],{"text":150,"config":151},"Application Security Testing",{"href":152,"dataGaName":153,"dataGaLocation":44},"/solutions/application-security-testing/","Application security testing",{"text":155,"config":156},"Schutz der Software-Lieferkette",{"href":157,"dataGaLocation":44,"dataGaName":158},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":160,"config":161},"Software Compliance",{"href":162,"dataGaName":160,"dataGaLocation":44},"/solutions/software-compliance/",{"title":164,"link":165,"items":170},"Bewertung",{"config":166},{"icon":167,"href":168,"dataGaName":169,"dataGaLocation":44},"DigitalTransformation","/de-de/solutions/visibility-measurement/","visibility and measurement",[171,175,180],{"text":172,"config":173},"Sichtbarkeit und Bewertung",{"href":168,"dataGaLocation":44,"dataGaName":174},"Visibility and Measurement",{"text":176,"config":177},"Wertstrommanagement",{"href":178,"dataGaLocation":44,"dataGaName":179},"/de-de/solutions/value-stream-management/","Value Stream Management",{"text":181,"config":182},"Analysen und Einblicke",{"href":183,"dataGaLocation":44,"dataGaName":184},"/de-de/solutions/analytics-and-insights/","Analytics and insights",{"title":186,"items":187},"GitLab für",[188,193,198],{"text":189,"config":190},"Enterprise",{"href":191,"dataGaLocation":44,"dataGaName":192},"/de-de/enterprise/","enterprise",{"text":194,"config":195},"Kleinunternehmen",{"href":196,"dataGaLocation":44,"dataGaName":197},"/de-de/small-business/","small business",{"text":199,"config":200},"den öffentlichen Sektor",{"href":201,"dataGaLocation":44,"dataGaName":202},"/de-de/solutions/public-sector/","public sector",{"text":204,"config":205},"Preise",{"href":206,"dataGaName":207,"dataGaLocation":44,"dataNavLevelOne":207},"/de-de/pricing/","pricing",{"text":209,"config":210,"link":212,"lists":216,"feature":300},"Ressourcen",{"dataNavLevelOne":211},"resources",{"text":213,"config":214},"Alle Ressourcen anzeigen",{"href":215,"dataGaName":211,"dataGaLocation":44},"/de-de/resources/",[217,250,272],{"title":218,"items":219},"Erste Schritte",[220,225,230,235,240,245],{"text":221,"config":222},"Installieren",{"href":223,"dataGaName":224,"dataGaLocation":44},"/de-de/install/","install",{"text":226,"config":227},"Kurzanleitungen",{"href":228,"dataGaName":229,"dataGaLocation":44},"/de-de/get-started/","quick setup checklists",{"text":231,"config":232},"Lernen",{"href":233,"dataGaLocation":44,"dataGaName":234},"https://university.gitlab.com/","learn",{"text":236,"config":237},"Produktdokumentation",{"href":238,"dataGaName":239,"dataGaLocation":44},"https://docs.gitlab.com/","product documentation",{"text":241,"config":242},"Best-Practice-Videos",{"href":243,"dataGaName":244,"dataGaLocation":44},"/de-de/getting-started-videos/","best practice videos",{"text":246,"config":247},"Integrationen",{"href":248,"dataGaName":249,"dataGaLocation":44},"/de-de/integrations/","integrations",{"title":251,"items":252},"Entdecken",[253,258,262,267],{"text":254,"config":255},"Kundenerfolge",{"href":256,"dataGaName":257,"dataGaLocation":44},"/de-de/customers/","customer success stories",{"text":259,"config":260},"Blog",{"href":261,"dataGaName":5,"dataGaLocation":44},"/de-de/blog/",{"text":263,"config":264},"Remote",{"href":265,"dataGaName":266,"dataGaLocation":44},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"text":268,"config":269},"TeamOps",{"href":270,"dataGaName":271,"dataGaLocation":44},"/de-de/teamops/","teamops",{"title":273,"items":274},"Vernetzen",[275,280,285,290,295],{"text":276,"config":277},"GitLab-Services",{"href":278,"dataGaName":279,"dataGaLocation":44},"/de-de/services/","services",{"text":281,"config":282},"Community",{"href":283,"dataGaName":284,"dataGaLocation":44},"/community/","community",{"text":286,"config":287},"Forum",{"href":288,"dataGaName":289,"dataGaLocation":44},"https://forum.gitlab.com/","forum",{"text":291,"config":292},"Veranstaltungen",{"href":293,"dataGaName":294,"dataGaLocation":44},"/events/","events",{"text":296,"config":297},"Partner",{"href":298,"dataGaName":299,"dataGaLocation":44},"/partners/","partners",{"backgroundColor":301,"textColor":302,"text":303,"image":304,"link":308},"#2f2a6b","#fff","Perspektiven für die Softwareentwicklung der Zukunft",{"altText":305,"config":306},"the source promo card",{"src":307},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.svg",{"text":309,"config":310},"Lies die News",{"href":311,"dataGaName":312,"dataGaLocation":44},"/de-de/the-source/","the source",{"text":314,"config":315,"lists":317},"Unternehmen",{"dataNavLevelOne":316},"company",[318],{"items":319},[320,325,331,333,338,343,348,353,358,363,368],{"text":321,"config":322},"Über",{"href":323,"dataGaName":324,"dataGaLocation":44},"/de-de/company/","about",{"text":326,"config":327,"footerGa":330},"Karriere",{"href":328,"dataGaName":329,"dataGaLocation":44},"/jobs/","jobs",{"dataGaName":329},{"text":291,"config":332},{"href":293,"dataGaName":294,"dataGaLocation":44},{"text":334,"config":335},"Geschäftsführung",{"href":336,"dataGaName":337,"dataGaLocation":44},"/company/team/e-group/","leadership",{"text":339,"config":340},"Team",{"href":341,"dataGaName":342,"dataGaLocation":44},"/company/team/","team",{"text":344,"config":345},"Handbuch",{"href":346,"dataGaName":347,"dataGaLocation":44},"https://handbook.gitlab.com/","handbook",{"text":349,"config":350},"Investor Relations",{"href":351,"dataGaName":352,"dataGaLocation":44},"https://ir.gitlab.com/","investor relations",{"text":354,"config":355},"Trust Center",{"href":356,"dataGaName":357,"dataGaLocation":44},"/de-de/security/","trust center",{"text":359,"config":360},"AI Transparency Center",{"href":361,"dataGaName":362,"dataGaLocation":44},"/de-de/ai-transparency-center/","ai transparency center",{"text":364,"config":365},"Newsletter",{"href":366,"dataGaName":367,"dataGaLocation":44},"/company/contact/","newsletter",{"text":369,"config":370},"Presse",{"href":371,"dataGaName":372,"dataGaLocation":44},"/press/","press",{"text":374,"config":375,"lists":376},"Kontakt",{"dataNavLevelOne":316},[377],{"items":378},[379,382,387],{"text":51,"config":380},{"href":53,"dataGaName":381,"dataGaLocation":44},"talk to sales",{"text":383,"config":384},"Support",{"href":385,"dataGaName":386,"dataGaLocation":44},"/support/","get help",{"text":388,"config":389},"Kundenportal",{"href":390,"dataGaName":391,"dataGaLocation":44},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":393,"login":394,"suggestions":401},"Schließen",{"text":395,"link":396},"Um Repositories und Projekte zu durchsuchen, melde dich an bei",{"text":397,"config":398},"gitlab.com",{"href":58,"dataGaName":399,"dataGaLocation":400},"search login","search",{"text":402,"default":403},"Vorschläge",[404,407,412,414,419,424],{"text":73,"config":405},{"href":78,"dataGaName":406,"dataGaLocation":400},"GitLab Duo (AI)",{"text":408,"config":409},"Code Suggestions (KI)",{"href":410,"dataGaName":411,"dataGaLocation":400},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":23,"config":413},{"href":126,"dataGaName":23,"dataGaLocation":400},{"text":415,"config":416},"GitLab auf AWS",{"href":417,"dataGaName":418,"dataGaLocation":400},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":420,"config":421},"GitLab auf Google Cloud",{"href":422,"dataGaName":423,"dataGaLocation":400},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":425,"config":426},"Warum GitLab?",{"href":86,"dataGaName":427,"dataGaLocation":400},"Why GitLab?",{"freeTrial":429,"mobileIcon":434,"desktopIcon":439},{"text":430,"config":431},"Kostenlos testen",{"href":432,"dataGaName":49,"dataGaLocation":433},"https://gitlab.com/-/trials/new/","nav",{"altText":435,"config":436},"GitLab-Symbol",{"src":437,"dataGaName":438,"dataGaLocation":433},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":435,"config":440},{"src":441,"dataGaName":438,"dataGaLocation":433},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"freeTrial":443,"mobileIcon":447,"desktopIcon":449},{"text":444,"config":445},"Erfahre mehr über GitLab Duo",{"href":78,"dataGaName":446,"dataGaLocation":433},"gitlab duo",{"altText":435,"config":448},{"src":437,"dataGaName":438,"dataGaLocation":433},{"altText":435,"config":450},{"src":441,"dataGaName":438,"dataGaLocation":433},"content:shared:de-de:main-navigation.yml","Main Navigation","shared/de-de/main-navigation.yml","shared/de-de/main-navigation",{"_path":456,"_dir":38,"_draft":6,"_partial":6,"_locale":7,"title":457,"button":458,"config":463,"_id":465,"_type":30,"_source":32,"_file":466,"_stem":467,"_extension":35},"/shared/de-de/banner","GitLab Duo Agent Platform ist jetzt in öffentlicher Beta!",{"text":459,"config":460},"Beta testen",{"href":461,"dataGaName":462,"dataGaLocation":44},"/de-de/gitlab-duo/agent-platform/","duo banner",{"layout":464},"release","content:shared:de-de:banner.yml","shared/de-de/banner.yml","shared/de-de/banner",{"_path":469,"_dir":38,"_draft":6,"_partial":6,"_locale":7,"data":470,"_id":673,"_type":30,"title":674,"_source":32,"_file":675,"_stem":676,"_extension":35},"/shared/de-de/main-footer",{"text":471,"source":472,"edit":478,"contribute":483,"config":488,"items":493,"minimal":665},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":473,"config":474},"Quelltext der Seite anzeigen",{"href":475,"dataGaName":476,"dataGaLocation":477},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":479,"config":480},"Diese Seite bearbeiten",{"href":481,"dataGaName":482,"dataGaLocation":477},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":484,"config":485},"Beteilige dich",{"href":486,"dataGaName":487,"dataGaLocation":477},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":489,"facebook":490,"youtube":491,"linkedin":492},"https://x.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[494,517,572,601,635],{"title":62,"links":495,"subMenu":500},[496],{"text":497,"config":498},"DevSecOps-Plattform",{"href":71,"dataGaName":499,"dataGaLocation":477},"devsecops platform",[501],{"title":204,"links":502},[503,507,512],{"text":504,"config":505},"Tarife anzeigen",{"href":206,"dataGaName":506,"dataGaLocation":477},"view plans",{"text":508,"config":509},"Vorteile von Premium",{"href":510,"dataGaName":511,"dataGaLocation":477},"/de-de/pricing/premium/","why premium",{"text":513,"config":514},"Vorteile von Ultimate",{"href":515,"dataGaName":516,"dataGaLocation":477},"/de-de/pricing/ultimate/","why ultimate",{"title":518,"links":519},"Lösungen",[520,525,528,530,535,540,544,547,550,555,557,559,562,567],{"text":521,"config":522},"Digitale Transformation",{"href":523,"dataGaName":524,"dataGaLocation":477},"/de-de/topics/digital-transformation/","digital transformation",{"text":526,"config":527},"Sicherheit und Compliance",{"href":152,"dataGaName":153,"dataGaLocation":477},{"text":137,"config":529},{"href":121,"dataGaName":122,"dataGaLocation":477},{"text":531,"config":532},"Agile Entwicklung",{"href":533,"dataGaName":534,"dataGaLocation":477},"/de-de/solutions/agile-delivery/","agile delivery",{"text":536,"config":537},"Cloud-Transformation",{"href":538,"dataGaName":539,"dataGaLocation":477},"/de-de/topics/cloud-native/","cloud transformation",{"text":541,"config":542},"SCM",{"href":134,"dataGaName":543,"dataGaLocation":477},"source code management",{"text":23,"config":545},{"href":126,"dataGaName":546,"dataGaLocation":477},"continuous integration & delivery",{"text":176,"config":548},{"href":178,"dataGaName":549,"dataGaLocation":477},"value stream management",{"text":551,"config":552},"GitOps",{"href":553,"dataGaName":554,"dataGaLocation":477},"/de-de/solutions/gitops/","gitops",{"text":189,"config":556},{"href":191,"dataGaName":192,"dataGaLocation":477},{"text":194,"config":558},{"href":196,"dataGaName":197,"dataGaLocation":477},{"text":560,"config":561},"Öffentlicher Sektor",{"href":201,"dataGaName":202,"dataGaLocation":477},{"text":563,"config":564},"Bildungswesen",{"href":565,"dataGaName":566,"dataGaLocation":477},"/de-de/solutions/education/","education",{"text":568,"config":569},"Finanzdienstleistungen",{"href":570,"dataGaName":571,"dataGaLocation":477},"/de-de/solutions/finance/","financial services",{"title":209,"links":573},[574,576,578,580,583,585,587,589,591,593,595,597,599],{"text":221,"config":575},{"href":223,"dataGaName":224,"dataGaLocation":477},{"text":226,"config":577},{"href":228,"dataGaName":229,"dataGaLocation":477},{"text":231,"config":579},{"href":233,"dataGaName":234,"dataGaLocation":477},{"text":236,"config":581},{"href":238,"dataGaName":582,"dataGaLocation":477},"docs",{"text":259,"config":584},{"href":261,"dataGaName":5,"dataGaLocation":477},{"text":254,"config":586},{"href":256,"dataGaName":257,"dataGaLocation":477},{"text":263,"config":588},{"href":265,"dataGaName":266,"dataGaLocation":477},{"text":276,"config":590},{"href":278,"dataGaName":279,"dataGaLocation":477},{"text":268,"config":592},{"href":270,"dataGaName":271,"dataGaLocation":477},{"text":281,"config":594},{"href":283,"dataGaName":284,"dataGaLocation":477},{"text":286,"config":596},{"href":288,"dataGaName":289,"dataGaLocation":477},{"text":291,"config":598},{"href":293,"dataGaName":294,"dataGaLocation":477},{"text":296,"config":600},{"href":298,"dataGaName":299,"dataGaLocation":477},{"title":314,"links":602},[603,605,607,609,611,613,615,619,624,626,628,630],{"text":321,"config":604},{"href":323,"dataGaName":316,"dataGaLocation":477},{"text":326,"config":606},{"href":328,"dataGaName":329,"dataGaLocation":477},{"text":334,"config":608},{"href":336,"dataGaName":337,"dataGaLocation":477},{"text":339,"config":610},{"href":341,"dataGaName":342,"dataGaLocation":477},{"text":344,"config":612},{"href":346,"dataGaName":347,"dataGaLocation":477},{"text":349,"config":614},{"href":351,"dataGaName":352,"dataGaLocation":477},{"text":616,"config":617},"Sustainability",{"href":618,"dataGaName":616,"dataGaLocation":477},"/sustainability/",{"text":620,"config":621},"Vielfalt, Inklusion und Zugehörigkeit",{"href":622,"dataGaName":623,"dataGaLocation":477},"/de-de/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":354,"config":625},{"href":356,"dataGaName":357,"dataGaLocation":477},{"text":364,"config":627},{"href":366,"dataGaName":367,"dataGaLocation":477},{"text":369,"config":629},{"href":371,"dataGaName":372,"dataGaLocation":477},{"text":631,"config":632},"Transparenzerklärung zu moderner Sklaverei",{"href":633,"dataGaName":634,"dataGaLocation":477},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":636,"links":637},"Nimm Kontakt auf",[638,641,643,645,650,655,660],{"text":639,"config":640},"Sprich mit einem Experten/einer Expertin",{"href":53,"dataGaName":54,"dataGaLocation":477},{"text":383,"config":642},{"href":385,"dataGaName":386,"dataGaLocation":477},{"text":388,"config":644},{"href":390,"dataGaName":391,"dataGaLocation":477},{"text":646,"config":647},"Status",{"href":648,"dataGaName":649,"dataGaLocation":477},"https://status.gitlab.com/","status",{"text":651,"config":652},"Nutzungsbedingungen",{"href":653,"dataGaName":654,"dataGaLocation":477},"/terms/","terms of use",{"text":656,"config":657},"Datenschutzerklärung",{"href":658,"dataGaName":659,"dataGaLocation":477},"/de-de/privacy/","privacy statement",{"text":661,"config":662},"Cookie-Einstellungen",{"dataGaName":663,"dataGaLocation":477,"id":664,"isOneTrustButton":107},"cookie preferences","ot-sdk-btn",{"items":666},[667,669,671],{"text":651,"config":668},{"href":653,"dataGaName":654,"dataGaLocation":477},{"text":656,"config":670},{"href":658,"dataGaName":659,"dataGaLocation":477},{"text":661,"config":672},{"dataGaName":663,"dataGaLocation":477,"id":664,"isOneTrustButton":107},"content:shared:de-de:main-footer.yml","Main Footer","shared/de-de/main-footer.yml","shared/de-de/main-footer",[678],{"_path":679,"_dir":680,"_draft":6,"_partial":6,"_locale":7,"content":681,"config":685,"_id":687,"_type":30,"title":18,"_source":32,"_file":688,"_stem":689,"_extension":35},"/en-us/blog/authors/sam-morris","authors",{"name":18,"config":682},{"headshot":683,"ctfId":684},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749660148/Blog/Author%20Headshots/sam_morris.png","6JTrhUIqSCU30Y9KZOaan8",{"template":686},"BlogAuthor","content:en-us:blog:authors:sam-morris.yml","en-us/blog/authors/sam-morris.yml","en-us/blog/authors/sam-morris",{"_path":691,"_dir":38,"_draft":6,"_partial":6,"_locale":7,"header":692,"eyebrow":693,"blurb":694,"button":695,"secondaryButton":699,"_id":701,"_type":30,"title":702,"_source":32,"_file":703,"_stem":704,"_extension":35},"/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":46,"config":696},{"href":697,"dataGaName":49,"dataGaLocation":698},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":51,"config":700},{"href":53,"dataGaName":54,"dataGaLocation":698},"content:shared:de-de:next-steps.yml","Next Steps","shared/de-de/next-steps.yml","shared/de-de/next-steps",1759517324235]