[{"data":1,"prerenderedAt":1088},["ShallowReactive",2],{"/de-de/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way":3,"navigation-de-de":303,"banner-de-de":734,"footer-de-de":742,"blog-post-authors-de-de-Sam Morris":983,"blog-related-posts-de-de-building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way":998,"blog-promotions-de-de":1024,"next-steps-de-de":1078},{"id":4,"title":5,"authors":6,"body":8,"category":280,"date":281,"description":282,"extension":283,"externalUrl":284,"faq":284,"featured":285,"heroImage":286,"meta":287,"navigation":288,"path":289,"seo":290,"slug":295,"stem":296,"tags":297,"template":300,"updatedDate":301,"__hash__":302},"blogPosts/de-de/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way.md","Einfaches Erstellen einer GitLab-CI/CD-Pipeline für ein Monorepo",[7],"Sam Morris",{"type":9,"value":10,"toc":273},"minimark",[11,22,27,30,53,57,60,71,76,86,95,100,106,111,117,144,148,161,189,194,200,203,207,213,217,223,239,259,263],[12,13,14,15,21],"p",{},"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 ",[16,17,20],"a",{"href":18,"rel":19},"https://about.gitlab.com/de-de/topics/ci-cd/",[],"CI/CD-Pipeline von GitLab"," nicht voll ausschöpfen … bis jetzt!",[23,24,26],"h2",{"id":25},"der-idealfall-cicd-in-einem-monorepo","Der Idealfall: CI/CD in einem Monorepo",[12,28,29],{},"Da 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.",[12,31,32,33,37,38,43,44,46,47,52],{},"Der technische Ansatz hierfür wäre eine ",[34,35,36],"code",{},".gitlab-ci.yml","-",[16,39,42],{"href":40,"rel":41},"https://about.gitlab.com/de-de/topics/ci-cd/pipeline-as-code/",[],"Pipeline-Konfigurationsdatei"," auf Projektebene, die eine bestimmte YAML-Datei enthält, die auf Änderungen in einem bestimmten Verzeichnis basiert. Die ",[34,45,36],{},"-Pipeline dient als Steuerungsebene, die auf der Grundlage der Änderungen am Code die entsprechende ",[16,48,51],{"href":49,"rel":50},"https://about.gitlab.com/de-de/topics/ci-cd/cicd-pipeline/",[],"CI/CD-Pipeline"," anstößt.",[23,54,56],{"id":55},"der-legacy-ansatz","Der Legacy-Ansatz",[12,58,59],{},"Vor 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.",[12,61,62,63,66,67,70],{},"In unserem Monorepo-Projekt haben wir zwei Verzeichnisse für verschiedene Anwendungen. In diesem Beispiel gibt es die Verzeichnisse ",[34,64,65],{},"java"," und ",[34,68,69],{},"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.",[12,72,73,75],{},[34,74,36],{},":",[77,78,84],"pre",{"className":79,"code":81,"language":82,"meta":83},[80],"language-text","stages:\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","text","",[34,85,81],{"__ignoreMap":83},[12,87,88,89,94],{},"In 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. ",[16,90,93],{"href":91,"rel":92},"https://docs.gitlab.com/ci/jobs/#hide-jobs",[],"Versteckte Jobs (nur in englischer Sprache verfügbar"," 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.",[12,96,97,75],{},[34,98,99],{},"j.gitlab-ci.yml",[77,101,104],{"className":102,"code":103,"language":82,"meta":83},[80],"stages:\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",[34,105,103],{"__ignoreMap":83},[12,107,108,75],{},[34,109,110],{},"py.gitlab-ci.yml",[77,112,115],{"className":113,"code":114,"language":82,"meta":83},[80],"stages:\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",[34,116,114],{"__ignoreMap":83},[12,118,119,120,123,124,129,130,132,133,136,137,139,140,143],{},"Das 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 ",[34,121,122],{},"rules","-Logik definieren kannst, da es zu einer Kollision der Schlüssel kommen würde und ihre ",[16,125,128],{"href":126,"rel":127},"https://docs.gitlab.com/ci/yaml/#extends",[],"Werte nicht zusammengeführt werden (nur in englischer Sprache verfügbar)",".\nDas führt dazu, dass eine Pipeline ausgeführt wird, die die ",[34,131,99],{},"-Jobs enthält, wenn ",[34,134,135],{},"java/"," aktualisiert wird, und ",[34,138,110],{},"-Jobs, wenn ",[34,141,142],{},"python/"," aktualisiert wird.",[23,145,147],{"id":146},"der-neue-ansatz-bedingtes-einbeziehen-von-pipeline-dateien","Der neue Ansatz: Bedingtes Einbeziehen von Pipeline-Dateien",[149,150,153,154],"figure",{"className":151},[152],"video_container","\n  ",[155,156,160],"iframe",{"src":157,"frameBorder":158,"allowFullScreen":159},"https://www.youtube.com/embed/6phvk8jioAo?si=y6ztZODvUtM-cHmZ","0","true"," ",[12,162,163,164,176,177,171,179,182,183,185,186,188],{},"In GitLab 16.4 haben wir ",[16,165,168,171,172,175],{"href":166,"rel":167},"https://docs.gitlab.com/ci/yaml/includes/#include-with-ruleschanges",[],[34,169,170],{},"include"," mit ",[34,173,174],{},"rules:changes"," für Pipelines (nur in englischer Sprache verfügbar)"," eingeführt. Bisher konntest du ",[34,178,170],{},[34,180,181],{},"rules:if"," verwenden, aber nicht mit ",[34,184,174],{},". Das macht diese Aktualisierung extrem effizient. Jetzt kannst du einfach das Schlüsselwort ",[34,187,170],{}," verwenden und die Monorepo-Regeln in deiner Projekt-Pipeline-Konfiguration definieren.",[12,190,191,192,75],{},"Neue ",[34,193,36],{},[77,195,198],{"className":196,"code":197,"language":82,"meta":83},[80],"stages:\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",[34,199,197],{"__ignoreMap":83},[12,201,202],{},"Jetzt 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).",[12,204,191,205,75],{},[34,206,99],{},[77,208,211],{"className":209,"code":210,"language":82,"meta":83},[80],"stages:\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",[34,212,210],{"__ignoreMap":83},[12,214,191,215,75],{},[34,216,110],{},[77,218,221],{"className":219,"code":220,"language":82,"meta":83},[80],"stages:\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",[34,222,220],{"__ignoreMap":83},[12,224,225,226,235,236,238],{},"Damit werden die Java- und Python-Jobs nur dann einbezogen, wenn ihre Verzeichnisse geändert werden. Bei deiner Implementierung solltest du bedenken, dass ",[16,227,230,231,234],{"href":228,"rel":229},"https://docs.gitlab.com/ci/jobs/job_troubleshooting/#jobs-or-pipelines-run-unexpectedly-when-using-changes",[],"Jobs unerwartet ausgeführt werden können, wenn du ",[34,232,233],{},"changes"," verwendest (nur in englischer Sprache verfügbar)",". 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 ",[34,237,174],{}," 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.",[12,240,241,242,171,244,246,247,252,253,258],{},"Letztlich sind Monorepos eine Strategie, die mit GitLab und CI/CD genutzt werden kann. Mit unserer neuen Funktion ",[34,243,170],{},[34,245,174],{}," haben wir eine bessere ",[16,248,251],{"href":249,"rel":250},"https://about.gitlab.com/de-de/topics/ci-cd/continuous-integration-best-practices/",[],"bewährte Methode"," für die Nutzung von GitLab CI mit Monorepos. Um Monorepos zu verwenden, hol dir noch heute eine ",[16,254,257],{"href":255,"rel":256},"https://about.gitlab.com/de-de/free-trial/",[],"kostenlose Testversion"," von GitLab Ultimate.",[23,260,262],{"id":261},"weitere-cicd-ressourcen","Weitere CI/CD-Ressourcen",[264,265,266,270],"ul",{},[267,268,269],"li",{},"5 Tipps für die Verwaltung von Monorepos in GitLab (nur in englischer Sprache verfügbar)",[267,271,272],{},"Der schnelle Einstieg in CI/CD (nur in englischer Sprache verfügbar)",{"title":83,"searchDepth":274,"depth":274,"links":275},2,[276,277,278,279],{"id":25,"depth":274,"text":26},{"id":55,"depth":274,"text":56},{"id":146,"depth":274,"text":147},{"id":261,"depth":274,"text":262},"engineering","2024-07-30","Erfahre, wie du eine GitLab-CI/CD-Pipeline für ein Monorepo erstellst, um mehrere Anwendungen in einem Repository zu hosten.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749660151/Blog/Hero%20Images/blog-image-template-1800x945__26_.png",{},true,"/de-de/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way",{"title":291,"description":282,"ogTitle":5,"ogDescription":282,"noIndex":285,"ogImage":286,"ogUrl":292,"ogSiteName":293,"ogType":294,"canonicalUrls":292},"GitLab CI/CD-Pipeline für ein Monorepo einrichten","https://about.gitlab.com/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way","https://about.gitlab.com","article","building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way","de-de/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way",[298,299],"CI/CD","tutorial","BlogPost","2025-05-26","Va5m8kO-wcpQrTvTgrcb2hFbd24VlRiwFJ6zxCTV_G0",{"logo":304,"freeTrial":309,"sales":314,"login":319,"items":324,"search":652,"minimal":686,"duo":704,"switchNav":713,"pricingDeployment":724},{"config":305},{"href":306,"dataGaName":307,"dataGaLocation":308},"/de-de/","gitlab logo","header",{"text":310,"config":311},"Kostenlose Testversion anfordern",{"href":312,"dataGaName":313,"dataGaLocation":308},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de&glm_content=default-saas-trial/","free trial",{"text":315,"config":316},"Demo anfordern",{"href":317,"dataGaName":318,"dataGaLocation":308},"/de-de/sales/?contact-topic=request-demo","sales",{"text":320,"config":321},"Anmelden",{"href":322,"dataGaName":323,"dataGaLocation":308},"https://gitlab.com/users/sign_in/","sign in",[325,354,455,460,574,630],{"text":326,"config":327,"menu":329},"Plattform",{"dataNavLevelOne":328},"platform",{"type":330,"columns":331},"cards",[332,338,346],{"title":326,"description":333,"link":334},"Die intelligente Orchestrierungsplattform für DevSecOps",{"text":335,"config":336},"Die Plattform erkunden",{"href":337,"dataGaName":328,"dataGaLocation":308},"/de-de/platform/",{"title":339,"description":340,"link":341},"GitLab Duo Agent Platform","Agentische KI für den gesamten Software-Lebenszyklus",{"text":342,"config":343},"Lerne GitLab Duo kennen",{"href":344,"dataGaName":345,"dataGaLocation":308},"/de-de/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":347,"description":348,"link":349},"Warum GitLab?","Erfahre, warum sich Unternehmen für GitLab entscheiden",{"text":350,"config":351},"Mehr erfahren",{"href":352,"dataGaName":353,"dataGaLocation":308},"/de-de/why-gitlab/","why gitlab",{"text":355,"left":288,"config":356,"menu":358},"Produkt",{"dataNavLevelOne":357},"solutions",{"type":359,"link":360,"columns":364,"feature":434},"lists",{"text":361,"config":362},"Alle Lösungen anzeigen",{"href":363,"dataGaName":357,"dataGaLocation":308},"/de-de/solutions/",[365,389,412],{"title":366,"description":367,"link":368,"items":373},"Automatisierung","CI/CD und Automatisierung zur Beschleunigung der Bereitstellung",{"config":369},{"icon":370,"href":371,"dataGaName":372,"dataGaLocation":308},"AutomatedCodeAlt","/de-de/solutions/delivery-automation/","automated software delivery",[374,377,380,385],{"text":298,"config":375},{"href":376,"dataGaLocation":308,"dataGaName":298},"/de-de/solutions/continuous-integration/",{"text":339,"config":378},{"href":344,"dataGaLocation":308,"dataGaName":379},"gitlab duo agent platform - product menu",{"text":381,"config":382},"Quellcodeverwaltung",{"href":383,"dataGaLocation":308,"dataGaName":384},"/de-de/solutions/source-code-management/","Source Code Management",{"text":386,"config":387},"Automatische Softwarebereitstellung",{"href":371,"dataGaLocation":308,"dataGaName":388},"Automated software delivery",{"title":390,"description":391,"link":392,"items":397},"Sicherheit","Entwickle Code schneller ohne Abstriche bei der Sicherheit",{"config":393},{"href":394,"dataGaName":395,"dataGaLocation":308,"icon":396},"/de-de/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[398,402,407],{"text":399,"config":400},"Anwendungssicherheitstests",{"href":394,"dataGaName":401,"dataGaLocation":308},"Application security testing",{"text":403,"config":404},"Schutz der Software-Lieferkette",{"href":405,"dataGaLocation":308,"dataGaName":406},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":408,"config":409},"Software-Compliance",{"href":410,"dataGaName":411,"dataGaLocation":308},"/de-de/solutions/software-compliance/","software compliance",{"title":413,"link":414,"items":419},"Messung",{"config":415},{"icon":416,"href":417,"dataGaName":418,"dataGaLocation":308},"DigitalTransformation","/de-de/solutions/visibility-measurement/","visibility and measurement",[420,424,429],{"text":421,"config":422},"Sichtbarkeit und Messung",{"href":417,"dataGaLocation":308,"dataGaName":423},"Visibility and Measurement",{"text":425,"config":426},"Wertstrommanagement",{"href":427,"dataGaLocation":308,"dataGaName":428},"/de-de/solutions/value-stream-management/","Value Stream Management",{"text":430,"config":431},"Analysen und Einblicke",{"href":432,"dataGaLocation":308,"dataGaName":433},"/de-de/solutions/analytics-and-insights/","Analytics and insights",{"title":435,"type":359,"items":436},"GitLab für",[437,443,449],{"text":438,"config":439},"Enterprise",{"icon":440,"href":441,"dataGaLocation":308,"dataGaName":442},"Building","/de-de/enterprise/","enterprise",{"text":444,"config":445},"Kleinunternehmen",{"icon":446,"href":447,"dataGaLocation":308,"dataGaName":448},"Work","/de-de/small-business/","small business",{"text":450,"config":451},"Öffentlicher Sektor",{"icon":452,"href":453,"dataGaLocation":308,"dataGaName":454},"Organization","/de-de/solutions/public-sector/","public sector",{"text":456,"config":457},"Preise",{"href":458,"dataGaName":459,"dataGaLocation":308,"dataNavLevelOne":459},"/de-de/pricing/","pricing",{"text":461,"config":462,"menu":464},"Ressourcen",{"dataNavLevelOne":463},"resources",{"type":359,"link":465,"columns":469,"feature":563},{"text":466,"config":467},"Alle Ressourcen anzeigen",{"href":468,"dataGaName":463,"dataGaLocation":308},"/de-de/resources/",[470,503,530],{"title":471,"items":472},"Erste Schritte",[473,478,483,488,493,498],{"text":474,"config":475},"Installieren",{"href":476,"dataGaName":477,"dataGaLocation":308},"/de-de/install/","install",{"text":479,"config":480},"Kurzanleitungen",{"href":481,"dataGaName":482,"dataGaLocation":308},"/de-de/get-started/","quick setup checklists",{"text":484,"config":485},"Lernen",{"href":486,"dataGaLocation":308,"dataGaName":487},"https://university.gitlab.com/","learn",{"text":489,"config":490},"Produktdokumentation",{"href":491,"dataGaName":492,"dataGaLocation":308},"https://docs.gitlab.com/","product documentation",{"text":494,"config":495},"Best-Practice-Videos",{"href":496,"dataGaName":497,"dataGaLocation":308},"/de-de/getting-started-videos/","best practice videos",{"text":499,"config":500},"Integrationen",{"href":501,"dataGaName":502,"dataGaLocation":308},"/de-de/integrations/","integrations",{"title":504,"items":505},"Entdecken",[506,511,516,521,525],{"text":507,"config":508},"Kundenerfolge",{"href":509,"dataGaName":510,"dataGaLocation":308},"/de-de/customers/","customer success stories",{"text":512,"config":513},"Blog",{"href":514,"dataGaName":515,"dataGaLocation":308},"/de-de/blog/","blog",{"text":517,"config":518},"Demo-Hub",{"href":519,"dataGaName":520,"dataGaLocation":308},"/de-de/demo-hub/","demo hub",{"text":522,"config":523},"The Source",{"href":524,"dataGaName":515,"dataGaLocation":308},"/de-de/the-source/",{"text":526,"config":527},"Remote",{"href":528,"dataGaName":529,"dataGaLocation":308},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":531,"items":532},"Vernetzen",[533,538,543,548,553,558],{"text":534,"config":535},"GitLab-Services",{"href":536,"dataGaName":537,"dataGaLocation":308},"/de-de/services/","services",{"text":539,"config":540},"Beitragen",{"href":541,"dataGaName":542,"dataGaLocation":308},"https://contributors.gitlab.com","contribute",{"text":544,"config":545},"Community",{"href":546,"dataGaName":547,"dataGaLocation":308},"/community/","community",{"text":549,"config":550},"Forum",{"href":551,"dataGaName":552,"dataGaLocation":308},"https://forum.gitlab.com/","forum",{"text":554,"config":555},"Veranstaltungen",{"href":556,"dataGaName":557,"dataGaLocation":308},"/events/","events",{"text":559,"config":560},"Partner",{"href":561,"dataGaName":562,"dataGaLocation":308},"/de-de/partners/","partners",{"config":564,"title":567,"text":568,"link":569},{"background":565,"textColor":566},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Neues bei GitLab","Über die neuesten Funktionen und Verbesserungen auf dem Laufenden bleiben.",{"text":570,"config":571},"Aktuelle Nachrichten",{"href":572,"dataGaName":573,"dataGaLocation":308},"/de-de/whats-new/","whats new",{"text":575,"config":576,"menu":578},"Unternehmen",{"dataNavLevelOne":577},"company",{"type":359,"columns":579},[580],{"items":581},[582,587,593,595,600,605,610,615,620,625],{"text":583,"config":584},"Über",{"href":585,"dataGaName":586,"dataGaLocation":308},"/de-de/company/","about",{"text":588,"config":589,"footerGa":592},"Karriere",{"href":590,"dataGaName":591,"dataGaLocation":308},"/jobs/","jobs",{"dataGaName":591},{"text":554,"config":594},{"href":556,"dataGaName":557,"dataGaLocation":308},{"text":596,"config":597},"Geschäftsführung",{"href":598,"dataGaName":599,"dataGaLocation":308},"/company/team/e-group/","leadership",{"text":601,"config":602},"Handbuch",{"href":603,"dataGaName":604,"dataGaLocation":308},"https://handbook.gitlab.com/","handbook",{"text":606,"config":607},"Investor Relations",{"href":608,"dataGaName":609,"dataGaLocation":308},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":611,"config":612},"Trust Center",{"href":613,"dataGaName":614,"dataGaLocation":308},"/de-de/security/","trust center",{"text":616,"config":617},"AI Transparency Center",{"href":618,"dataGaName":619,"dataGaLocation":308},"/de-de/ai-transparency-center/","ai transparency center",{"text":621,"config":622},"Newsletter",{"href":623,"dataGaName":624,"dataGaLocation":308},"/company/contact/#contact-forms","newsletter",{"text":626,"config":627},"Presse",{"href":628,"dataGaName":629,"dataGaLocation":308},"/press/","press",{"text":631,"config":632,"menu":633},"Kontakt",{"dataNavLevelOne":577},{"type":359,"columns":634},[635],{"items":636},[637,642,647],{"text":638,"config":639},"Vertrieb kontaktieren",{"href":640,"dataGaName":641,"dataGaLocation":308},"/de-de/sales/","talk to sales",{"text":643,"config":644},"Support-Portal",{"href":645,"dataGaName":646,"dataGaLocation":308},"https://support.gitlab.com/hc/en-us","support portal",{"text":648,"config":649},"Kundenportal",{"href":650,"dataGaName":651,"dataGaLocation":308},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":653,"login":654,"suggestions":661},"Schließen",{"text":655,"link":656},"Um Repositorys und Projekte zu durchsuchen, melde dich an bei",{"text":657,"config":658},"gitlab.com",{"href":322,"dataGaName":659,"dataGaLocation":660},"search login","search",{"text":662,"default":663},"Vorschläge",[664,666,671,673,678,683],{"text":339,"config":665},{"href":344,"dataGaName":339,"dataGaLocation":660},{"text":667,"config":668},"Codevorschläge (KI)",{"href":669,"dataGaName":670,"dataGaLocation":660},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":298,"config":672},{"href":376,"dataGaName":298,"dataGaLocation":660},{"text":674,"config":675},"GitLab auf AWS",{"href":676,"dataGaName":677,"dataGaLocation":660},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":679,"config":680},"GitLab auf Google Cloud",{"href":681,"dataGaName":682,"dataGaLocation":660},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":347,"config":684},{"href":352,"dataGaName":685,"dataGaLocation":660},"Why GitLab?",{"freeTrial":687,"mobileIcon":692,"desktopIcon":697,"secondaryButton":700},{"text":688,"config":689},"Kostenlos testen",{"href":690,"dataGaName":313,"dataGaLocation":691},"https://gitlab.com/-/trials/new/","nav",{"altText":693,"config":694},"GitLab-Symbol",{"src":695,"dataGaName":696,"dataGaLocation":691},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":693,"config":698},{"src":699,"dataGaName":696,"dataGaLocation":691},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":471,"config":701},{"href":702,"dataGaName":703,"dataGaLocation":691},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de/get-started/","get started",{"freeTrial":705,"mobileIcon":709,"desktopIcon":711},{"text":706,"config":707},"Mehr über GitLab Duo erfahren",{"href":344,"dataGaName":708,"dataGaLocation":691},"gitlab duo",{"altText":693,"config":710},{"src":695,"dataGaName":696,"dataGaLocation":691},{"altText":693,"config":712},{"src":699,"dataGaName":696,"dataGaLocation":691},{"button":714,"mobileIcon":719,"desktopIcon":721},{"text":715,"config":716},"/Option",{"href":717,"dataGaName":718,"dataGaLocation":691},"#contact","switch",{"altText":693,"config":720},{"src":695,"dataGaName":696,"dataGaLocation":691},{"altText":693,"config":722},{"src":723,"dataGaName":696,"dataGaLocation":691},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":725,"mobileIcon":730,"desktopIcon":732},{"text":726,"config":727},"Zurück zur Preisübersicht",{"href":458,"dataGaName":728,"dataGaLocation":691,"icon":729},"back to pricing","GoBack",{"altText":693,"config":731},{"src":695,"dataGaName":696,"dataGaLocation":691},{"altText":693,"config":733},{"src":699,"dataGaName":696,"dataGaLocation":691},{"title":735,"button":736,"config":740},"GitLab Orbit ist da: die Kontextebene für KI-Agenten",{"text":350,"config":737},{"href":738,"dataGaName":739,"dataGaLocation":308},"/de-de/gitlab-orbit/","orbit",{"layout":741,"disabled":285},"release",{"data":743},{"text":744,"source":745,"edit":751,"contribute":756,"config":761,"items":766,"minimal":972},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":746,"config":747},"Quelltext der Seite anzeigen",{"href":748,"dataGaName":749,"dataGaLocation":750},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":752,"config":753},"Diese Seite bearbeiten",{"href":754,"dataGaName":755,"dataGaLocation":750},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":757,"config":758},"Beteilige dich",{"href":759,"dataGaName":760,"dataGaLocation":750},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":762,"facebook":763,"youtube":764,"linkedin":765},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[767,812,865,907,939],{"title":456,"links":768,"subMenu":783},[769,773,778],{"text":770,"config":771},"Tarife anzeigen",{"href":458,"dataGaName":772,"dataGaLocation":750},"view plans",{"text":774,"config":775},"Vorteile von Premium",{"href":776,"dataGaName":777,"dataGaLocation":750},"/de-de/pricing/premium/","why premium",{"text":779,"config":780},"Vorteile von Ultimate",{"href":781,"dataGaName":782,"dataGaLocation":750},"/de-de/pricing/ultimate/","why ultimate",[784],{"title":631,"links":785},[786,788,790,792,797,802,807],{"text":638,"config":787},{"href":640,"dataGaName":318,"dataGaLocation":750},{"text":643,"config":789},{"href":645,"dataGaName":646,"dataGaLocation":750},{"text":648,"config":791},{"href":650,"dataGaName":651,"dataGaLocation":750},{"text":793,"config":794},"Status",{"href":795,"dataGaName":796,"dataGaLocation":750},"https://status.gitlab.com/","status",{"text":798,"config":799},"Nutzungsbedingungen",{"href":800,"dataGaName":801,"dataGaLocation":750},"/terms/","terms of use",{"text":803,"config":804},"Datenschutzerklärung",{"href":805,"dataGaName":806,"dataGaLocation":750},"/de-de/privacy/","privacy statement",{"text":808,"config":809},"Cookie-Einstellungen",{"dataGaName":810,"dataGaLocation":750,"id":811,"isOneTrustButton":288},"cookie preferences","ot-sdk-btn",{"title":355,"links":813,"subMenu":822},[814,818],{"text":815,"config":816},"DevSecOps-Plattform",{"href":337,"dataGaName":817,"dataGaLocation":750},"devsecops platform",{"text":819,"config":820},"KI-unterstützte Entwicklung",{"href":344,"dataGaName":821,"dataGaLocation":750},"ai-assisted development",[823],{"title":824,"links":825},"Themen",[826,830,835,840,845,850,855,860],{"text":298,"config":827},{"href":828,"dataGaName":829,"dataGaLocation":750},"/de-de/topics/ci-cd/","cicd",{"text":831,"config":832},"GitOps",{"href":833,"dataGaName":834,"dataGaLocation":750},"/de-de/topics/gitops/","gitops",{"text":836,"config":837},"DevOps",{"href":838,"dataGaName":839,"dataGaLocation":750},"/de-de/topics/devops/","devops",{"text":841,"config":842},"Versionskontrolle",{"href":843,"dataGaName":844,"dataGaLocation":750},"/de-de/topics/version-control/","version control",{"text":846,"config":847},"DevSecOps",{"href":848,"dataGaName":849,"dataGaLocation":750},"/de-de/topics/devsecops/","devsecops",{"text":851,"config":852},"Cloud-nativ",{"href":853,"dataGaName":854,"dataGaLocation":750},"/de-de/topics/cloud-native/","cloud native",{"text":856,"config":857},"KI für das Programmieren",{"href":858,"dataGaName":859,"dataGaLocation":750},"/de-de/topics/devops/ai-for-coding/","ai for coding",{"text":861,"config":862},"Agentische KI",{"href":863,"dataGaName":864,"dataGaLocation":750},"/de-de/topics/agentic-ai/","agentic ai",{"title":866,"links":867},"Lösungen",[868,871,873,878,882,885,888,891,893,895,897,902],{"text":399,"config":869},{"href":394,"dataGaName":870,"dataGaLocation":750},"Application Security Testing",{"text":386,"config":872},{"href":371,"dataGaName":372,"dataGaLocation":750},{"text":874,"config":875},"Agile Entwicklung",{"href":876,"dataGaName":877,"dataGaLocation":750},"/de-de/solutions/agile-delivery/","agile delivery",{"text":879,"config":880},"SCM",{"href":383,"dataGaName":881,"dataGaLocation":750},"source code management",{"text":298,"config":883},{"href":376,"dataGaName":884,"dataGaLocation":750},"continuous integration & delivery",{"text":425,"config":886},{"href":427,"dataGaName":887,"dataGaLocation":750},"value stream management",{"text":831,"config":889},{"href":890,"dataGaName":834,"dataGaLocation":750},"/de-de/solutions/gitops/",{"text":438,"config":892},{"href":441,"dataGaName":442,"dataGaLocation":750},{"text":444,"config":894},{"href":447,"dataGaName":448,"dataGaLocation":750},{"text":450,"config":896},{"href":453,"dataGaName":454,"dataGaLocation":750},{"text":898,"config":899},"Bildungswesen",{"href":900,"dataGaName":901,"dataGaLocation":750},"/de-de/solutions/education/","education",{"text":903,"config":904},"Finanzdienstleistungen",{"href":905,"dataGaName":906,"dataGaLocation":750},"/de-de/solutions/finance/","financial services",{"title":461,"links":908},[909,911,913,915,918,920,923,925,927,929,931,933,935,937],{"text":474,"config":910},{"href":476,"dataGaName":477,"dataGaLocation":750},{"text":479,"config":912},{"href":481,"dataGaName":482,"dataGaLocation":750},{"text":484,"config":914},{"href":486,"dataGaName":487,"dataGaLocation":750},{"text":489,"config":916},{"href":491,"dataGaName":917,"dataGaLocation":750},"docs",{"text":512,"config":919},{"href":514,"dataGaName":515,"dataGaLocation":750},{"text":921,"config":922},"Neuerungen",{"href":572,"dataGaName":573,"dataGaLocation":750},{"text":507,"config":924},{"href":509,"dataGaName":510,"dataGaLocation":750},{"text":526,"config":926},{"href":528,"dataGaName":529,"dataGaLocation":750},{"text":534,"config":928},{"href":536,"dataGaName":537,"dataGaLocation":750},{"text":539,"config":930},{"href":541,"dataGaName":542,"dataGaLocation":750},{"text":544,"config":932},{"href":546,"dataGaName":547,"dataGaLocation":750},{"text":549,"config":934},{"href":551,"dataGaName":552,"dataGaLocation":750},{"text":554,"config":936},{"href":556,"dataGaName":557,"dataGaLocation":750},{"text":559,"config":938},{"href":561,"dataGaName":562,"dataGaLocation":750},{"title":575,"links":940},[941,943,945,947,949,951,956,961,963,965,967],{"text":583,"config":942},{"href":585,"dataGaName":577,"dataGaLocation":750},{"text":588,"config":944},{"href":590,"dataGaName":591,"dataGaLocation":750},{"text":596,"config":946},{"href":598,"dataGaName":599,"dataGaLocation":750},{"text":601,"config":948},{"href":603,"dataGaName":604,"dataGaLocation":750},{"text":606,"config":950},{"href":608,"dataGaName":609,"dataGaLocation":750},{"text":952,"config":953},"Nachhaltigkeit",{"href":954,"dataGaName":955,"dataGaLocation":750},"/sustainability/","Sustainability",{"text":957,"config":958},"Vielfalt, Inklusion und Zugehörigkeit",{"href":959,"dataGaName":960,"dataGaLocation":750},"/de-de/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":611,"config":962},{"href":613,"dataGaName":614,"dataGaLocation":750},{"text":621,"config":964},{"href":623,"dataGaName":624,"dataGaLocation":750},{"text":626,"config":966},{"href":628,"dataGaName":629,"dataGaLocation":750},{"text":968,"config":969},"Transparenzerklärung zu moderner Sklaverei",{"href":970,"dataGaName":971,"dataGaLocation":750},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":973},[974,977,980],{"text":975,"config":976},"Terms",{"href":800,"dataGaName":801,"dataGaLocation":750},{"text":978,"config":979},"Cookies",{"dataGaName":810,"dataGaLocation":750,"id":811,"isOneTrustButton":288},{"text":981,"config":982},"Datenschutz",{"href":805,"dataGaName":806,"dataGaLocation":750},[984],{"id":985,"title":7,"body":284,"config":986,"content":988,"description":284,"extension":992,"meta":993,"navigation":288,"path":994,"seo":995,"stem":996,"__hash__":997},"blogAuthors/en-us/blog/authors/sam-morris.yml",{"template":987},"BlogAuthor",{"name":7,"config":989},{"headshot":990,"ctfId":991},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749660148/Blog/Author%20Headshots/sam_morris.png","6JTrhUIqSCU30Y9KZOaan8","yml",{},"/en-us/blog/authors/sam-morris",{},"en-us/blog/authors/sam-morris","DfL241G6FQ5wNU6XYJLCEQLvnWBnyKnAi3wCPxOqBzE",[999,1008,1016],{"title":1000,"description":1001,"heroImage":1002,"category":280,"date":1003,"authors":1004,"slug":1007,"externalUrl":284},"Confidential AI für GitLab Self-Hosted","KI-Coding-Agenten in GitLab Duo nutzen, ohne dass Quellcode eine hardwareverschlüsselte Grenze verlässt, und ohne eigene GPUs zu betreiben.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png","2026-08-06",[1005,1006],"Mathias Ewald","Martin Paloncy","confidential-ai-for-gitlab-self-hosted",{"title":1009,"description":1010,"heroImage":1011,"category":280,"date":1012,"authors":1013,"slug":1015,"externalUrl":284},"Green DevOps: Warum CO2-Messung in die CI/CD-Pipeline gehört","Jeder Pipeline-Lauf verbraucht Energie, die nirgends sichtbar wird. Eco CI und Carmen machen diesen CO2-Ausstoß sichtbar, direkt in den Pipelines.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-07-09",[1014],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1017,"description":1018,"heroImage":1019,"category":280,"date":1020,"authors":1021,"slug":1023,"externalUrl":284},"Was ist CI/CD? Bedeutung, Vorteile und Tool-Auswahl","Was CI/CD bedeutet, welche Vorteile die Einführung bringt und worauf bei der Tool-Auswahl zu achten ist.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663328/Blog/Hero%20Images/cicd3.jpg","2026-06-22",[1022],"GitLab","what-is-ci-cd",{"promotions":1025},[1026,1040,1052,1064],{"id":1027,"categories":1028,"header":1030,"text":1031,"button":1032,"image":1037},"ai-modernization",[1029],"ai","Hält KI, was uns versprochen wurde?","Das Quiz dauert maximal 5 Minuten.",{"text":1033,"config":1034},"Ermittle deinen KI-Reifegrad",{"href":1035,"dataGaName":1036,"dataGaLocation":515},"/de-de/assessments/ai-modernization-assessment/","modernization assessment",{"config":1038},{"src":1039},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1041,"categories":1042,"header":1044,"text":1031,"button":1045,"image":1049},"devops-modernization",[1043,849],"product","Verwaltest du Tool-Chaos oder stellst du Innovationen bereit?",{"text":1046,"config":1047},"Ermittle deinen DevOps-Reifegrad",{"href":1048,"dataGaName":1036,"dataGaLocation":515},"/de-de/assessments/devops-modernization-assessment/",{"config":1050},{"src":1051},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1053,"categories":1054,"header":1056,"text":1031,"button":1057,"image":1061},"security-modernization",[1055],"security","Tauschst du Schnelligkeit gegen Sicherheit ein?",{"text":1058,"config":1059},"Ermittle deinen Sicherheitsreifegrad",{"href":1060,"dataGaName":1036,"dataGaLocation":515},"/de-de/assessments/security-modernization-assessment/",{"config":1062},{"src":1063},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1065,"paths":1066,"header":1069,"text":1070,"button":1071,"image":1076},"github-azure-migration",[1067,1068],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Ist dein Team bereit für den Umzug von GitHub nach Azure?","GitHub stellt bereits auf Azure um. Finde heraus, was das für dich bedeutet.",{"text":1072,"config":1073},"Erfahre, wie GitLab im Vergleich zu GitHub abschneidet",{"href":1074,"dataGaName":1075,"dataGaLocation":515},"/de-de/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1077},{"src":1051},{"header":1079,"blurb":1080,"button":1081,"secondaryButton":1086},"Beginne noch heute, schneller zu entwickeln","Entdecke, was dein Team mit der intelligenten Orchestrierungsplattform für DevSecOps erreichen kann.\n",{"text":1082,"config":1083},"Kostenlosen Test starten",{"href":1084,"dataGaName":313,"dataGaLocation":1085},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/de-de/","feature",{"text":638,"config":1087},{"href":640,"dataGaName":318,"dataGaLocation":1085},1786803757411]