[{"data":1,"prerenderedAt":2327},["ShallowReactive",2],{"/de-de/blog/5-ways-gitlab-pipeline-logic-solves-real-engineering-problems":3,"navigation-de-de":1548,"banner-de-de":1972,"footer-de-de":1981,"blog-post-authors-de-de-Omid Khan":2223,"blog-related-posts-de-de-5-ways-gitlab-pipeline-logic-solves-real-engineering-problems":2238,"blog-promotions-de-de":2264,"next-steps-de-de":2317},{"id":4,"title":5,"authors":6,"body":8,"category":1526,"date":1527,"description":1528,"extension":1529,"externalUrl":1530,"featured":433,"heroImage":1531,"meta":1532,"navigation":433,"path":1533,"seo":1534,"slug":1539,"stem":1540,"tags":1541,"template":1546,"updatedDate":1530,"__hash__":1547},"blogPosts/de-de/blog/5-ways-gitlab-pipeline-logic-solves-real-engineering-problems.md","5 GitLab-Pipeline-Muster für komplexe Engineering-Herausforderungen",[7],"Omid Khan",{"type":9,"value":10,"toc":1507},"minimark",[11,16,23,26,29,32,37,44,64,67,81,84,88,93,101,110,120,124,129,137,156,159,165,169,178,203,209,215,219,228,246,252,271,277,281,284,297,300,304,307,343,354,358,361,364,367,370,373,377,388,398,402,405,521,527,629,635,639,642,1148,1154,1160,1166,1170,1173,1280,1283,1399,1403,1421,1441,1445,1503],[12,13,15],"h2",{"id":14},"abschnitt-1-das-modell-verstehen","Abschnitt 1: Das Modell verstehen",[17,18,19],"p",{},[20,21,22],"em",{},"Für Engineering-Leads und Entscheidungsträger: Konzept, Anwendungsfälle und Architekturprinzipien. Konfigurationsdetails folgen in Abschnitt 2.",[17,24,25],{},"Die meisten CI/CD-Werkzeuge können einen Build ausführen und ein Deployment anstoßen. Der Unterschied zeigt sich erst dann, wenn die Delivery-Anforderungen komplexer werden: ein Monorepo mit einem Dutzend Services, Microservices über mehrere Repositories verteilt, Deployments in Dutzende von Umgebungen gleichzeitig – oder ein Platform-Team, das organisationsweite Standards durchsetzen will, ohne dabei zum Engpass zu werden.",[17,27,28],{},"GitLabs Pipeline-Modell wurde für genau diese Komplexität entwickelt. Parent-Child-Pipelines, DAG-Execution, dynamische Pipeline-Generierung, Multi-Project-Trigger, Merge-Request-Pipelines mit Merged-Results-Verarbeitung und CI/CD Components lösen jeweils eine eigene Klasse von Problemen. Da sich diese Bausteine kombinieren lassen, erschließt das vollständige Modell mehr als nur kürzere Pipeline-Laufzeiten.",[17,30,31],{},"Dieser Artikel beschreibt die fünf Muster, bei denen das Modell seine Stärken deutlich zeigt – jeweils zugeordnet zu einem konkreten Engineering-Szenario. Konfigurationen und Implementierungsdetails folgen in Abschnitt 2.",[33,34,36],"h3",{"id":35},"_1-monorepos-parent-child-pipelines-und-dag-execution","1. Monorepos: Parent-Child-Pipelines und DAG-Execution",[17,38,39,43],{},[40,41,42],"strong",{},"Das Problem:"," Ein Monorepo enthält Frontend, Backend und Dokumentation. Jeder Commit löst einen vollständigen Rebuild aller Komponenten aus – auch wenn sich nur eine README-Datei geändert hat.",[17,45,46,47,53,54,63],{},"GitLab kombiniert zwei sich ergänzende Mechanismen: ",[48,49,52],"a",{"href":50,"rel":51},"https://docs.gitlab.com/ci/pipelines/downstream_pipelines/#parent-child-pipelines",[],"Parent-Child-Pipelines"," ermöglichen es einer übergeordneten Pipeline, isolierte Child-Pipelines zu starten. ",[48,55,58,59],{"href":56,"rel":57},"https://docs.gitlab.com/ci/yaml/#needs",[],"DAG-Execution via ",[60,61,62],"code",{},"needs"," bricht die starre Stage-Reihenfolge auf und startet Jobs, sobald ihre Abhängigkeiten abgeschlossen sind – nicht erst, wenn alle Jobs einer Stage fertig sind.",[17,65,66],{},"Eine Parent-Pipeline erkennt, welche Teile des Repos sich geändert haben, und löst ausschließlich die betroffenen Child-Pipelines aus. Jeder Service verwaltet seine eigene Pipeline-Konfiguration; Änderungen in einem Service können keine anderen beeinflussen. Damit bleibt die Komplexität beherrschbar, während das Repository und das Team wachsen.",[17,68,69,70,73,74,77,78,80],{},"Einen technischen Aspekt gilt es dabei zu kennen: Wenn mehrere Dateien an einen einzelnen ",[60,71,72],{},"trigger: include:","-Block übergeben werden, fusioniert GitLab sie zu einer einzigen Child-Pipeline-Konfiguration. Jobs aus diesen Dateien teilen denselben Pipeline-Kontext und können sich gegenseitig per ",[60,75,76],{},"needs:"," referenzieren – das ist die Voraussetzung für die DAG-Optimierung. Werden die Dateien stattdessen auf separate Trigger-Jobs aufgeteilt, entsteht jeweils eine isolierte Pipeline, und dateiübergreifende ",[60,79,76],{},"-Referenzen funktionieren nicht.",[17,82,83],{},"In großen Monorepos lassen sich Pipeline-Laufzeiten durch DAG-Execution deutlich reduzieren, da Jobs nicht mehr auf unabhängige Arbeitsschritte in derselben Stage warten.",[33,85,87],{"id":86},"_2-microservices-cross-repo-pipelines-über-mehrere-projekte","2. Microservices: Cross-Repo-Pipelines über mehrere Projekte",[17,89,90,92],{},[40,91,42],{}," Frontend und Backend leben in separaten Repositories. Wenn das Frontend-Team eine Änderung ausliefert, ist nicht erkennbar, ob sie die Backend-Integration beeinträchtigt – und umgekehrt.",[17,94,95,100],{},[48,96,99],{"href":97,"rel":98},"https://docs.gitlab.com/ci/pipelines/downstream_pipelines/#multi-project-pipelines",[],"Multi-Project-Pipelines"," ermöglichen es, aus einem Projekt heraus eine Pipeline in einem anderen Projekt auszulösen und auf das Ergebnis zu warten. Das auslösende Projekt sieht die verknüpfte Downstream-Pipeline direkt in seiner eigenen Pipeline-Ansicht.",[17,102,103,104,109],{},"In der Praxis erstellt die Frontend-Pipeline ein API-Contract-Artifact und veröffentlicht es, bevor die Backend-Pipeline ausgelöst wird. Das Backend ruft dieses Artifact über die ",[48,105,108],{"href":106,"rel":107},"https://docs.gitlab.com/api/jobs/#download-a-single-artifact-file-from-specific-tag-or-branch",[],"Jobs API"," ab und validiert es, bevor weitere Schritte erlaubt sind. Wird eine Breaking Change erkannt, schlägt die Backend-Pipeline fehl – und mit ihr die Frontend-Pipeline. Probleme, die bisher erst in der Produktion sichtbar wurden, werden damit im Pipeline-Prozess abgefangen. Die Abhängigkeit zwischen Services wird sichtbar, nachvollziehbar und aktiv verwaltbar.",[17,111,112,117,118],{},[113,114],"img",{"alt":115,"src":116,"title":115},"Cross-project pipelines","https://res.cloudinary.com/about-gitlab-com/image/upload/v1775738762/Blog/Imported/hackathon-fake-blog-post-s/image4_h6mfsb.png"," ",[20,119,115],{},[33,121,123],{"id":122},"_3-multi-tenantmatrix-deployments-dynamische-child-pipelines","3. Multi-Tenant/Matrix-Deployments: Dynamische Child-Pipelines",[17,125,126,128],{},[40,127,42],{}," Dieselbe Anwendung wird in 15 Kundenumgebungen, drei Cloud-Regionen oder den Stages Dev/Staging/Prod deployed. Manuelle Anpassungen je Umgebung führen zu Konfigurationsdrift. Eine separate Pipeline pro Umgebung ist von Anfang an nicht wartbar.",[17,130,131,136],{},[48,132,135],{"href":133,"rel":134},"https://docs.gitlab.com/ci/pipelines/downstream_pipelines/#dynamic-child-pipelines",[],"Dynamische Child-Pipelines"," generieren die Pipeline-Struktur zur Laufzeit. Ein Job führt ein Skript aus, das eine YAML-Datei erzeugt – und diese YAML-Datei wird zur Pipeline für den nächsten Schritt. Die Pipeline-Struktur selbst wird damit zu Daten.",[17,138,139,140,143,144,147,148,151,152,155],{},"Das Generierungsskript iteriert über eine ",[60,141,142],{},"ENVIRONMENTS","-Variable, statt jede Umgebung fest zu kodieren. Eine neue Umgebung lässt sich durch Anpassen der Variable hinzufügen – ohne Änderungen an der Pipeline-Konfiguration selbst. Trigger-Jobs erben mit ",[60,145,146],{},"extends:"," eine gemeinsame Template-Konfiguration, sodass ",[60,149,150],{},"strategy: depend"," einmal definiert und nicht für jeden Trigger-Job wiederholt wird. Ein ",[60,153,154],{},"when: manual","-Gate für das Produktions-Deployment ist direkt in den Pipeline-Graph integriert.",[17,157,158],{},"Platform-Teams nutzen dieses Muster, um Dutzende von Umgebungen zu verwalten, ohne Pipeline-Logik zu duplizieren.",[17,160,161],{},[113,162],{"alt":163,"src":164,"title":163},"Dynamic pipeline","https://res.cloudinary.com/about-gitlab-com/image/upload/v1775738765/Blog/Imported/hackathon-fake-blog-post-s/image7_wr0kx2.png",[33,166,168],{"id":167},"_4-mr-first-delivery-merge-request-pipelines-merged-results-und-workflow-routing","4. MR-First-Delivery: Merge-Request-Pipelines, Merged-Results und Workflow-Routing",[17,170,171,173,174,177],{},[40,172,42],{}," Die Pipeline läuft bei jedem Push auf jeden Branch. Aufwändige Tests werden auf Feature-Branches ausgeführt, die nie gemergt werden. Gleichzeitig gibt es keine Garantie, dass das Getestete dem entspricht, was nach dem Merge auf ",[60,175,176],{},"main"," tatsächlich landet.",[17,179,180,181,186,187,192,193,198,199,202],{},"GitLab kombiniert drei ineinandergreifende Mechanismen: ",[48,182,185],{"href":183,"rel":184},"https://docs.gitlab.com/ci/pipelines/merge_request_pipelines/",[],"Merge-Request-Pipelines"," laufen ausschließlich dann, wenn ein Merge Request existiert – nicht bei jedem Branch-Push. Allein dadurch entfällt ein erheblicher Anteil unnötiger Compute-Ausführungen. ",[48,188,191],{"href":189,"rel":190},"https://docs.gitlab.com/ci/pipelines/merged_results_pipelines/",[],"Merged-Results-Pipelines"," gehen einen Schritt weiter: GitLab erstellt einen temporären Merge-Commit aus dem Branch und dem aktuellen Ziel-Branch und führt die Pipeline dagegen aus. Getestet wird damit das tatsächliche Ergebnis des Merges – nicht der Branch in Isolation. ",[48,194,197],{"href":195,"rel":196},"https://docs.gitlab.com/ci/yaml/workflow/",[],"Workflow-Rules"," definieren schließlich, welcher Pipeline-Typ unter welchen Bedingungen ausgeführt wird. Die ",[60,200,201],{},"$CI_OPEN_MERGE_REQUESTS","-Guard verhindert dabei, dass für einen Branch mit offenem MR doppelte Pipelines ausgelöst werden.",[17,204,205,206,208],{},"Das Ergebnis ist ein Pipeline-Verhalten, das sich je nach Kontext unterscheidet: Ein Push auf einen Feature-Branch ohne offenen MR führt nur Lint und Unit-Tests aus. Sobald ein MR geöffnet wird, wechseln die Workflow-Rules auf eine MR-Pipeline mit der vollständigen Test-Suite gegen das Merged-Result. Ein Merge auf ",[60,207,176],{}," stellt ein manuelles Produktions-Deployment in die Warteschlange. Der Nightly-Scan läuft einmalig als geplante Pipeline – nicht bei jedem Commit.",[17,210,211,212,214],{},"Merged-Results-Pipelines fangen dabei die Klasse von Fehlern ab, die erst nach einem Merge sichtbar werden – bevor sie ",[60,213,176],{}," erreichen.",[33,216,218],{"id":217},"_5-governed-pipelines-cicd-components","5. Governed Pipelines: CI/CD Components",[17,220,221,223,224,227],{},[40,222,42],{}," Das Platform-Team hat den richtigen Weg für Build, Test und Deploy definiert. Jedes Anwendungsteam pflegt jedoch eine eigene ",[60,225,226],{},".gitlab-ci.yml"," mit subtilen Abweichungen. Security-Scanning wird übersprungen. Deployment-Standards driften. Audits werden aufwändig.",[17,229,230,235,236,239,240,245],{},[48,231,234],{"href":232,"rel":233},"https://docs.gitlab.com/ci/components/",[],"CI/CD Components"," ermöglichen es Platform-Teams, versionierte, wiederverwendbare Pipeline-Bausteine zu veröffentlichen. Anwendungsteams binden sie mit einer einzigen ",[60,237,238],{},"include:","-Zeile ein – kein Copy-Paste, kein Drift. Components sind über den ",[48,241,244],{"href":242,"rel":243},"https://docs.gitlab.com/ci/components/#cicd-catalog",[],"CI/CD Catalog"," auffindbar, sodass Teams bewährte Bausteine finden und übernehmen können, ohne das Platform-Team direkt einschalten zu müssen.",[17,247,248,249,251],{},"Drei Zeilen ",[60,250,238],{}," ersetzen hunderte von duplizierten YAML-Zeilen. Das Platform-Team kann einen Security-Fix in einer neuen Komponentenversion veröffentlichen – Teams steigen auf ihrem eigenen Zeitplan um, oder das Platform-Team fixiert alle auf eine Mindestversion. In beiden Fällen propagiert eine Änderung organisationsweit, statt repo-für-repo angewendet zu werden.",[17,253,254,255,260,261,266,267,270],{},"Kombiniert mit ",[48,256,259],{"href":257,"rel":258},"https://docs.gitlab.com/ci/resource_groups/",[],"Resource Groups"," zur Vermeidung konkurrierender Deployments und ",[48,262,265],{"href":263,"rel":264},"https://docs.gitlab.com/ci/environments/protected_environments/",[],"Protected Environments"," für Freigabe-Gates entsteht eine governed Delivery-Plattform, auf der ",[40,268,269],{},"Compliance der Standard ist, nicht die Ausnahme",". Platform-Teams setzen Vorgaben durch, ohne zum Engpass zu werden.",[17,272,273],{},[113,274],{"alt":275,"src":276,"title":275},"Component pipeline (imported jobs)","https://res.cloudinary.com/about-gitlab-com/image/upload/v1775738776/Blog/Imported/hackathon-fake-blog-post-s/image2_pizuxd.png",[12,278,280],{"id":279},"das-modell-als-ganzes","Das Modell als Ganzes",[17,282,283],{},"Keines dieser Muster existiert isoliert. Der Wert von GitLabs Pipeline-Modell liegt in der Kombinierbarkeit seiner Bausteine:",[285,286,287,291,294],"ul",{},[288,289,290],"li",{},"Ein Monorepo nutzt Parent-Child-Pipelines, und jede Child-Pipeline nutzt DAG-Execution.",[288,292,293],{},"Eine Microservices-Plattform nutzt Multi-Project-Pipelines, und jedes Projekt nutzt MR-Pipelines mit Merged-Results.",[288,295,296],{},"Eine governed Plattform nutzt CI/CD Components, um die obigen Muster organisationsweit zu standardisieren.",[17,298,299],{},"Die meisten Teams entdecken eines dieser Muster, wenn sie auf ein konkretes Problem stoßen. Teams, die das vollständige Modell verstehen, entwickeln daraus eine Delivery-Infrastruktur, die tatsächlich abbildet, wie ihre Engineering-Organisation arbeitet – und mit ihr wächst.",[12,301,303],{"id":302},"weitere-muster","Weitere Muster",[17,305,306],{},"Das Pipeline-Modell geht über die fünf vorgestellten Muster hinaus:",[285,308,309,317,325],{},[288,310,311,316],{},[48,312,315],{"href":313,"rel":314},"https://docs.gitlab.com/ci/environments/",[],"Review Apps mit dynamischen Umgebungen"," erstellen für jeden Feature-Branch eine Live-Vorschau und räumen sie automatisch auf, wenn der MR geschlossen wird.",[288,318,319,324],{},[48,320,323],{"href":321,"rel":322},"https://docs.gitlab.com/ci/caching/",[],"Caching- und Artifact-Strategien"," sind nach der strukturellen Arbeit häufig der direkteste Weg zur weiteren Laufzeitoptimierung – ohne die Pipeline-Struktur zu verändern.",[288,326,327,332,333,338,339,342],{},[48,328,331],{"href":329,"rel":330},"https://docs.gitlab.com/ci/pipelines/schedules/",[],"Geplante und API-ausgelöste Pipelines"," eignen sich für Workloads, die nicht bei jedem Code-Push laufen sollten: Nightly-Security-Scans, Compliance-Reports und Release-Automatisierung lassen sich als geplante oder ",[48,334,337],{"href":335,"rel":336},"https://docs.gitlab.com/ci/triggers/",[],"API-ausgelöste"," Pipelines mit ",[60,340,341],{},"$CI_PIPELINE_SOURCE","-Routing modellieren.",[344,345,346],"blockquote",{},[17,347,348,353],{},[48,349,352],{"href":350,"rel":351},"https://about.gitlab.com/de-de/free-trial/",[],"GitLab Ultimate kostenlos testen"," und Pipeline-Logik ab heute einsetzen.",[12,355,357],{"id":356},"für-deutsche-unternehmen-regulatorischer-kontext","Für deutsche Unternehmen: Regulatorischer Kontext",[17,359,360],{},"Teams, die Pipeline-Governance nach Muster 5 einführen, adressieren dabei möglicherweise auch Anforderungen, die regulatorische Frameworks an sichere Softwareentwicklungsprozesse stellen.",[17,362,363],{},"CI/CD Components mit erzwungenen Security-Gates könnten Anforderungen an sichere Entwicklungsprozesse betreffen – beispielsweise in Bereichen, die Frameworks wie NIS2, ISO 27001 oder BSI IT-Grundschutz an den Software-Entwicklungslebenszyklus adressieren. Protected Environments und Resource Groups betreffen ähnliche Themen im Bereich Änderungskontrolle und Umgebungstrennung, wie sie in Governance-Frameworks typischerweise explizit formuliert sind.",[17,365,366],{},"Multi-Project-Pipelines mit API-Contract-Validierung (Muster 2) schaffen Sichtbarkeit über Service-Abhängigkeiten hinweg – ein Aspekt, den Frameworks zur Lieferkettensicherheit adressieren.",[17,368,369],{},"Merged-Results-Pipelines (Muster 4) dokumentieren automatisch, dass das tatsächliche Merge-Ergebnis getestet wurde, nicht nur der Feature-Branch in Isolation. Dies könnte Anforderungen an nachvollziehbare Änderungsprozesse betreffen, wie sie in Change-Management-Kontrollen verschiedener Sicherheitsframeworks formuliert sind.",[17,371,372],{},"Für konkrete Compliance-Anforderungen im eigenen regulatorischen Umfeld empfiehlt sich Rücksprache mit entsprechender Fachberatung.",[12,374,376],{"id":375},"abschnitt-2-konfiguration-und-implementierung","Abschnitt 2: Konfiguration und Implementierung",[17,378,379],{},[20,380,381,382,387],{},"Für Entwicklungsteams und DevOps-Praktiker: ausgewählte Konfigurationsbeispiele zu den Mustern 1, 4 und 5. Für vollständige Konfigurationen aller Muster: ",[48,383,386],{"href":384,"rel":385},"https://about.gitlab.com/blog/5-ways-gitlab-pipeline-logic-solves-real-engineering-problems/",[],"englischer Originalartikel",".",[17,389,390,391,394,395,397],{},"Die folgenden Konfigurationen sind illustrativ aufgebaut. Die Skripte verwenden ",[60,392,393],{},"echo","-Befehle, um das Wesentliche sichtbar zu halten. Für den produktiven Einsatz werden die ",[60,396,393],{},"-Befehle durch die tatsächlichen Build-, Test- und Deploy-Schritte ersetzt.",[33,399,401],{"id":400},"muster-1-parent-child-pipelines-und-dag-execution","Muster 1: Parent-Child-Pipelines und DAG-Execution",[17,403,404],{},"Eine Parent-Pipeline erkennt Änderungen und löst nur die betroffenen Child-Pipelines aus:",[406,407,413],"pre",{"className":408,"code":409,"language":410,"meta":411,"style":412},"language-yaml shiki shiki-themes github-light","  - trigger\n\ntrigger-services:\n  stage: trigger\n  trigger:\n    include:\n      - local: '.gitlab/ci/api-service.yml'\n      - local: '.gitlab/ci/web-service.yml'\n      - local: '.gitlab/ci/worker-service.yml'\n    strategy: depend\n","yaml","# .gitlab-ci.yml stages:","",[60,414,415,428,435,445,456,464,472,486,498,510],{"__ignoreMap":412},[416,417,420,424],"span",{"class":418,"line":419},"line",1,[416,421,423],{"class":422},"sgsFI","  - ",[416,425,427],{"class":426},"sYBdl","trigger\n",[416,429,431],{"class":418,"line":430},2,[416,432,434],{"emptyLinePlaceholder":433},true,"\n",[416,436,438,442],{"class":418,"line":437},3,[416,439,441],{"class":440},"shJU0","trigger-services",[416,443,444],{"class":422},":\n",[416,446,448,451,454],{"class":418,"line":447},4,[416,449,450],{"class":440},"  stage",[416,452,453],{"class":422},": ",[416,455,427],{"class":426},[416,457,459,462],{"class":418,"line":458},5,[416,460,461],{"class":440},"  trigger",[416,463,444],{"class":422},[416,465,467,470],{"class":418,"line":466},6,[416,468,469],{"class":440},"    include",[416,471,444],{"class":422},[416,473,475,478,481,483],{"class":418,"line":474},7,[416,476,477],{"class":422},"      - ",[416,479,480],{"class":440},"local",[416,482,453],{"class":422},[416,484,485],{"class":426},"'.gitlab/ci/api-service.yml'\n",[416,487,489,491,493,495],{"class":418,"line":488},8,[416,490,477],{"class":422},[416,492,480],{"class":440},[416,494,453],{"class":422},[416,496,497],{"class":426},"'.gitlab/ci/web-service.yml'\n",[416,499,501,503,505,507],{"class":418,"line":500},9,[416,502,477],{"class":422},[416,504,480],{"class":440},[416,506,453],{"class":422},[416,508,509],{"class":426},"'.gitlab/ci/worker-service.yml'\n",[416,511,513,516,518],{"class":418,"line":512},10,[416,514,515],{"class":440},"    strategy",[416,517,453],{"class":422},[416,519,520],{"class":426},"depend\n",[17,522,523,524,526],{},"Innerhalb der Child-Pipeline ermöglicht ",[60,525,76],{}," DAG-Execution – der Test startet, sobald der Build abgeschlossen ist, ohne auf andere Jobs in derselben Stage zu warten:",[406,528,531],{"className":408,"code":529,"language":410,"meta":530,"style":412},"  - build\n  - test\n\nbuild-api:\n  stage: build\n  script:\n    - echo \"Building API service\"\n\ntest-api:\n  stage: test\n  needs: [build-api]\n  script:\n    - echo \"Running API tests\"\n","# .gitlab/ci/api-service.yml stages:",[60,532,533,540,547,551,558,566,573,581,585,592,600,614,621],{"__ignoreMap":412},[416,534,535,537],{"class":418,"line":419},[416,536,423],{"class":422},[416,538,539],{"class":426},"build\n",[416,541,542,544],{"class":418,"line":430},[416,543,423],{"class":422},[416,545,546],{"class":426},"test\n",[416,548,549],{"class":418,"line":437},[416,550,434],{"emptyLinePlaceholder":433},[416,552,553,556],{"class":418,"line":447},[416,554,555],{"class":440},"build-api",[416,557,444],{"class":422},[416,559,560,562,564],{"class":418,"line":458},[416,561,450],{"class":440},[416,563,453],{"class":422},[416,565,539],{"class":426},[416,567,568,571],{"class":418,"line":466},[416,569,570],{"class":440},"  script",[416,572,444],{"class":422},[416,574,575,578],{"class":418,"line":474},[416,576,577],{"class":422},"    - ",[416,579,580],{"class":426},"echo \"Building API service\"\n",[416,582,583],{"class":418,"line":488},[416,584,434],{"emptyLinePlaceholder":433},[416,586,587,590],{"class":418,"line":500},[416,588,589],{"class":440},"test-api",[416,591,444],{"class":422},[416,593,594,596,598],{"class":418,"line":512},[416,595,450],{"class":440},[416,597,453],{"class":422},[416,599,546],{"class":426},[416,601,603,606,609,611],{"class":418,"line":602},11,[416,604,605],{"class":440},"  needs",[416,607,608],{"class":422},": [",[416,610,555],{"class":426},[416,612,613],{"class":422},"]\n",[416,615,617,619],{"class":418,"line":616},12,[416,618,570],{"class":440},[416,620,444],{"class":422},[416,622,624,626],{"class":418,"line":623},13,[416,625,577],{"class":422},[416,627,628],{"class":426},"echo \"Running API tests\"\n",[17,630,631],{},[113,632],{"alt":633,"src":634,"title":633},"Local downstream pipelines","https://res.cloudinary.com/about-gitlab-com/image/upload/v1775738759/Blog/Imported/hackathon-fake-blog-post-s/image3_vwj3rz.png",[33,636,638],{"id":637},"muster-4-mr-first-delivery","Muster 4: MR-First-Delivery",[17,640,641],{},"Workflow-Rules, MR-Pipelines und Merged-Results zusammen ergeben ein kontextabhängiges Pipeline-Verhalten:",[406,643,646],{"className":408,"code":644,"language":410,"meta":645,"style":412},"  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n    - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS\n      when: never\n    - if: $CI_COMMIT_BRANCH\n    - if: $CI_PIPELINE_SOURCE == \"schedule\"\n\nstages:\n  - fast-checks\n  - expensive-tests\n  - deploy\n\nlint-code:\n  stage: fast-checks\n  script:\n    - echo \"Running linter\"\n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"push\"\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n    - if: $CI_COMMIT_BRANCH == \"main\"\n\nunit-tests:\n  stage: fast-checks\n  script:\n    - echo \"Running unit tests\"\n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"push\"\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n    - if: $CI_COMMIT_BRANCH == \"main\"\n\nintegration-tests:\n  stage: expensive-tests\n  script:\n    - echo \"Running integration tests (15 min)\"\n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n    - if: $CI_COMMIT_BRANCH == \"main\"\n\ne2e-tests:\n  stage: expensive-tests\n  script:\n    - echo \"Running E2E tests (30 min)\"\n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n    - if: $CI_COMMIT_BRANCH == \"main\"\n\nnightly-comprehensive-scan:\n  stage: expensive-tests\n  script:\n    - echo \"Running full nightly suite (2 hours)\"\n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"schedule\"\n\ndeploy-production:\n  stage: deploy\n  script:\n    - echo \"Deploying to production\"\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"main\"\n      when: manual\n","# .gitlab-ci.yml workflow:",[60,647,648,655,667,678,688,699,710,714,721,728,735,742,746,753,762,769,777,784,796,807,819,824,832,841,848,856,863,874,885,896,901,909,918,925,933,940,951,962,967,975,984,991,999,1006,1017,1028,1033,1041,1050,1057,1065,1072,1083,1088,1096,1105,1112,1120,1127,1138],{"__ignoreMap":412},[416,649,650,653],{"class":418,"line":419},[416,651,652],{"class":440},"  rules",[416,654,444],{"class":422},[416,656,657,659,662,664],{"class":418,"line":430},[416,658,577],{"class":422},[416,660,661],{"class":440},"if",[416,663,453],{"class":422},[416,665,666],{"class":426},"$CI_PIPELINE_SOURCE == \"merge_request_event\"\n",[416,668,669,671,673,675],{"class":418,"line":437},[416,670,577],{"class":422},[416,672,661],{"class":440},[416,674,453],{"class":422},[416,676,677],{"class":426},"$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS\n",[416,679,680,683,685],{"class":418,"line":447},[416,681,682],{"class":440},"      when",[416,684,453],{"class":422},[416,686,687],{"class":426},"never\n",[416,689,690,692,694,696],{"class":418,"line":458},[416,691,577],{"class":422},[416,693,661],{"class":440},[416,695,453],{"class":422},[416,697,698],{"class":426},"$CI_COMMIT_BRANCH\n",[416,700,701,703,705,707],{"class":418,"line":466},[416,702,577],{"class":422},[416,704,661],{"class":440},[416,706,453],{"class":422},[416,708,709],{"class":426},"$CI_PIPELINE_SOURCE == \"schedule\"\n",[416,711,712],{"class":418,"line":474},[416,713,434],{"emptyLinePlaceholder":433},[416,715,716,719],{"class":418,"line":488},[416,717,718],{"class":440},"stages",[416,720,444],{"class":422},[416,722,723,725],{"class":418,"line":500},[416,724,423],{"class":422},[416,726,727],{"class":426},"fast-checks\n",[416,729,730,732],{"class":418,"line":512},[416,731,423],{"class":422},[416,733,734],{"class":426},"expensive-tests\n",[416,736,737,739],{"class":418,"line":602},[416,738,423],{"class":422},[416,740,741],{"class":426},"deploy\n",[416,743,744],{"class":418,"line":616},[416,745,434],{"emptyLinePlaceholder":433},[416,747,748,751],{"class":418,"line":623},[416,749,750],{"class":440},"lint-code",[416,752,444],{"class":422},[416,754,756,758,760],{"class":418,"line":755},14,[416,757,450],{"class":440},[416,759,453],{"class":422},[416,761,727],{"class":426},[416,763,765,767],{"class":418,"line":764},15,[416,766,570],{"class":440},[416,768,444],{"class":422},[416,770,772,774],{"class":418,"line":771},16,[416,773,577],{"class":422},[416,775,776],{"class":426},"echo \"Running linter\"\n",[416,778,780,782],{"class":418,"line":779},17,[416,781,652],{"class":440},[416,783,444],{"class":422},[416,785,787,789,791,793],{"class":418,"line":786},18,[416,788,577],{"class":422},[416,790,661],{"class":440},[416,792,453],{"class":422},[416,794,795],{"class":426},"$CI_PIPELINE_SOURCE == \"push\"\n",[416,797,799,801,803,805],{"class":418,"line":798},19,[416,800,577],{"class":422},[416,802,661],{"class":440},[416,804,453],{"class":422},[416,806,666],{"class":426},[416,808,810,812,814,816],{"class":418,"line":809},20,[416,811,577],{"class":422},[416,813,661],{"class":440},[416,815,453],{"class":422},[416,817,818],{"class":426},"$CI_COMMIT_BRANCH == \"main\"\n",[416,820,822],{"class":418,"line":821},21,[416,823,434],{"emptyLinePlaceholder":433},[416,825,827,830],{"class":418,"line":826},22,[416,828,829],{"class":440},"unit-tests",[416,831,444],{"class":422},[416,833,835,837,839],{"class":418,"line":834},23,[416,836,450],{"class":440},[416,838,453],{"class":422},[416,840,727],{"class":426},[416,842,844,846],{"class":418,"line":843},24,[416,845,570],{"class":440},[416,847,444],{"class":422},[416,849,851,853],{"class":418,"line":850},25,[416,852,577],{"class":422},[416,854,855],{"class":426},"echo \"Running unit tests\"\n",[416,857,859,861],{"class":418,"line":858},26,[416,860,652],{"class":440},[416,862,444],{"class":422},[416,864,866,868,870,872],{"class":418,"line":865},27,[416,867,577],{"class":422},[416,869,661],{"class":440},[416,871,453],{"class":422},[416,873,795],{"class":426},[416,875,877,879,881,883],{"class":418,"line":876},28,[416,878,577],{"class":422},[416,880,661],{"class":440},[416,882,453],{"class":422},[416,884,666],{"class":426},[416,886,888,890,892,894],{"class":418,"line":887},29,[416,889,577],{"class":422},[416,891,661],{"class":440},[416,893,453],{"class":422},[416,895,818],{"class":426},[416,897,899],{"class":418,"line":898},30,[416,900,434],{"emptyLinePlaceholder":433},[416,902,904,907],{"class":418,"line":903},31,[416,905,906],{"class":440},"integration-tests",[416,908,444],{"class":422},[416,910,912,914,916],{"class":418,"line":911},32,[416,913,450],{"class":440},[416,915,453],{"class":422},[416,917,734],{"class":426},[416,919,921,923],{"class":418,"line":920},33,[416,922,570],{"class":440},[416,924,444],{"class":422},[416,926,928,930],{"class":418,"line":927},34,[416,929,577],{"class":422},[416,931,932],{"class":426},"echo \"Running integration tests (15 min)\"\n",[416,934,936,938],{"class":418,"line":935},35,[416,937,652],{"class":440},[416,939,444],{"class":422},[416,941,943,945,947,949],{"class":418,"line":942},36,[416,944,577],{"class":422},[416,946,661],{"class":440},[416,948,453],{"class":422},[416,950,666],{"class":426},[416,952,954,956,958,960],{"class":418,"line":953},37,[416,955,577],{"class":422},[416,957,661],{"class":440},[416,959,453],{"class":422},[416,961,818],{"class":426},[416,963,965],{"class":418,"line":964},38,[416,966,434],{"emptyLinePlaceholder":433},[416,968,970,973],{"class":418,"line":969},39,[416,971,972],{"class":440},"e2e-tests",[416,974,444],{"class":422},[416,976,978,980,982],{"class":418,"line":977},40,[416,979,450],{"class":440},[416,981,453],{"class":422},[416,983,734],{"class":426},[416,985,987,989],{"class":418,"line":986},41,[416,988,570],{"class":440},[416,990,444],{"class":422},[416,992,994,996],{"class":418,"line":993},42,[416,995,577],{"class":422},[416,997,998],{"class":426},"echo \"Running E2E tests (30 min)\"\n",[416,1000,1002,1004],{"class":418,"line":1001},43,[416,1003,652],{"class":440},[416,1005,444],{"class":422},[416,1007,1009,1011,1013,1015],{"class":418,"line":1008},44,[416,1010,577],{"class":422},[416,1012,661],{"class":440},[416,1014,453],{"class":422},[416,1016,666],{"class":426},[416,1018,1020,1022,1024,1026],{"class":418,"line":1019},45,[416,1021,577],{"class":422},[416,1023,661],{"class":440},[416,1025,453],{"class":422},[416,1027,818],{"class":426},[416,1029,1031],{"class":418,"line":1030},46,[416,1032,434],{"emptyLinePlaceholder":433},[416,1034,1036,1039],{"class":418,"line":1035},47,[416,1037,1038],{"class":440},"nightly-comprehensive-scan",[416,1040,444],{"class":422},[416,1042,1044,1046,1048],{"class":418,"line":1043},48,[416,1045,450],{"class":440},[416,1047,453],{"class":422},[416,1049,734],{"class":426},[416,1051,1053,1055],{"class":418,"line":1052},49,[416,1054,570],{"class":440},[416,1056,444],{"class":422},[416,1058,1060,1062],{"class":418,"line":1059},50,[416,1061,577],{"class":422},[416,1063,1064],{"class":426},"echo \"Running full nightly suite (2 hours)\"\n",[416,1066,1068,1070],{"class":418,"line":1067},51,[416,1069,652],{"class":440},[416,1071,444],{"class":422},[416,1073,1075,1077,1079,1081],{"class":418,"line":1074},52,[416,1076,577],{"class":422},[416,1078,661],{"class":440},[416,1080,453],{"class":422},[416,1082,709],{"class":426},[416,1084,1086],{"class":418,"line":1085},53,[416,1087,434],{"emptyLinePlaceholder":433},[416,1089,1091,1094],{"class":418,"line":1090},54,[416,1092,1093],{"class":440},"deploy-production",[416,1095,444],{"class":422},[416,1097,1099,1101,1103],{"class":418,"line":1098},55,[416,1100,450],{"class":440},[416,1102,453],{"class":422},[416,1104,741],{"class":426},[416,1106,1108,1110],{"class":418,"line":1107},56,[416,1109,570],{"class":440},[416,1111,444],{"class":422},[416,1113,1115,1117],{"class":418,"line":1114},57,[416,1116,577],{"class":422},[416,1118,1119],{"class":426},"echo \"Deploying to production\"\n",[416,1121,1123,1125],{"class":418,"line":1122},58,[416,1124,652],{"class":440},[416,1126,444],{"class":422},[416,1128,1130,1132,1134,1136],{"class":418,"line":1129},59,[416,1131,577],{"class":422},[416,1133,661],{"class":440},[416,1135,453],{"class":422},[416,1137,818],{"class":426},[416,1139,1141,1143,1145],{"class":418,"line":1140},60,[416,1142,682],{"class":440},[416,1144,453],{"class":422},[416,1146,1147],{"class":426},"manual\n",[17,1149,1150],{},[113,1151],{"alt":1152,"src":1153,"title":1152},"Conditional pipelines (within a branch with no MR)","https://res.cloudinary.com/about-gitlab-com/image/upload/v1775738768/Blog/Imported/hackathon-fake-blog-post-s/image6_dnfcny.png",[17,1155,1156],{},[113,1157],{"alt":1158,"src":1159,"title":1158},"Conditional pipelines (within an MR)","https://res.cloudinary.com/about-gitlab-com/image/upload/v1775738772/Blog/Imported/hackathon-fake-blog-post-s/image1_wyiafu.png",[17,1161,1162],{},[113,1163],{"alt":1164,"src":1165,"title":1164},"Conditional pipelines (on the main branch)","https://res.cloudinary.com/about-gitlab-com/image/upload/v1775738774/Blog/Imported/hackathon-fake-blog-post-s/image5_r6lkfd.png",[33,1167,1169],{"id":1168},"muster-5-cicd-components","Muster 5: CI/CD Components",[17,1171,1172],{},"Eine Komponentendefinition aus einer gemeinsamen Bibliothek:",[406,1174,1177],{"className":408,"code":1175,"language":410,"meta":1176,"style":412},"  inputs:\n    stage:\n      default: deploy\n    environment:\n      default: production\n--- deploy-job:\n  stage: $[[ inputs.stage ]]\n  script:\n    - echo \"Deploying $APP_NAME to $[[ inputs.environment ]]\"\n    - echo \"Deploy URL: $DEPLOY_URL\"\n  environment:\n    name: $[[ inputs.environment ]]\n","# templates/deploy.yml spec:",[60,1178,1179,1186,1193,1202,1209,1218,1229,1238,1244,1251,1263,1270],{"__ignoreMap":412},[416,1180,1181,1184],{"class":418,"line":419},[416,1182,1183],{"class":440},"  inputs",[416,1185,444],{"class":422},[416,1187,1188,1191],{"class":418,"line":430},[416,1189,1190],{"class":440},"    stage",[416,1192,444],{"class":422},[416,1194,1195,1198,1200],{"class":418,"line":437},[416,1196,1197],{"class":440},"      default",[416,1199,453],{"class":422},[416,1201,741],{"class":426},[416,1203,1204,1207],{"class":418,"line":447},[416,1205,1206],{"class":440},"    environment",[416,1208,444],{"class":422},[416,1210,1211,1213,1215],{"class":418,"line":458},[416,1212,1197],{"class":440},[416,1214,453],{"class":422},[416,1216,1217],{"class":426},"production\n",[416,1219,1220,1224,1227],{"class":418,"line":466},[416,1221,1223],{"class":1222},"s7eDp","---",[416,1225,1226],{"class":440}," deploy-job",[416,1228,444],{"class":422},[416,1230,1231,1233,1235],{"class":418,"line":474},[416,1232,450],{"class":440},[416,1234,453],{"class":422},[416,1236,1237],{"class":426},"$[[ inputs.stage ]]\n",[416,1239,1240,1242],{"class":418,"line":488},[416,1241,570],{"class":440},[416,1243,444],{"class":422},[416,1245,1246,1248],{"class":418,"line":500},[416,1247,577],{"class":422},[416,1249,1250],{"class":426},"echo \"Deploying $APP_NAME to $[[ inputs.environment ]]\"\n",[416,1252,1253,1255,1258,1260],{"class":418,"line":512},[416,1254,577],{"class":422},[416,1256,1257],{"class":440},"echo \"Deploy URL",[416,1259,453],{"class":422},[416,1261,1262],{"class":426},"$DEPLOY_URL\"\n",[416,1264,1265,1268],{"class":418,"line":602},[416,1266,1267],{"class":440},"  environment",[416,1269,444],{"class":422},[416,1271,1272,1275,1277],{"class":418,"line":616},[416,1273,1274],{"class":440},"    name",[416,1276,453],{"class":422},[416,1278,1279],{"class":426},"$[[ inputs.environment ]]\n",[17,1281,1282],{},"So bindet ein Anwendungsteam die Komponenten ein:",[406,1284,1287],{"className":408,"code":1285,"language":410,"meta":1286,"style":412},"  APP_NAME: \"my-awesome-app\"\n  DEPLOY_URL: \"https://api.example.com\"\n\ninclude:\n  - component: gitlab.com/my-org/component-library/build@v1.0.6\n  - component: gitlab.com/my-org/component-library/test@v1.0.6\n  - component: gitlab.com/my-org/component-library/deploy@v1.0.6\n    inputs:\n      environment: staging\n\nstages:\n  - build\n  - test\n  - deploy\n","# Application repo: .gitlab-ci.yml variables:",[60,1288,1289,1299,1309,1313,1320,1332,1343,1354,1361,1371,1375,1381,1387,1393],{"__ignoreMap":412},[416,1290,1291,1294,1296],{"class":418,"line":419},[416,1292,1293],{"class":440},"  APP_NAME",[416,1295,453],{"class":422},[416,1297,1298],{"class":426},"\"my-awesome-app\"\n",[416,1300,1301,1304,1306],{"class":418,"line":430},[416,1302,1303],{"class":440},"  DEPLOY_URL",[416,1305,453],{"class":422},[416,1307,1308],{"class":426},"\"https://api.example.com\"\n",[416,1310,1311],{"class":418,"line":437},[416,1312,434],{"emptyLinePlaceholder":433},[416,1314,1315,1318],{"class":418,"line":447},[416,1316,1317],{"class":440},"include",[416,1319,444],{"class":422},[416,1321,1322,1324,1327,1329],{"class":418,"line":458},[416,1323,423],{"class":422},[416,1325,1326],{"class":440},"component",[416,1328,453],{"class":422},[416,1330,1331],{"class":426},"gitlab.com/my-org/component-library/build@v1.0.6\n",[416,1333,1334,1336,1338,1340],{"class":418,"line":466},[416,1335,423],{"class":422},[416,1337,1326],{"class":440},[416,1339,453],{"class":422},[416,1341,1342],{"class":426},"gitlab.com/my-org/component-library/test@v1.0.6\n",[416,1344,1345,1347,1349,1351],{"class":418,"line":474},[416,1346,423],{"class":422},[416,1348,1326],{"class":440},[416,1350,453],{"class":422},[416,1352,1353],{"class":426},"gitlab.com/my-org/component-library/deploy@v1.0.6\n",[416,1355,1356,1359],{"class":418,"line":488},[416,1357,1358],{"class":440},"    inputs",[416,1360,444],{"class":422},[416,1362,1363,1366,1368],{"class":418,"line":500},[416,1364,1365],{"class":440},"      environment",[416,1367,453],{"class":422},[416,1369,1370],{"class":426},"staging\n",[416,1372,1373],{"class":418,"line":512},[416,1374,434],{"emptyLinePlaceholder":433},[416,1376,1377,1379],{"class":418,"line":602},[416,1378,718],{"class":440},[416,1380,444],{"class":422},[416,1382,1383,1385],{"class":418,"line":616},[416,1384,423],{"class":422},[416,1386,539],{"class":426},[416,1388,1389,1391],{"class":418,"line":623},[416,1390,423],{"class":422},[416,1392,546],{"class":426},[416,1394,1395,1397],{"class":418,"line":755},[416,1396,423],{"class":422},[416,1398,741],{"class":426},[33,1400,1402],{"id":1401},"orientierung-zu-den-mustern-2-und-3","Orientierung zu den Mustern 2 und 3",[17,1404,1405,1408,1409,1412,1413,1416,1417,387],{},[40,1406,1407],{},"Muster 2 (Multi-Project-Pipelines):"," Das Frontend-Repository publiziert ein API-Contract-Artifact und löst anschließend die Backend-Pipeline aus. Das Backend ruft das Artifact über die GitLab Jobs API ab und validiert es. Der ",[60,1410,1411],{},"integration-test","-Job läuft dabei nur dann, wenn er von einer Upstream-Pipeline ausgelöst wurde (",[60,1414,1415],{},"$CI_PIPELINE_SOURCE == \"pipeline\"","), nicht bei einem eigenständigen Push. Die Frontend-Projekt-ID wird als CI/CD-Variable gesetzt, um Hardcoding zu vermeiden. Vollständige Konfigurationen beider Repositories: ",[48,1418,386],{"href":1419,"rel":1420},"https://about.gitlab.com/blog/5-ways-gitlab-pipeline-logic-solves-real-engineering-problems/#2-microservices-cross-repo-multi-project-pipelines",[],[17,1422,1423,1426,1427,1430,1431,1433,1434,1436,1437,387],{},[40,1424,1425],{},"Muster 3 (Dynamische Child-Pipelines):"," Ein ",[60,1428,1429],{},"generate-config","-Job erzeugt zur Laufzeit environment-spezifische YAML-Dateien. Trigger-Jobs nutzen ",[60,1432,146],{}," für gemeinsam genutzte Konfiguration und ",[60,1435,76],{}," für sequenzielle Promotion (dev → staging → prod mit manuellem Gate). Vollständige Konfiguration: ",[48,1438,386],{"href":1439,"rel":1440},"https://about.gitlab.com/blog/5-ways-gitlab-pipeline-logic-solves-real-engineering-problems/#3-multi-tenant--matrix-deployments-dynamic-child-pipelines",[],[12,1442,1444],{"id":1443},"weiterführende-artikel","Weiterführende Artikel",[285,1446,1447,1454,1461,1468,1475,1482,1489,1496],{},[288,1448,1449],{},[48,1450,1453],{"href":1451,"rel":1452},"https://about.gitlab.com/blog/variable-and-artifact-sharing-in-gitlab-parent-child-pipelines/",[],"Variable and artifact sharing in GitLab parent-child pipelines",[288,1455,1456],{},[48,1457,1460],{"href":1458,"rel":1459},"https://about.gitlab.com/blog/ci-cd-inputs-secure-and-preferred-method-to-pass-parameters-to-a-pipeline/",[],"CI/CD inputs: Secure and preferred method to pass parameters to a pipeline",[288,1462,1463],{},[48,1464,1467],{"href":1465,"rel":1466},"https://about.gitlab.com/blog/tutorial-how-to-set-up-your-first-gitlab-ci-cd-component/",[],"Tutorial: How to set up your first GitLab CI/CD component",[288,1469,1470],{},[48,1471,1474],{"href":1472,"rel":1473},"https://about.gitlab.com/blog/how-to-include-file-references-in-your-ci-cd-components/",[],"How to include file references in your CI/CD components",[288,1476,1477],{},[48,1478,1481],{"href":1479,"rel":1480},"https://about.gitlab.com/blog/faq-gitlab-ci-cd-catalog/",[],"FAQ: GitLab CI/CD Catalog",[288,1483,1484],{},[48,1485,1488],{"href":1486,"rel":1487},"https://about.gitlab.com/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way/",[],"Building a GitLab CI/CD pipeline for a monorepo the easy way",[288,1490,1491],{},[48,1492,1495],{"href":1493,"rel":1494},"https://about.gitlab.com/blog/a-ci-component-builders-journey/",[],"A CI/CD component builder's journey",[288,1497,1498],{},[48,1499,1502],{"href":1500,"rel":1501},"https://about.gitlab.com/blog/ci-cd-catalog-goes-ga-no-more-building-pipelines-from-scratch/",[],"CI/CD Catalog goes GA: No more building pipelines from scratch",[1504,1505,1506],"style",{},"html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}",{"title":412,"searchDepth":430,"depth":430,"links":1508},[1509,1516,1517,1518,1519,1525],{"id":14,"depth":430,"text":15,"children":1510},[1511,1512,1513,1514,1515],{"id":35,"depth":437,"text":36},{"id":86,"depth":437,"text":87},{"id":122,"depth":437,"text":123},{"id":167,"depth":437,"text":168},{"id":217,"depth":437,"text":218},{"id":279,"depth":430,"text":280},{"id":302,"depth":430,"text":303},{"id":356,"depth":430,"text":357},{"id":375,"depth":430,"text":376,"children":1520},[1521,1522,1523,1524],{"id":400,"depth":437,"text":401},{"id":637,"depth":437,"text":638},{"id":1168,"depth":437,"text":1169},{"id":1401,"depth":437,"text":1402},{"id":1443,"depth":430,"text":1444},"engineering","2026-04-09","Wie Parent-Child-Pipelines, DAG-Execution, MR-Pipelines und CI/CD Components komplexe Delivery-Probleme lösen – von Monorepos bis zur governed Plattform.","md",null,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772721753/frfsm1qfscwrmsyzj1qn.png",{},"/de-de/blog/5-ways-gitlab-pipeline-logic-solves-real-engineering-problems",{"config":1535,"title":1537,"description":1538},{"noIndex":1536},false,"5 GitLab-Pipeline-Muster für skalierbare CI/CD-Delivery","CI/CD in komplexen Umgebungen skalieren: fünf GitLab-Pipeline-Muster für Monorepos, Microservices, Matrix-Deployments und governed Plattformen.","5-ways-gitlab-pipeline-logic-solves-real-engineering-problems","de-de/blog/5-ways-gitlab-pipeline-logic-solves-real-engineering-problems",[1542,1543,1544,1545],"CI/CD","DevOps platform","tutorial","features","BlogPost","NwPfggaYUFwKo3w4UJFr9AGScRTCRX8GuDZ55HVimxc",{"logo":1549,"freeTrial":1554,"sales":1559,"login":1564,"items":1569,"search":1890,"minimal":1924,"duo":1942,"switchNav":1951,"pricingDeployment":1962},{"config":1550},{"href":1551,"dataGaName":1552,"dataGaLocation":1553},"/de-de/","gitlab logo","header",{"text":1555,"config":1556},"Kostenlose Testversion anfordern",{"href":1557,"dataGaName":1558,"dataGaLocation":1553},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de&glm_content=default-saas-trial/","free trial",{"text":1560,"config":1561},"Vertrieb kontaktieren",{"href":1562,"dataGaName":1563,"dataGaLocation":1553},"/de-de/sales/","sales",{"text":1565,"config":1566},"Anmelden",{"href":1567,"dataGaName":1568,"dataGaLocation":1553},"https://gitlab.com/users/sign_in/","sign in",[1570,1599,1700,1705,1809,1870],{"text":1571,"config":1572,"menu":1574},"Plattform",{"dataNavLevelOne":1573},"platform",{"type":1575,"columns":1576},"cards",[1577,1583,1591],{"title":1571,"description":1578,"link":1579},"Die intelligente Orchestrierungsplattform für DevSecOps",{"text":1580,"config":1581},"Die Plattform erkunden",{"href":1582,"dataGaName":1573,"dataGaLocation":1553},"/de-de/platform/",{"title":1584,"description":1585,"link":1586},"GitLab Duo Agent Platform","Agentische KI für den gesamten Software-Lebenszyklus",{"text":1587,"config":1588},"Lerne GitLab Duo kennen",{"href":1589,"dataGaName":1590,"dataGaLocation":1553},"/de-de/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1592,"description":1593,"link":1594},"Warum GitLab?","Erfahre, warum sich Unternehmen für GitLab entscheiden",{"text":1595,"config":1596},"Mehr erfahren",{"href":1597,"dataGaName":1598,"dataGaLocation":1553},"/de-de/why-gitlab/","why gitlab",{"text":1600,"left":433,"config":1601,"menu":1603},"Produkt",{"dataNavLevelOne":1602},"solutions",{"type":1604,"link":1605,"columns":1609,"feature":1679},"lists",{"text":1606,"config":1607},"Alle Lösungen anzeigen",{"href":1608,"dataGaName":1602,"dataGaLocation":1553},"/de-de/solutions/",[1610,1634,1657],{"title":1611,"description":1612,"link":1613,"items":1618},"Automatisierung","CI/CD und Automatisierung zur Beschleunigung der Bereitstellung",{"config":1614},{"icon":1615,"href":1616,"dataGaName":1617,"dataGaLocation":1553},"AutomatedCodeAlt","/de-de/solutions/delivery-automation/","automated software delivery",[1619,1622,1625,1630],{"text":1542,"config":1620},{"href":1621,"dataGaLocation":1553,"dataGaName":1542},"/de-de/solutions/continuous-integration/",{"text":1584,"config":1623},{"href":1589,"dataGaLocation":1553,"dataGaName":1624},"gitlab duo agent platform - product menu",{"text":1626,"config":1627},"Quellcodeverwaltung",{"href":1628,"dataGaLocation":1553,"dataGaName":1629},"/de-de/solutions/source-code-management/","Source Code Management",{"text":1631,"config":1632},"Automatische Softwarebereitstellung",{"href":1616,"dataGaLocation":1553,"dataGaName":1633},"Automated software delivery",{"title":1635,"description":1636,"link":1637,"items":1642},"Sicherheit","Entwickle Code schneller ohne Abstriche bei der Sicherheit",{"config":1638},{"href":1639,"dataGaName":1640,"dataGaLocation":1553,"icon":1641},"/de-de/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1643,1647,1652],{"text":1644,"config":1645},"Anwendungssicherheitstests",{"href":1639,"dataGaName":1646,"dataGaLocation":1553},"Application security testing",{"text":1648,"config":1649},"Sicherheit der Software-Lieferkette",{"href":1650,"dataGaLocation":1553,"dataGaName":1651},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":1653,"config":1654},"Software-Compliance",{"href":1655,"dataGaName":1656,"dataGaLocation":1553},"/de-de/solutions/software-compliance/","software compliance",{"title":1658,"link":1659,"items":1664},"Messung",{"config":1660},{"icon":1661,"href":1662,"dataGaName":1663,"dataGaLocation":1553},"DigitalTransformation","/de-de/solutions/visibility-measurement/","visibility and measurement",[1665,1669,1674],{"text":1666,"config":1667},"Sichtbarkeit und Messung",{"href":1662,"dataGaLocation":1553,"dataGaName":1668},"Visibility and Measurement",{"text":1670,"config":1671},"Wertstrommanagement",{"href":1672,"dataGaLocation":1553,"dataGaName":1673},"/de-de/solutions/value-stream-management/","Value Stream Management",{"text":1675,"config":1676},"Analysen und Einblicke",{"href":1677,"dataGaLocation":1553,"dataGaName":1678},"/de-de/solutions/analytics-and-insights/","Analytics and insights",{"title":1680,"type":1604,"items":1681},"GitLab für",[1682,1688,1694],{"text":1683,"config":1684},"Enterprise",{"icon":1685,"href":1686,"dataGaLocation":1553,"dataGaName":1687},"Building","/de-de/enterprise/","enterprise",{"text":1689,"config":1690},"Kleinunternehmen",{"icon":1691,"href":1692,"dataGaLocation":1553,"dataGaName":1693},"Work","/de-de/small-business/","small business",{"text":1695,"config":1696},"Öffentlicher Sektor",{"icon":1697,"href":1698,"dataGaLocation":1553,"dataGaName":1699},"Organization","/de-de/solutions/public-sector/","public sector",{"text":1701,"config":1702},"Preise",{"href":1703,"dataGaName":1704,"dataGaLocation":1553,"dataNavLevelOne":1704},"/de-de/pricing/","pricing",{"text":1706,"config":1707,"menu":1709},"Ressourcen",{"dataNavLevelOne":1708},"resources",{"type":1604,"link":1710,"columns":1714,"feature":1798},{"text":1711,"config":1712},"Alle Ressourcen anzeigen",{"href":1713,"dataGaName":1708,"dataGaLocation":1553},"/de-de/resources/",[1715,1748,1770],{"title":1716,"items":1717},"Erste Schritte",[1718,1723,1728,1733,1738,1743],{"text":1719,"config":1720},"Installieren",{"href":1721,"dataGaName":1722,"dataGaLocation":1553},"/de-de/install/","install",{"text":1724,"config":1725},"Kurzanleitungen",{"href":1726,"dataGaName":1727,"dataGaLocation":1553},"/de-de/get-started/","quick setup checklists",{"text":1729,"config":1730},"Lernen",{"href":1731,"dataGaLocation":1553,"dataGaName":1732},"https://university.gitlab.com/","learn",{"text":1734,"config":1735},"Produktdokumentation",{"href":1736,"dataGaName":1737,"dataGaLocation":1553},"https://docs.gitlab.com/","product documentation",{"text":1739,"config":1740},"Best-Practice-Videos",{"href":1741,"dataGaName":1742,"dataGaLocation":1553},"/de-de/getting-started-videos/","best practice videos",{"text":1744,"config":1745},"Integrationen",{"href":1746,"dataGaName":1747,"dataGaLocation":1553},"/de-de/integrations/","integrations",{"title":1749,"items":1750},"Entdecken",[1751,1756,1761,1765],{"text":1752,"config":1753},"Kundenerfolge",{"href":1754,"dataGaName":1755,"dataGaLocation":1553},"/de-de/customers/","customer success stories",{"text":1757,"config":1758},"Blog",{"href":1759,"dataGaName":1760,"dataGaLocation":1553},"/de-de/blog/","blog",{"text":1762,"config":1763},"The Source",{"href":1764,"dataGaName":1760,"dataGaLocation":1553},"/de-de/the-source/",{"text":1766,"config":1767},"Remote",{"href":1768,"dataGaName":1769,"dataGaLocation":1553},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1771,"items":1772},"Vernetzen",[1773,1778,1783,1788,1793],{"text":1774,"config":1775},"GitLab-Services",{"href":1776,"dataGaName":1777,"dataGaLocation":1553},"/de-de/services/","services",{"text":1779,"config":1780},"Community",{"href":1781,"dataGaName":1782,"dataGaLocation":1553},"/community/","community",{"text":1784,"config":1785},"Forum",{"href":1786,"dataGaName":1787,"dataGaLocation":1553},"https://forum.gitlab.com/","forum",{"text":1789,"config":1790},"Veranstaltungen",{"href":1791,"dataGaName":1792,"dataGaLocation":1553},"/events/","events",{"text":1794,"config":1795},"Partner",{"href":1796,"dataGaName":1797,"dataGaLocation":1553},"/de-de/partners/","partners",{"config":1799,"title":1802,"text":1803,"link":1804},{"background":1800,"textColor":1801},"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":1805,"config":1806},"Aktuelle Nachrichten",{"href":1807,"dataGaName":1808,"dataGaLocation":1553},"/de-de/releases/whats-new/","whats new",{"text":1810,"config":1811,"menu":1813},"Company",{"dataNavLevelOne":1812},"company",{"type":1604,"columns":1814},[1815],{"items":1816},[1817,1822,1828,1830,1835,1840,1845,1850,1855,1860,1865],{"text":1818,"config":1819},"Über",{"href":1820,"dataGaName":1821,"dataGaLocation":1553},"/de-de/company/","about",{"text":1823,"config":1824,"footerGa":1827},"Karriere",{"href":1825,"dataGaName":1826,"dataGaLocation":1553},"/jobs/","jobs",{"dataGaName":1826},{"text":1789,"config":1829},{"href":1791,"dataGaName":1792,"dataGaLocation":1553},{"text":1831,"config":1832},"Geschäftsführung",{"href":1833,"dataGaName":1834,"dataGaLocation":1553},"/company/team/e-group/","leadership",{"text":1836,"config":1837},"Team",{"href":1838,"dataGaName":1839,"dataGaLocation":1553},"/company/team/","team",{"text":1841,"config":1842},"Handbuch",{"href":1843,"dataGaName":1844,"dataGaLocation":1553},"https://handbook.gitlab.com/","handbook",{"text":1846,"config":1847},"Investor Relations",{"href":1848,"dataGaName":1849,"dataGaLocation":1553},"https://ir.gitlab.com/","investor relations",{"text":1851,"config":1852},"Trust Center",{"href":1853,"dataGaName":1854,"dataGaLocation":1553},"/de-de/security/","trust center",{"text":1856,"config":1857},"AI Transparency Center",{"href":1858,"dataGaName":1859,"dataGaLocation":1553},"/de-de/ai-transparency-center/","ai transparency center",{"text":1861,"config":1862},"Newsletter",{"href":1863,"dataGaName":1864,"dataGaLocation":1553},"/company/contact/#contact-forms","newsletter",{"text":1866,"config":1867},"Presse",{"href":1868,"dataGaName":1869,"dataGaLocation":1553},"/press/","press",{"text":1871,"config":1872,"menu":1873},"Kontakt",{"dataNavLevelOne":1812},{"type":1604,"columns":1874},[1875],{"items":1876},[1877,1880,1885],{"text":1560,"config":1878},{"href":1562,"dataGaName":1879,"dataGaLocation":1553},"talk to sales",{"text":1881,"config":1882},"Support-Portal",{"href":1883,"dataGaName":1884,"dataGaLocation":1553},"https://support.gitlab.com","support portal",{"text":1886,"config":1887},"Kundenportal",{"href":1888,"dataGaName":1889,"dataGaLocation":1553},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1891,"login":1892,"suggestions":1899},"Schließen",{"text":1893,"link":1894},"Um Repositorys und Projekte zu durchsuchen, melde dich an bei",{"text":1895,"config":1896},"gitlab.com",{"href":1567,"dataGaName":1897,"dataGaLocation":1898},"search login","search",{"text":1900,"default":1901},"Vorschläge",[1902,1904,1909,1911,1916,1921],{"text":1584,"config":1903},{"href":1589,"dataGaName":1584,"dataGaLocation":1898},{"text":1905,"config":1906},"Codevorschläge (KI)",{"href":1907,"dataGaName":1908,"dataGaLocation":1898},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1542,"config":1910},{"href":1621,"dataGaName":1542,"dataGaLocation":1898},{"text":1912,"config":1913},"GitLab auf AWS",{"href":1914,"dataGaName":1915,"dataGaLocation":1898},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":1917,"config":1918},"GitLab auf Google Cloud",{"href":1919,"dataGaName":1920,"dataGaLocation":1898},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":1592,"config":1922},{"href":1597,"dataGaName":1923,"dataGaLocation":1898},"Why GitLab?",{"freeTrial":1925,"mobileIcon":1930,"desktopIcon":1935,"secondaryButton":1938},{"text":1926,"config":1927},"Kostenlos testen",{"href":1928,"dataGaName":1558,"dataGaLocation":1929},"https://gitlab.com/-/trials/new/","nav",{"altText":1931,"config":1932},"GitLab-Symbol",{"src":1933,"dataGaName":1934,"dataGaLocation":1929},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1931,"config":1936},{"src":1937,"dataGaName":1934,"dataGaLocation":1929},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1716,"config":1939},{"href":1940,"dataGaName":1941,"dataGaLocation":1929},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de/get-started/","get started",{"freeTrial":1943,"mobileIcon":1947,"desktopIcon":1949},{"text":1944,"config":1945},"Mehr über GitLab Duo erfahren",{"href":1589,"dataGaName":1946,"dataGaLocation":1929},"gitlab duo",{"altText":1931,"config":1948},{"src":1933,"dataGaName":1934,"dataGaLocation":1929},{"altText":1931,"config":1950},{"src":1937,"dataGaName":1934,"dataGaLocation":1929},{"button":1952,"mobileIcon":1957,"desktopIcon":1959},{"text":1953,"config":1954},"/Option",{"href":1955,"dataGaName":1956,"dataGaLocation":1929},"#contact","switch",{"altText":1931,"config":1958},{"src":1933,"dataGaName":1934,"dataGaLocation":1929},{"altText":1931,"config":1960},{"src":1961,"dataGaName":1934,"dataGaLocation":1929},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1963,"mobileIcon":1968,"desktopIcon":1970},{"text":1964,"config":1965},"Zurück zur Preisübersicht",{"href":1703,"dataGaName":1966,"dataGaLocation":1929,"icon":1967},"back to pricing","GoBack",{"altText":1931,"config":1969},{"src":1933,"dataGaName":1934,"dataGaLocation":1929},{"altText":1931,"config":1971},{"src":1937,"dataGaName":1934,"dataGaLocation":1929},{"title":1973,"button":1974,"config":1979},"Sieh dir an, wie agentische KI die Softwarebereitstellung transformiert",{"text":1975,"config":1976},"Für GitLab Transcend am 10. Juni anmelden",{"href":1977,"dataGaName":1978,"dataGaLocation":1553},"/de-de/events/transcend/virtual/","transcend event",{"layout":1980,"disabled":1536},"release",{"data":1982},{"text":1983,"source":1984,"edit":1990,"contribute":1995,"config":2000,"items":2005,"minimal":2214},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":1985,"config":1986},"Quelltext der Seite anzeigen",{"href":1987,"dataGaName":1988,"dataGaLocation":1989},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1991,"config":1992},"Diese Seite bearbeiten",{"href":1993,"dataGaName":1994,"dataGaLocation":1989},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1996,"config":1997},"Beteilige dich",{"href":1998,"dataGaName":1999,"dataGaLocation":1989},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":2001,"facebook":2002,"youtube":2003,"linkedin":2004},"https://x.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[2006,2051,2104,2146,2178],{"title":1701,"links":2007,"subMenu":2022},[2008,2012,2017],{"text":2009,"config":2010},"Tarife anzeigen",{"href":1703,"dataGaName":2011,"dataGaLocation":1989},"view plans",{"text":2013,"config":2014},"Vorteile von Premium",{"href":2015,"dataGaName":2016,"dataGaLocation":1989},"/de-de/pricing/premium/","why premium",{"text":2018,"config":2019},"Vorteile von Ultimate",{"href":2020,"dataGaName":2021,"dataGaLocation":1989},"/de-de/pricing/ultimate/","why ultimate",[2023],{"title":1871,"links":2024},[2025,2027,2029,2031,2036,2041,2046],{"text":1560,"config":2026},{"href":1562,"dataGaName":1563,"dataGaLocation":1989},{"text":1881,"config":2028},{"href":1883,"dataGaName":1884,"dataGaLocation":1989},{"text":1886,"config":2030},{"href":1888,"dataGaName":1889,"dataGaLocation":1989},{"text":2032,"config":2033},"Status",{"href":2034,"dataGaName":2035,"dataGaLocation":1989},"https://status.gitlab.com/","status",{"text":2037,"config":2038},"Nutzungsbedingungen",{"href":2039,"dataGaName":2040,"dataGaLocation":1989},"/terms/","terms of use",{"text":2042,"config":2043},"Datenschutzerklärung",{"href":2044,"dataGaName":2045,"dataGaLocation":1989},"/de-de/privacy/","privacy statement",{"text":2047,"config":2048},"Cookie-Einstellungen",{"dataGaName":2049,"dataGaLocation":1989,"id":2050,"isOneTrustButton":433},"cookie preferences","ot-sdk-btn",{"title":1600,"links":2052,"subMenu":2061},[2053,2057],{"text":2054,"config":2055},"DevSecOps-Plattform",{"href":1582,"dataGaName":2056,"dataGaLocation":1989},"devsecops platform",{"text":2058,"config":2059},"KI-unterstützte Entwicklung",{"href":1589,"dataGaName":2060,"dataGaLocation":1989},"ai-assisted development",[2062],{"title":2063,"links":2064},"Themen",[2065,2069,2074,2079,2084,2089,2094,2099],{"text":1542,"config":2066},{"href":2067,"dataGaName":2068,"dataGaLocation":1989},"/de-de/topics/ci-cd/","cicd",{"text":2070,"config":2071},"GitOps",{"href":2072,"dataGaName":2073,"dataGaLocation":1989},"/de-de/topics/gitops/","gitops",{"text":2075,"config":2076},"DevOps",{"href":2077,"dataGaName":2078,"dataGaLocation":1989},"/de-de/topics/devops/","devops",{"text":2080,"config":2081},"Versionskontrolle",{"href":2082,"dataGaName":2083,"dataGaLocation":1989},"/de-de/topics/version-control/","version control",{"text":2085,"config":2086},"DevSecOps",{"href":2087,"dataGaName":2088,"dataGaLocation":1989},"/de-de/topics/devsecops/","devsecops",{"text":2090,"config":2091},"Cloud-nativ",{"href":2092,"dataGaName":2093,"dataGaLocation":1989},"/de-de/topics/cloud-native/","cloud native",{"text":2095,"config":2096},"KI für das Programmieren",{"href":2097,"dataGaName":2098,"dataGaLocation":1989},"/de-de/topics/devops/ai-for-coding/","ai for coding",{"text":2100,"config":2101},"Agentische KI",{"href":2102,"dataGaName":2103,"dataGaLocation":1989},"/de-de/topics/agentic-ai/","agentic ai",{"title":2105,"links":2106},"Lösungen",[2107,2110,2112,2117,2121,2124,2127,2130,2132,2134,2136,2141],{"text":1644,"config":2108},{"href":1639,"dataGaName":2109,"dataGaLocation":1989},"Application Security Testing",{"text":1631,"config":2111},{"href":1616,"dataGaName":1617,"dataGaLocation":1989},{"text":2113,"config":2114},"Agile Entwicklung",{"href":2115,"dataGaName":2116,"dataGaLocation":1989},"/de-de/solutions/agile-delivery/","agile delivery",{"text":2118,"config":2119},"SCM",{"href":1628,"dataGaName":2120,"dataGaLocation":1989},"source code management",{"text":1542,"config":2122},{"href":1621,"dataGaName":2123,"dataGaLocation":1989},"continuous integration & delivery",{"text":1670,"config":2125},{"href":1672,"dataGaName":2126,"dataGaLocation":1989},"value stream management",{"text":2070,"config":2128},{"href":2129,"dataGaName":2073,"dataGaLocation":1989},"/de-de/solutions/gitops/",{"text":1683,"config":2131},{"href":1686,"dataGaName":1687,"dataGaLocation":1989},{"text":1689,"config":2133},{"href":1692,"dataGaName":1693,"dataGaLocation":1989},{"text":1695,"config":2135},{"href":1698,"dataGaName":1699,"dataGaLocation":1989},{"text":2137,"config":2138},"Bildungswesen",{"href":2139,"dataGaName":2140,"dataGaLocation":1989},"/de-de/solutions/education/","education",{"text":2142,"config":2143},"Finanzdienstleistungen",{"href":2144,"dataGaName":2145,"dataGaLocation":1989},"/de-de/solutions/finance/","financial services",{"title":1706,"links":2147},[2148,2150,2152,2154,2157,2159,2163,2165,2167,2170,2172,2174,2176],{"text":1719,"config":2149},{"href":1721,"dataGaName":1722,"dataGaLocation":1989},{"text":1724,"config":2151},{"href":1726,"dataGaName":1727,"dataGaLocation":1989},{"text":1729,"config":2153},{"href":1731,"dataGaName":1732,"dataGaLocation":1989},{"text":1734,"config":2155},{"href":1736,"dataGaName":2156,"dataGaLocation":1989},"docs",{"text":1757,"config":2158},{"href":1759,"dataGaName":1760,"dataGaLocation":1989},{"text":2160,"config":2161},"Neuigkeiten",{"href":2162,"dataGaName":1808,"dataGaLocation":1989},"/de-de/whats-new/",{"text":1752,"config":2164},{"href":1754,"dataGaName":1755,"dataGaLocation":1989},{"text":1766,"config":2166},{"href":1768,"dataGaName":1769,"dataGaLocation":1989},{"text":2168,"config":2169},"GitLab Services",{"href":1776,"dataGaName":1777,"dataGaLocation":1989},{"text":1779,"config":2171},{"href":1781,"dataGaName":1782,"dataGaLocation":1989},{"text":1784,"config":2173},{"href":1786,"dataGaName":1787,"dataGaLocation":1989},{"text":1789,"config":2175},{"href":1791,"dataGaName":1792,"dataGaLocation":1989},{"text":1794,"config":2177},{"href":1796,"dataGaName":1797,"dataGaLocation":1989},{"title":2179,"links":2180},"Unternehmen",[2181,2183,2185,2187,2189,2191,2193,2198,2203,2205,2207,2209],{"text":1818,"config":2182},{"href":1820,"dataGaName":1812,"dataGaLocation":1989},{"text":1823,"config":2184},{"href":1825,"dataGaName":1826,"dataGaLocation":1989},{"text":1831,"config":2186},{"href":1833,"dataGaName":1834,"dataGaLocation":1989},{"text":1836,"config":2188},{"href":1838,"dataGaName":1839,"dataGaLocation":1989},{"text":1841,"config":2190},{"href":1843,"dataGaName":1844,"dataGaLocation":1989},{"text":1846,"config":2192},{"href":1848,"dataGaName":1849,"dataGaLocation":1989},{"text":2194,"config":2195},"Nachhaltigkeit",{"href":2196,"dataGaName":2197,"dataGaLocation":1989},"/sustainability/","Sustainability",{"text":2199,"config":2200},"Vielfalt, Inklusion und Zugehörigkeit",{"href":2201,"dataGaName":2202,"dataGaLocation":1989},"/de-de/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1851,"config":2204},{"href":1853,"dataGaName":1854,"dataGaLocation":1989},{"text":1861,"config":2206},{"href":1863,"dataGaName":1864,"dataGaLocation":1989},{"text":1866,"config":2208},{"href":1868,"dataGaName":1869,"dataGaLocation":1989},{"text":2210,"config":2211},"Transparenzerklärung zu moderner Sklaverei",{"href":2212,"dataGaName":2213,"dataGaLocation":1989},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2215},[2216,2218,2221],{"text":2037,"config":2217},{"href":2039,"dataGaName":2040,"dataGaLocation":1989},{"text":2219,"config":2220},"Cookies",{"dataGaName":2049,"dataGaLocation":1989,"id":2050,"isOneTrustButton":433},{"text":2042,"config":2222},{"href":2044,"dataGaName":2045,"dataGaLocation":1989},[2224],{"id":2225,"title":7,"body":1530,"config":2226,"content":2229,"description":1530,"extension":2232,"meta":2233,"navigation":433,"path":2234,"seo":2235,"stem":2236,"__hash__":2237},"blogAuthors/en-us/blog/authors/omid-khan.yml",{"template":2227,"gitlabHandle":2228},"BlogAuthor","OmidKhan",{"name":7,"config":2230,"role":412},{"headshot":2231},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1769090536/q4p3qwthtken8fpokgzu.jpg","yml",{},"/en-us/blog/authors/omid-khan",{},"en-us/blog/authors/omid-khan","4ZHOi5nEiZLdJm1phW-47SM0x-BGo8jNbg_Zt0oSzEQ",[2239,2247,2255],{"title":2240,"description":2241,"heroImage":2242,"category":1526,"date":2243,"authors":2244,"slug":2246,"externalUrl":1530},"CI/CD-Observability im Unternehmensmaßstab aufbauen","Dieser Praxisleitfaden zu GitLab Pipeline Analytics hilft Self-Managed-Nutzern, mit Prometheus und Grafana operationale Insights zu gewinnen.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-04-28",[2245],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"title":2248,"description":2249,"heroImage":2250,"category":1526,"date":2251,"authors":2252,"slug":2254,"externalUrl":1530},"GitLab Container Virtual Registry mit Docker Hardened Images einrichten","Mehrere Registries hinter einem Endpunkt – GitLab Container Virtual Registry mit Docker Hardened Images, Caching und Audit-Trail.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1772111172/mwhgbjawn62kymfwrhle.png","2026-03-12",[2253],"Tim Rizzi","using-gitlab-container-virtual-registry-with-docker-hardened-images",{"title":2256,"description":2257,"heroImage":2258,"category":1526,"date":2259,"authors":2260,"slug":2263,"externalUrl":1530},"Migration von Azure DevOps zu GitLab systematisch planen","Professional Services Migrationsansatz mit mehrstufiger Struktur, 200-300 Projekt-Wellen und systematischem Risikomanagement für Enterprise-Migrationen.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749658924/Blog/Hero%20Images/securitylifecycle-light.png","2025-12-03",[2261,2262],"Evgeny Rudinsky","Michael Leopard","migration-from-azure-devops-to-gitlab",{"promotions":2265},[2266,2280,2292,2304],{"id":2267,"categories":2268,"header":2270,"text":2271,"button":2272,"image":2277},"ai-modernization",[2269],"ai","Hält KI, was uns versprochen wurde?","Das Quiz dauert maximal 5 Minuten.",{"text":2273,"config":2274},"Ermittle deinen KI-Reifegrad",{"href":2275,"dataGaName":2276,"dataGaLocation":1760},"/de-de/assessments/ai-modernization-assessment/","modernization assessment",{"config":2278},{"src":2279},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2281,"categories":2282,"header":2284,"text":2271,"button":2285,"image":2289},"devops-modernization",[2283,2088],"product","Verwaltest du Tool-Chaos oder stellst du Innovationen bereit?",{"text":2286,"config":2287},"Ermittle deinen DevOps-Reifegrad",{"href":2288,"dataGaName":2276,"dataGaLocation":1760},"/de-de/assessments/devops-modernization-assessment/",{"config":2290},{"src":2291},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2293,"categories":2294,"header":2296,"text":2271,"button":2297,"image":2301},"security-modernization",[2295],"security","Tauschst du Schnelligkeit gegen Sicherheit ein?",{"text":2298,"config":2299},"Ermittle deinen Sicherheitsreifegrad",{"href":2300,"dataGaName":2276,"dataGaLocation":1760},"/de-de/assessments/security-modernization-assessment/",{"config":2302},{"src":2303},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2305,"paths":2306,"header":2308,"text":2309,"button":2310,"image":2315},"github-azure-migration",[2263,2307],"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":2311,"config":2312},"Erfahre, wie GitLab im Vergleich zu GitHub abschneidet",{"href":2313,"dataGaName":2314,"dataGaLocation":1760},"/de-de/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2316},{"src":2291},{"header":2318,"blurb":2319,"button":2320,"secondaryButton":2325},"Beginne noch heute, schneller zu entwickeln","Entdecke, was dein Team mit der intelligenten Orchestrierungsplattform für DevSecOps erreichen kann.\n",{"text":2321,"config":2322},"Kostenlosen Test starten",{"href":2323,"dataGaName":1558,"dataGaLocation":2324},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/de-de/","feature",{"text":1560,"config":2326},{"href":1562,"dataGaName":1563,"dataGaLocation":2324},1779746043546]