[{"data":1,"prerenderedAt":803},["ShallowReactive",2],{"/de-de/blog/categories/engineering":3,"navigation-de-de":20,"banner-de-de":444,"footer-de-de":454,"engineering-category-page-total-items-de-de":690,"engineering-category-page-featured-de-de":691,"engineering-category-page-1-de-de":720},{"id":4,"title":5,"body":6,"category":6,"config":7,"content":11,"description":6,"extension":12,"meta":13,"navigation":14,"path":15,"seo":16,"slug":6,"stem":18,"testContent":6,"type":6,"__hash__":19},"blogCategories/de-de/blog/categories/engineering.yml","Engineering",null,{"template":8,"slug":9,"hide":10},"BlogCategory","engineering",false,{"name":5},"yml",{},true,"/de-de/blog/categories/engineering",{"title":5,"description":17},"Browse articles related to Engineering on the GitLab Blog","de-de/blog/categories/engineering","2aDT2ddISb3_jPr0pKFELw8NlkxcUsQZ7Dd93XB3ya8",{"logo":21,"freeTrial":26,"sales":31,"login":36,"items":41,"search":362,"minimal":396,"duo":414,"switchNav":423,"pricingDeployment":434},{"config":22},{"href":23,"dataGaName":24,"dataGaLocation":25},"/de-de/","gitlab logo","header",{"text":27,"config":28},"Kostenlose Testversion anfordern",{"href":29,"dataGaName":30,"dataGaLocation":25},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de&glm_content=default-saas-trial/","free trial",{"text":32,"config":33},"Vertrieb kontaktieren",{"href":34,"dataGaName":35,"dataGaLocation":25},"/de-de/sales/","sales",{"text":37,"config":38},"Anmelden",{"href":39,"dataGaName":40,"dataGaLocation":25},"https://gitlab.com/users/sign_in/","sign in",[42,71,173,178,281,342],{"text":43,"config":44,"menu":46},"Plattform",{"dataNavLevelOne":45},"platform",{"type":47,"columns":48},"cards",[49,55,63],{"title":43,"description":50,"link":51},"Die intelligente Orchestrierungsplattform für DevSecOps",{"text":52,"config":53},"Die Plattform erkunden",{"href":54,"dataGaName":45,"dataGaLocation":25},"/de-de/platform/",{"title":56,"description":57,"link":58},"GitLab Duo Agent Platform","Agentische KI für den gesamten Software-Lebenszyklus",{"text":59,"config":60},"Lerne GitLab Duo kennen",{"href":61,"dataGaName":62,"dataGaLocation":25},"/de-de/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":64,"description":65,"link":66},"Warum GitLab?","Erfahre, warum sich Unternehmen für GitLab entscheiden",{"text":67,"config":68},"Mehr erfahren",{"href":69,"dataGaName":70,"dataGaLocation":25},"/de-de/why-gitlab/","why gitlab",{"text":72,"left":14,"config":73,"menu":75},"Produkt",{"dataNavLevelOne":74},"solutions",{"type":76,"link":77,"columns":81,"feature":152},"lists",{"text":78,"config":79},"Alle Lösungen anzeigen",{"href":80,"dataGaName":74,"dataGaLocation":25},"/de-de/solutions/",[82,107,130],{"title":83,"description":84,"link":85,"items":90},"Automatisierung","CI/CD und Automatisierung zur Beschleunigung der Bereitstellung",{"config":86},{"icon":87,"href":88,"dataGaName":89,"dataGaLocation":25},"AutomatedCodeAlt","/de-de/solutions/delivery-automation/","automated software delivery",[91,95,98,103],{"text":92,"config":93},"CI/CD",{"href":94,"dataGaLocation":25,"dataGaName":92},"/de-de/solutions/continuous-integration/",{"text":56,"config":96},{"href":61,"dataGaLocation":25,"dataGaName":97},"gitlab duo agent platform - product menu",{"text":99,"config":100},"Quellcodeverwaltung",{"href":101,"dataGaLocation":25,"dataGaName":102},"/de-de/solutions/source-code-management/","Source Code Management",{"text":104,"config":105},"Automatische Softwarebereitstellung",{"href":88,"dataGaLocation":25,"dataGaName":106},"Automated software delivery",{"title":108,"description":109,"link":110,"items":115},"Sicherheit","Entwickle Code schneller ohne Abstriche bei der Sicherheit",{"config":111},{"href":112,"dataGaName":113,"dataGaLocation":25,"icon":114},"/de-de/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[116,120,125],{"text":117,"config":118},"Anwendungssicherheitstests",{"href":112,"dataGaName":119,"dataGaLocation":25},"Application security testing",{"text":121,"config":122},"Schutz der Software-Lieferkette",{"href":123,"dataGaLocation":25,"dataGaName":124},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":126,"config":127},"Software-Compliance",{"href":128,"dataGaName":129,"dataGaLocation":25},"/de-de/solutions/software-compliance/","software compliance",{"title":131,"link":132,"items":137},"Auswertung",{"config":133},{"icon":134,"href":135,"dataGaName":136,"dataGaLocation":25},"DigitalTransformation","/de-de/solutions/visibility-measurement/","visibility and measurement",[138,142,147],{"text":139,"config":140},"Sichtbarkeit und Auswertung",{"href":135,"dataGaLocation":25,"dataGaName":141},"Visibility and Measurement",{"text":143,"config":144},"Wertstrommanagement",{"href":145,"dataGaLocation":25,"dataGaName":146},"/de-de/solutions/value-stream-management/","Value Stream Management",{"text":148,"config":149},"Analysen und Einblicke",{"href":150,"dataGaLocation":25,"dataGaName":151},"/de-de/solutions/analytics-and-insights/","Analytics and insights",{"title":153,"type":76,"items":154},"GitLab für",[155,161,167],{"text":156,"config":157},"Enterprise",{"icon":158,"href":159,"dataGaLocation":25,"dataGaName":160},"Building","/de-de/enterprise/","enterprise",{"text":162,"config":163},"Kleinunternehmen",{"icon":164,"href":165,"dataGaLocation":25,"dataGaName":166},"Work","/de-de/small-business/","small business",{"text":168,"config":169},"Öffentlicher Sektor",{"icon":170,"href":171,"dataGaLocation":25,"dataGaName":172},"Organization","/de-de/solutions/public-sector/","public sector",{"text":174,"config":175},"Preise",{"href":176,"dataGaName":177,"dataGaLocation":25,"dataNavLevelOne":177},"/de-de/pricing/","pricing",{"text":179,"config":180,"menu":182},"Ressourcen",{"dataNavLevelOne":181},"resources",{"type":76,"link":183,"columns":187,"feature":267},{"text":184,"config":185},"Alle Ressourcen anzeigen",{"href":186,"dataGaName":181,"dataGaLocation":25},"/de-de/resources/",[188,221,239],{"title":189,"items":190},"Erste Schritte",[191,196,201,206,211,216],{"text":192,"config":193},"Installieren",{"href":194,"dataGaName":195,"dataGaLocation":25},"/de-de/install/","install",{"text":197,"config":198},"Kurzanleitungen",{"href":199,"dataGaName":200,"dataGaLocation":25},"/de-de/get-started/","quick setup checklists",{"text":202,"config":203},"Lernen",{"href":204,"dataGaLocation":25,"dataGaName":205},"https://university.gitlab.com/","learn",{"text":207,"config":208},"Produktdokumentation",{"href":209,"dataGaName":210,"dataGaLocation":25},"https://docs.gitlab.com/","product documentation",{"text":212,"config":213},"Best-Practice-Videos",{"href":214,"dataGaName":215,"dataGaLocation":25},"/de-de/getting-started-videos/","best practice videos",{"text":217,"config":218},"Integrationen",{"href":219,"dataGaName":220,"dataGaLocation":25},"/de-de/integrations/","integrations",{"title":222,"items":223},"Entdecken",[224,229,234],{"text":225,"config":226},"Kundenerfolge",{"href":227,"dataGaName":228,"dataGaLocation":25},"/de-de/customers/","customer success stories",{"text":230,"config":231},"Blog",{"href":232,"dataGaName":233,"dataGaLocation":25},"/de-de/blog/","blog",{"text":235,"config":236},"Remote",{"href":237,"dataGaName":238,"dataGaLocation":25},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":240,"items":241},"Vernetzen",[242,247,252,257,262],{"text":243,"config":244},"GitLab Services",{"href":245,"dataGaName":246,"dataGaLocation":25},"/de-de/services/","services",{"text":248,"config":249},"Community",{"href":250,"dataGaName":251,"dataGaLocation":25},"/community/","community",{"text":253,"config":254},"Forum",{"href":255,"dataGaName":256,"dataGaLocation":25},"https://forum.gitlab.com/","forum",{"text":258,"config":259},"Veranstaltungen",{"href":260,"dataGaName":261,"dataGaLocation":25},"/events/","events",{"text":263,"config":264},"Partner",{"href":265,"dataGaName":266,"dataGaLocation":25},"/de-de/partners/","partners",{"config":268,"text":271,"image":272,"link":276},{"background":269,"textColor":270},"#2f2a6b","#fff","Perspektiven für die Softwareentwicklung der Zukunft",{"altText":273,"config":274},"The Source Promo-Karte",{"src":275},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.svg",{"text":277,"config":278},"Aktuelles",{"href":279,"dataGaName":280,"dataGaLocation":25},"/de-de/the-source/","the source",{"text":282,"config":283,"menu":285},"Unternehmen",{"dataNavLevelOne":284},"company",{"type":76,"columns":286},[287],{"items":288},[289,294,300,302,307,312,317,322,327,332,337],{"text":290,"config":291},"Über",{"href":292,"dataGaName":293,"dataGaLocation":25},"/de-de/company/","about",{"text":295,"config":296,"footerGa":299},"Karriere",{"href":297,"dataGaName":298,"dataGaLocation":25},"/jobs/","jobs",{"dataGaName":298},{"text":258,"config":301},{"href":260,"dataGaName":261,"dataGaLocation":25},{"text":303,"config":304},"Geschäftsführung",{"href":305,"dataGaName":306,"dataGaLocation":25},"/company/team/e-group/","leadership",{"text":308,"config":309},"Team",{"href":310,"dataGaName":311,"dataGaLocation":25},"/company/team/","team",{"text":313,"config":314},"Handbuch",{"href":315,"dataGaName":316,"dataGaLocation":25},"https://handbook.gitlab.com/","handbook",{"text":318,"config":319},"Investor Relations",{"href":320,"dataGaName":321,"dataGaLocation":25},"https://ir.gitlab.com/","investor relations",{"text":323,"config":324},"Trust Center",{"href":325,"dataGaName":326,"dataGaLocation":25},"/de-de/security/","trust center",{"text":328,"config":329},"AI Transparency Center",{"href":330,"dataGaName":331,"dataGaLocation":25},"/de-de/ai-transparency-center/","ai transparency center",{"text":333,"config":334},"Newsletter",{"href":335,"dataGaName":336,"dataGaLocation":25},"/company/contact/#contact-forms","newsletter",{"text":338,"config":339},"Presse",{"href":340,"dataGaName":341,"dataGaLocation":25},"/press/","press",{"text":343,"config":344,"menu":345},"Kontakt",{"dataNavLevelOne":284},{"type":76,"columns":346},[347],{"items":348},[349,352,357],{"text":32,"config":350},{"href":34,"dataGaName":351,"dataGaLocation":25},"talk to sales",{"text":353,"config":354},"Support-Portal",{"href":355,"dataGaName":356,"dataGaLocation":25},"https://support.gitlab.com","support portal",{"text":358,"config":359},"Kundenportal",{"href":360,"dataGaName":361,"dataGaLocation":25},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":363,"login":364,"suggestions":371},"Schließen",{"text":365,"link":366},"Um Repositorys und Projekte zu durchsuchen, melde dich an bei",{"text":367,"config":368},"gitlab.com",{"href":39,"dataGaName":369,"dataGaLocation":370},"search login","search",{"text":372,"default":373},"Vorschläge",[374,376,381,383,388,393],{"text":56,"config":375},{"href":61,"dataGaName":56,"dataGaLocation":370},{"text":377,"config":378},"Codevorschläge (KI)",{"href":379,"dataGaName":380,"dataGaLocation":370},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":92,"config":382},{"href":94,"dataGaName":92,"dataGaLocation":370},{"text":384,"config":385},"GitLab auf AWS",{"href":386,"dataGaName":387,"dataGaLocation":370},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":389,"config":390},"GitLab auf Google Cloud",{"href":391,"dataGaName":392,"dataGaLocation":370},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":64,"config":394},{"href":69,"dataGaName":395,"dataGaLocation":370},"Why GitLab?",{"freeTrial":397,"mobileIcon":402,"desktopIcon":407,"secondaryButton":410},{"text":398,"config":399},"Kostenlos testen",{"href":400,"dataGaName":30,"dataGaLocation":401},"https://gitlab.com/-/trials/new/","nav",{"altText":403,"config":404},"GitLab-Symbol",{"src":405,"dataGaName":406,"dataGaLocation":401},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":403,"config":408},{"src":409,"dataGaName":406,"dataGaLocation":401},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":189,"config":411},{"href":412,"dataGaName":413,"dataGaLocation":401},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de/get-started/","get started",{"freeTrial":415,"mobileIcon":419,"desktopIcon":421},{"text":416,"config":417},"Mehr über GitLab Duo erfahren",{"href":61,"dataGaName":418,"dataGaLocation":401},"gitlab duo",{"altText":403,"config":420},{"src":405,"dataGaName":406,"dataGaLocation":401},{"altText":403,"config":422},{"src":409,"dataGaName":406,"dataGaLocation":401},{"button":424,"mobileIcon":429,"desktopIcon":431},{"text":425,"config":426},"/Option",{"href":427,"dataGaName":428,"dataGaLocation":401},"#contact","switch",{"altText":403,"config":430},{"src":405,"dataGaName":406,"dataGaLocation":401},{"altText":403,"config":432},{"src":433,"dataGaName":406,"dataGaLocation":401},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":435,"mobileIcon":440,"desktopIcon":442},{"text":436,"config":437},"Zurück zur Preisübersicht",{"href":176,"dataGaName":438,"dataGaLocation":401,"icon":439},"back to pricing","GoBack",{"altText":403,"config":441},{"src":405,"dataGaName":406,"dataGaLocation":401},{"altText":403,"config":443},{"src":409,"dataGaName":406,"dataGaLocation":401},{"title":445,"button":446,"config":451},"Sieh dir an, wie agentische KI die Softwarebereitstellung transformiert",{"text":447,"config":448},"Für GitLab Transcend am 10. Juni anmelden",{"href":449,"dataGaName":450,"dataGaLocation":25},"/de-de/releases/whats-new/#sign-up","transcend event",{"layout":452,"icon":453,"disabled":10},"release","AiStar",{"data":455},{"text":456,"source":457,"edit":463,"contribute":468,"config":473,"items":478,"minimal":681},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":458,"config":459},"Quelltext der Seite anzeigen",{"href":460,"dataGaName":461,"dataGaLocation":462},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":464,"config":465},"Diese Seite bearbeiten",{"href":466,"dataGaName":467,"dataGaLocation":462},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":469,"config":470},"Beteilige dich",{"href":471,"dataGaName":472,"dataGaLocation":462},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":474,"facebook":475,"youtube":476,"linkedin":477},"https://x.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[479,524,577,619,646],{"title":174,"links":480,"subMenu":495},[481,485,490],{"text":482,"config":483},"Tarife anzeigen",{"href":176,"dataGaName":484,"dataGaLocation":462},"view plans",{"text":486,"config":487},"Vorteile von Premium",{"href":488,"dataGaName":489,"dataGaLocation":462},"/de-de/pricing/premium/","why premium",{"text":491,"config":492},"Vorteile von Ultimate",{"href":493,"dataGaName":494,"dataGaLocation":462},"/de-de/pricing/ultimate/","why ultimate",[496],{"title":343,"links":497},[498,500,502,504,509,514,519],{"text":32,"config":499},{"href":34,"dataGaName":35,"dataGaLocation":462},{"text":353,"config":501},{"href":355,"dataGaName":356,"dataGaLocation":462},{"text":358,"config":503},{"href":360,"dataGaName":361,"dataGaLocation":462},{"text":505,"config":506},"Status",{"href":507,"dataGaName":508,"dataGaLocation":462},"https://status.gitlab.com/","status",{"text":510,"config":511},"Nutzungsbedingungen",{"href":512,"dataGaName":513,"dataGaLocation":462},"/terms/","terms of use",{"text":515,"config":516},"Datenschutzerklärung",{"href":517,"dataGaName":518,"dataGaLocation":462},"/de-de/privacy/","privacy statement",{"text":520,"config":521},"Cookie-Einstellungen",{"dataGaName":522,"dataGaLocation":462,"id":523,"isOneTrustButton":14},"cookie preferences","ot-sdk-btn",{"title":72,"links":525,"subMenu":534},[526,530],{"text":527,"config":528},"DevSecOps-Plattform",{"href":54,"dataGaName":529,"dataGaLocation":462},"devsecops platform",{"text":531,"config":532},"KI-unterstützte Entwicklung",{"href":61,"dataGaName":533,"dataGaLocation":462},"ai-assisted development",[535],{"title":536,"links":537},"Themen",[538,542,547,552,557,562,567,572],{"text":92,"config":539},{"href":540,"dataGaName":541,"dataGaLocation":462},"/de-de/topics/ci-cd/","cicd",{"text":543,"config":544},"GitOps",{"href":545,"dataGaName":546,"dataGaLocation":462},"/de-de/topics/gitops/","gitops",{"text":548,"config":549},"DevOps",{"href":550,"dataGaName":551,"dataGaLocation":462},"/de-de/topics/devops/","devops",{"text":553,"config":554},"Versionskontrolle",{"href":555,"dataGaName":556,"dataGaLocation":462},"/de-de/topics/version-control/","version control",{"text":558,"config":559},"DevSecOps",{"href":560,"dataGaName":561,"dataGaLocation":462},"/de-de/topics/devsecops/","devsecops",{"text":563,"config":564},"Cloud-nativ",{"href":565,"dataGaName":566,"dataGaLocation":462},"/de-de/topics/cloud-native/","cloud native",{"text":568,"config":569},"KI für das Programmieren",{"href":570,"dataGaName":571,"dataGaLocation":462},"/de-de/topics/devops/ai-for-coding/","ai for coding",{"text":573,"config":574},"Agentische KI",{"href":575,"dataGaName":576,"dataGaLocation":462},"/de-de/topics/agentic-ai/","agentic ai",{"title":578,"links":579},"Lösungen",[580,583,585,590,594,597,600,603,605,607,609,614],{"text":117,"config":581},{"href":112,"dataGaName":582,"dataGaLocation":462},"Application Security Testing",{"text":104,"config":584},{"href":88,"dataGaName":89,"dataGaLocation":462},{"text":586,"config":587},"Agile Entwicklung",{"href":588,"dataGaName":589,"dataGaLocation":462},"/de-de/solutions/agile-delivery/","agile delivery",{"text":591,"config":592},"SCM",{"href":101,"dataGaName":593,"dataGaLocation":462},"source code management",{"text":92,"config":595},{"href":94,"dataGaName":596,"dataGaLocation":462},"continuous integration & delivery",{"text":143,"config":598},{"href":145,"dataGaName":599,"dataGaLocation":462},"value stream management",{"text":543,"config":601},{"href":602,"dataGaName":546,"dataGaLocation":462},"/de-de/solutions/gitops/",{"text":156,"config":604},{"href":159,"dataGaName":160,"dataGaLocation":462},{"text":162,"config":606},{"href":165,"dataGaName":166,"dataGaLocation":462},{"text":168,"config":608},{"href":171,"dataGaName":172,"dataGaLocation":462},{"text":610,"config":611},"Bildungswesen",{"href":612,"dataGaName":613,"dataGaLocation":462},"/de-de/solutions/education/","education",{"text":615,"config":616},"Finanzdienstleistungen",{"href":617,"dataGaName":618,"dataGaLocation":462},"/de-de/solutions/finance/","financial services",{"title":179,"links":620},[621,623,625,627,630,632,634,636,638,640,642,644],{"text":192,"config":622},{"href":194,"dataGaName":195,"dataGaLocation":462},{"text":197,"config":624},{"href":199,"dataGaName":200,"dataGaLocation":462},{"text":202,"config":626},{"href":204,"dataGaName":205,"dataGaLocation":462},{"text":207,"config":628},{"href":209,"dataGaName":629,"dataGaLocation":462},"docs",{"text":230,"config":631},{"href":232,"dataGaName":233,"dataGaLocation":462},{"text":225,"config":633},{"href":227,"dataGaName":228,"dataGaLocation":462},{"text":235,"config":635},{"href":237,"dataGaName":238,"dataGaLocation":462},{"text":243,"config":637},{"href":245,"dataGaName":246,"dataGaLocation":462},{"text":248,"config":639},{"href":250,"dataGaName":251,"dataGaLocation":462},{"text":253,"config":641},{"href":255,"dataGaName":256,"dataGaLocation":462},{"text":258,"config":643},{"href":260,"dataGaName":261,"dataGaLocation":462},{"text":263,"config":645},{"href":265,"dataGaName":266,"dataGaLocation":462},{"title":282,"links":647},[648,650,652,654,656,658,660,665,670,672,674,676],{"text":290,"config":649},{"href":292,"dataGaName":284,"dataGaLocation":462},{"text":295,"config":651},{"href":297,"dataGaName":298,"dataGaLocation":462},{"text":303,"config":653},{"href":305,"dataGaName":306,"dataGaLocation":462},{"text":308,"config":655},{"href":310,"dataGaName":311,"dataGaLocation":462},{"text":313,"config":657},{"href":315,"dataGaName":316,"dataGaLocation":462},{"text":318,"config":659},{"href":320,"dataGaName":321,"dataGaLocation":462},{"text":661,"config":662},"Nachhaltigkeit",{"href":663,"dataGaName":664,"dataGaLocation":462},"/sustainability/","Sustainability",{"text":666,"config":667},"Vielfalt, Inklusion und Zugehörigkeit",{"href":668,"dataGaName":669,"dataGaLocation":462},"/de-de/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":323,"config":671},{"href":325,"dataGaName":326,"dataGaLocation":462},{"text":333,"config":673},{"href":335,"dataGaName":336,"dataGaLocation":462},{"text":338,"config":675},{"href":340,"dataGaName":341,"dataGaLocation":462},{"text":677,"config":678},"Transparenzerklärung zu moderner Sklaverei",{"href":679,"dataGaName":680,"dataGaLocation":462},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":682},[683,685,688],{"text":510,"config":684},{"href":512,"dataGaName":513,"dataGaLocation":462},{"text":686,"config":687},"Cookies",{"dataGaName":522,"dataGaLocation":462,"id":523,"isOneTrustButton":14},{"text":515,"config":689},{"href":517,"dataGaName":518,"dataGaLocation":462},31,{"id":692,"title":693,"authorSlugs":694,"authors":696,"body":698,"category":9,"categorySlug":9,"config":699,"content":702,"date":706,"description":703,"extension":12,"externalUrl":6,"featured":10,"heroImage":705,"isFeatured":10,"meta":710,"navigation":14,"path":711,"publishedDate":706,"rawbody":712,"seo":713,"slug":701,"stem":716,"tagSlugs":717,"tags":718,"template":700,"updatedDate":6,"__hash__":719},"blogPosts/de-de/blog/how-to-build-ci-cd-observability-at-scale.yml","CI/CD-Observability im Unternehmensmaßstab aufbauen",[695],"paul-meresanu",[697],"Paul Meresanu","CI/CD-Optimierung beginnt mit Transparenz. Eine erfolgreiche DevOps-Plattform\nim Unternehmensmaßstab umfasst das Verständnis von Pipeline-Performance,\nJob-Ausführungsmustern und quantifizierbaren operationalen Insights – insbesondere\nfür Unternehmen, die GitLab Self-Managed betreiben.\n\nUm GitLab-Kund(inn)en dabei zu helfen, den vollen Nutzen ihrer Plattform\nauszuschöpfen, haben wir die GitLab CI/CD Observability-Lösung als Teil unseres\nPlatform Excellence-Programms entwickelt. Sie verwandelt rohe Pipeline-Metriken\nin handlungsrelevante operationale Erkenntnisse.\n\nEin führendes Finanzdienstleistungsunternehmen hat gemeinsam mit GitLabs Customer\nSuccess Architect Transparenz über seine GitLab Self-Managed-Deployments\ngewonnen. Gemeinsam haben wir eine containerisierte Observability-Lösung\nimplementiert, die den Open-Source-gitlab-ci-pipelines-exporter mit\nunternehmensgerechter Prometheus- und Grafana-Infrastruktur kombiniert.\n\nIn diesem Artikel werden die Herausforderungen beim Pipeline-Management im\nUnternehmensmaßstab erläutert – und wie GitLab CI/CD Observability diese mit\neiner praxisnahen End-to-End-Implementierung adressiert.\n\n\n## Die Herausforderung: CI/CD-Performance messen\n\nVor der Implementierung einer Observability-Lösung sollte die\nMessdimension klar definiert sein:\n\n* **Welche Metriken sind relevant?** Pipeline-Dauer, Job-Erfolgsraten,\n  Queue-Zeiten, Runner-Auslastung\n* **Wer braucht Transparenz?** Entwickler(innen), DevOps-Engineers,\n  Plattformteams, Führungsebene\n* **Welche Entscheidungen werden damit getroffen?** Infrastrukturinvestitionen,\n  Engpass-Behebung, Kapazitätsplanung\n\n\n## Lösungsarchitektur: Ein vollständiges Dashboard-Set für Observability\n\nNach dem Deployment stellt der Observability-Stack ein Set von\nGrafana-Dashboards bereit, das Echtzeit- und historische Transparenz über die\nCI/CD-Plattform bietet. Ein typisches Deployment umfasst:\n\n* **Pipeline Overview Dashboard:** Eine übergeordnete Ansicht mit Gesamtzahl\n  der Pipeline-Läufe, Erfolgs-/Fehlerquoten über die Zeit (als gestapelte\n  Balken- oder Zeitreihencharts) und Trends bei der durchschnittlichen\n  Pipeline-Dauer. Panels verwenden farbcodierte Statusindikatoren (Grün für\n  Erfolg, Rot für Fehler, Gelb für Abbruch), damit Plattformteams\n  Verschlechterungen auf einen Blick erkennen.\n* **Job Performance Dashboard:** Drill-down-Panels mit Verteilungen der\n  einzelnen Job-Dauern (Histogramm), den 10 langsamsten Jobs nach\n  Durchschnittsdauer und Job-Fehler-Heatmaps nach Projekt und Stage. Hier\n  identifizieren Teams konkrete Engpass-Jobs, die sich zu optimieren lohnen.\n* **Runner & Infrastructure Dashboard:** Kombiniert Node-Exporter-Host-Metriken\n  (CPU, Arbeitsspeicher, Disk) mit Pipeline-Queue-Zeit-Daten, um\n  Infrastruktur-Sättigung mit Pipeline-Wartezeiten zu korrelieren. Nützlich\n  für Kapazitätsplanungsentscheidungen wie die Skalierung von Runner-Pools oder\n  das Upgrade von Instanzgrößen.\n* **Deployment Frequency Dashboard:** Verfolgt Deployment-Anzahl und\n  -Dauer über die Zeit pro Umgebung, abgestimmt auf DORA-Metriken. Hilft\n  der Engineering-Führungsebene, Lieferdurchsatz und Environment-Drift\n  (Commits hinter main) zu bewerten.\n\nJedes Dashboard wird automatisch über Grafanas dateibasiertes Provisioning\nbereitgestellt, sodass es konsistent über alle Umgebungen hinweg deployed wird.\nDie Dashboards lassen sich über Grafana-Variablen weiter anpassen, um nach\nProjekt, Ref/Branch oder Zeitraum zu filtern.\n\n![Lösungsarchitektur](https://res.cloudinary.com/about-gitlab-com/image/upload/v1777382608/Blog/Imported/blog-building-ci-cd-observability-stack-for-gitlab-self-managed/image1.png)\n\nDie Lösung benötigt zwei Exporter:\n\n* **Pipeline Exporter:** Erfasst CI/CD-Metriken über die GitLab API\n  (Pipeline-Dauer, Job-Status, Deployments)\n* **Node Exporter:** Erfasst Host-Metriken (CPU, Arbeitsspeicher, Disk)\n  für die Infrastruktur-Korrelation\n\n**Voraussetzungen:**\n\n* GitLab Self-Managed Version 18.1+\n* **Container-Orchestrierungsplattform:** Ein Kubernetes-Cluster (empfohlen\n  für Unternehmens-Deployments) oder eine Container-Runtime wie Docker/Podman\n  für kleinere Umgebungen oder Proof-of-Concept-Deployments. Die primäre\n  Deployment-Anleitung unten zielt auf Kubernetes; eine Docker-Compose-Alternative\n  ist im Anhang für lokales Testen und Evaluation verfügbar\n* GitLab Personal Access Token (Scope **read_api**)\n\nDie vollständige Implementierungsanleitung mit allen Kubernetes-Manifesten\nfolgt direkt im Anschluss.\n\n\n## Kubernetes-Deployment (empfohlen)\n\nFür Unternehmensumgebungen wird jede Komponente als separates Deployment in\neinem dedizierten Namespace deployed. Dieser Ansatz integriert sich in\nbestehende Cluster-Infrastruktur, Secrets-Management und Network-Policies.\n\n### 1. Namespace und Secret erstellen\n\n```bash\nkubectl create namespace gitlab-observability\n\n# GitLab-Token-Secret erstellen (siehe Abschnitt Secrets-Management\n# für unternehmensgerechte Ansätze mit externen Secret-Operatoren)\nkubectl create secret generic gitlab-token \\\n  --from-literal=token=glpat-xxxxxxxxxxxx \\\n  -n gitlab-observability\n```\n\n### 2. Pipeline Exporter deployen\n\n```yaml\n# exporter-deployment.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: gitlab-ci-pipelines-exporter\n  namespace: gitlab-observability\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: gitlab-ci-pipelines-exporter\n  template:\n    metadata:\n      labels:\n        app: gitlab-ci-pipelines-exporter\n    spec:\n      containers:\n        - name: exporter\n          image: mvisonneau/gitlab-ci-pipelines-exporter:latest\n          ports:\n            - containerPort: 8080\n          env:\n            - name: GCPE_GITLAB_TOKEN\n              valueFrom:\n                secretKeyRef:\n                  name: gitlab-token\n                  key: token\n            - name: GCPE_CONFIG\n              value: /etc/gcpe/config.yml\n          volumeMounts:\n            - name: config\n              mountPath: /etc/gcpe\n      volumes:\n        - name: config\n          configMap:\n            name: gcpe-config\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: gitlab-ci-pipelines-exporter\n  namespace: gitlab-observability\nspec:\n  selector:\n    app: gitlab-ci-pipelines-exporter\n  ports:\n    - port: 8080\n      targetPort: 8080\n```\n\n### 3. Node Exporter deployen (DaemonSet)\n\n```yaml\n# node-exporter-daemonset.yaml\napiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n  name: node-exporter\n  namespace: gitlab-observability\nspec:\n  selector:\n    matchLabels:\n      app: node-exporter\n  template:\n    metadata:\n      labels:\n        app: node-exporter\n    spec:\n      containers:\n        - name: node-exporter\n          image: prom/node-exporter:latest\n          ports:\n            - containerPort: 9100\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: node-exporter\n  namespace: gitlab-observability\nspec:\n  selector:\n    app: node-exporter\n  ports:\n    - port: 9100\n      targetPort: 9100\n```\n\n### 4. Prometheus deployen\n\n```yaml\n# prometheus-deployment.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: prometheus\n  namespace: gitlab-observability\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: prometheus\n  template:\n    metadata:\n      labels:\n        app: prometheus\n    spec:\n      containers:\n        - name: prometheus\n          image: prom/prometheus:latest\n          ports:\n            - containerPort: 9090\n          volumeMounts:\n            - name: config\n              mountPath: /etc/prometheus\n      volumes:\n        - name: config\n          configMap:\n            name: prometheus-config\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: prometheus\n  namespace: gitlab-observability\nspec:\n  selector:\n    app: prometheus\n  ports:\n    - port: 9090\n      targetPort: 9090\n```\n\n### 5. Grafana deployen\n\nDas folgende Grafana-Deployment startet mit deaktivierter Authentifizierung\n(`GF_AUTH_ANONYMOUS_ENABLED: true`) für den einfachen Einstieg.\n\n**Diese Einstellung erlaubt jedem mit Netzwerkzugang, alle Dashboards ohne\nAnmeldung einzusehen.** Für Produktions-Deployments diese Variable entfernen\noder auf false setzen und einen geeigneten Authentifizierungs-Provider\n(LDAP, SAML/SSO oder OAuth) konfigurieren, um den Zugriff auf autorisierte\nNutzende zu beschränken.\n\n```yaml\n# grafana-deployment.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: grafana\n  namespace: gitlab-observability\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: grafana\n  template:\n    metadata:\n      labels:\n        app: grafana\n    spec:\n      containers:\n        - name: grafana\n          image: grafana/grafana:10.0.0\n          ports:\n            - containerPort: 3000\n          env:\n            # Für Produktion ENTFERNEN oder auf 'false' setzen.\n            # Bei 'true' können alle Nutzenden mit Netzwerkzugang\n            # Dashboards ohne Authentifizierung einsehen.\n            - name: GF_AUTH_ANONYMOUS_ENABLED\n              value: 'true'\n          volumeMounts:\n            - name: dashboards-provider\n              mountPath: /etc/grafana/provisioning/dashboards\n            - name: datasources\n              mountPath: /etc/grafana/provisioning/datasources\n            - name: dashboards\n              mountPath: /var/lib/grafana/dashboards\n      volumes:\n        - name: dashboards-provider\n          configMap:\n            name: grafana-dashboards-provider\n        - name: datasources\n          configMap:\n            name: grafana-datasources\n        - name: dashboards\n          configMap:\n            name: grafana-dashboards\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: grafana\n  namespace: gitlab-observability\nspec:\n  selector:\n    app: grafana\n  ports:\n    - port: 3000\n      targetPort: 3000\n```\n\n### 6. Network Policy setzen\n\nDen Inter-Pod-Traffic auf die erforderlichen Kommunikationspfade beschränken:\n\n```yaml\n# network-policy.yaml\napiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: observability-policy\n  namespace: gitlab-observability\nspec:\n  podSelector: {}\n  policyTypes:\n    - Ingress\n  ingress:\n    # Prometheus scrapt Exporter und Node-Exporter\n    - from:\n        - podSelector:\n            matchLabels:\n              app: prometheus\n      ports:\n        - port: 8080\n        - port: 9100\n    # Grafana fragt Prometheus ab\n    - from:\n        - podSelector:\n            matchLabels:\n              app: grafana\n      ports:\n        - port: 9090\n```\n\n### 7. Validieren\n\n```bash\nkubectl get pods -n gitlab-observability\nkubectl port-forward svc/grafana 3000:3000 -n gitlab-observability\ncurl http://localhost:3000/api/health\n```\n\n\n## Konfigurationsreferenz\n\n### Exporter-Konfiguration\n\n```yaml\n# gitlab-ci-pipelines-exporter.yml (ConfigMap: gcpe-config)\nlog:\n  level: info\ngitlab:\n  url: https://gitlab.your-domain.com\n  maximum_requests_per_second: 10\nproject_defaults:\n  pull:\n    pipeline:\n      jobs:\n        enabled: true\nwildcards:\n  - owner:\n      name: your-group-name\n      kind: group\n    archived: false\n```\n\n### Prometheus-Konfiguration\n\n```yaml\n# prometheus.yml (ConfigMap: prometheus-config)\nglobal:\n  scrape_interval: 15s\nscrape_configs:\n  - job_name: 'gitlab-ci-pipelines-exporter'\n    static_configs:\n      - targets: ['gitlab-ci-pipelines-exporter:8080']\n  - job_name: 'node-exporter'\n    static_configs:\n      - targets: ['node-exporter:9100']\n```\n\n### Grafana-Datenquellen\n\n```yaml\n# datasources.yml (ConfigMap: grafana-datasources)\napiVersion: 1\ndatasources:\n  - name: Prometheus\n    type: prometheus\n    access: proxy\n    url: http://prometheus:9090\n    isDefault: true\n# dashboards.yml (ConfigMap: grafana-dashboards-provider)\napiVersion: 1\nproviders:\n  - name: 'default'\n    folder: 'GitLab CI/CD'\n    type: file\n    options:\n      path: /var/lib/grafana/dashboards\n```\n\n\n## Wichtige Metriken\n\n### Pipeline-Exporter-Metriken\n\n| Metrik | Beschreibung |\n| :---- | :---- |\n| `gitlab_ci_pipeline_duration_seconds` | Pipeline-Ausführungszeit |\n| `gitlab_ci_pipeline_status` | Pipeline-Erfolg/-Fehler nach Projekt |\n| `gitlab_ci_pipeline_job_duration_seconds` | Einzelne Job-Ausführungszeit |\n| `gitlab_ci_pipeline_job_status` | Job-Erfolgs-/-Fehlerstatus |\n| `gitlab_ci_pipeline_job_artifact_size_bytes` | Artifact-Speicherverbrauch |\n| `gitlab_ci_pipeline_coverage` | Code-Coverage-Prozentsatz |\n| `gitlab_ci_environment_deployment_count` | Deployment-Häufigkeit |\n| `gitlab_ci_environment_deployment_duration_seconds` | Deployment-Ausführungszeit |\n| `gitlab_ci_environment_behind_commits_count` | Environment-Drift gegenüber main |\n\n### Node-Exporter-Metriken\n\n| Metrik | Beschreibung |\n| :---- | :---- |\n| `node_cpu_seconds_total` | CPU-Auslastung |\n| `node_memory_MemAvailable_bytes` | Verfügbarer Arbeitsspeicher |\n| `node_filesystem_avail_bytes` | Verfügbarer Festplattenspeicher |\n| `node_load1` | 1-Minuten-Lastdurchschnitt |\n\n\n## Fehlerbehebung\n\n### Grafana-Plugin-Installation in Air-gapped-Umgebungen\n\nFür Offline-Umgebungen Plugins manuell installieren. Beispiel für Kubernetes:\n\n```bash\n# Plugin-ZIP in den Grafana-Pod kopieren\nkubectl cp grafana-polystat-panel-2.1.16.zip \\\n  gitlab-observability/grafana-\u003Cpod-id>:/tmp/\n# Plugin entpacken\nkubectl exec -it -n gitlab-observability deploy/grafana -- \\\n  sh -c \"unzip /tmp/grafana-polystat-panel-2.1.16.zip -d /var/lib/grafana/plugins/\"\n# Grafana-Pod neu starten\nkubectl rollout restart deployment/grafana -n gitlab-observability\n# Installation prüfen\nkubectl exec -it -n gitlab-observability deploy/grafana -- \\\n  ls -al /var/lib/grafana/plugins/\n```\n\n\n## Unternehmensaspekte\n\nFür regulierte Branchen gilt:\n\n* **Token-Sicherheit:** GitLab Personal Access Tokens in einem dedizierten\n  Secrets-Manager speichern, nicht hartcodiert in ConfigMaps. Token-Rotation\n  durchsetzen und den Scope auf **read\\_api** beschränken.\n* **Netzwerksegmentierung:** Hinter einem Reverse Proxy mit TLS-Terminierung\n  deployen. In Kubernetes einen Ingress-Controller mit automatisierter\n  Zertifikatsbereitstellung verwenden.\n* **Authentifizierung:** Grafana mit dem Identity Provider der Organisation\n  konfigurieren (SAML, LDAP oder OAuth/OIDC), um rollenbasierte\n  Zugriffskontrolle auf Dashboards durchzusetzen.\n\n\n## Warum GitLab?\n\nGitLabs API-First-Design ermöglicht individuelle Observability-Lösungen, die\nnative Funktionen wie Value Stream Analytics und DORA-Metriken ergänzen. Die\noffene Architektur erlaubt es Unternehmen, bewährte Open-Source-Werkzeuge –\nwie den gitlab-ci-pipelines-exporter – direkt in bestehende\nUnternehmensinfrastruktur zu integrieren, ohne etablierte Workflows zu\nunterbrechen.\n\nMit wachsender Observability-Reife bieten GitLabs eingebaute\nObservability-Funktionen einen natürlichen nächsten Schritt – tiefere,\nintegrierte Transparenz ohne zusätzliche Werkzeuge. Mehr zu den nativen\nPlattformfunktionen unter\n[GitLab Observability](https://docs.gitlab.com/operations/observability/observability/).\n",{"featured":10,"template":700,"slug":701},"BlogPost","how-to-build-ci-cd-observability-at-scale",{"title":693,"description":703,"authors":704,"heroImage":705,"date":706,"body":698,"category":9,"tags":707},"Dieser Praxisleitfaden zu GitLab Pipeline Analytics hilft Self-Managed-Nutzern, mit Prometheus und Grafana operationale Insights zu gewinnen.",[697],"https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-04-28",[92,708,709],"product","tutorial",{},"/de-de/blog/how-to-build-ci-cd-observability-at-scale","seo:\n  config:\n    noIndex: false\n  title: 'CI/CD-Observability im Unternehmensmaßstab aufbauen'\n  description: 'Praxisleitfaden zu GitLab Pipeline Analytics für Self-Managed-Instanzen: Operationale Insights mit Prometheus und Grafana gewinnen.'\ncontent:\n  title: 'CI/CD-Observability im Unternehmensmaßstab aufbauen'\n  description: 'Dieser Praxisleitfaden zu GitLab Pipeline Analytics hilft Self-Managed-Nutzern, mit Prometheus und Grafana operationale Insights zu gewinnen.'\n  authors:\n    - Paul Meresanu\n  heroImage: https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png\n  date: '2026-04-28'\n  body: |\n    CI/CD-Optimierung beginnt mit Transparenz. Eine erfolgreiche DevOps-Plattform\n    im Unternehmensmaßstab umfasst das Verständnis von Pipeline-Performance,\n    Job-Ausführungsmustern und quantifizierbaren operationalen Insights – insbesondere\n    für Unternehmen, die GitLab Self-Managed betreiben.\n\n    Um GitLab-Kund(inn)en dabei zu helfen, den vollen Nutzen ihrer Plattform\n    auszuschöpfen, haben wir die GitLab CI/CD Observability-Lösung als Teil unseres\n    Platform Excellence-Programms entwickelt. Sie verwandelt rohe Pipeline-Metriken\n    in handlungsrelevante operationale Erkenntnisse.\n\n    Ein führendes Finanzdienstleistungsunternehmen hat gemeinsam mit GitLabs Customer\n    Success Architect Transparenz über seine GitLab Self-Managed-Deployments\n    gewonnen. Gemeinsam haben wir eine containerisierte Observability-Lösung\n    implementiert, die den Open-Source-gitlab-ci-pipelines-exporter mit\n    unternehmensgerechter Prometheus- und Grafana-Infrastruktur kombiniert.\n\n    In diesem Artikel werden die Herausforderungen beim Pipeline-Management im\n    Unternehmensmaßstab erläutert – und wie GitLab CI/CD Observability diese mit\n    einer praxisnahen End-to-End-Implementierung adressiert.\n\n\n    ## Die Herausforderung: CI/CD-Performance messen\n\n    Vor der Implementierung einer Observability-Lösung sollte die\n    Messdimension klar definiert sein:\n\n    * **Welche Metriken sind relevant?** Pipeline-Dauer, Job-Erfolgsraten,\n      Queue-Zeiten, Runner-Auslastung\n    * **Wer braucht Transparenz?** Entwickler(innen), DevOps-Engineers,\n      Plattformteams, Führungsebene\n    * **Welche Entscheidungen werden damit getroffen?** Infrastrukturinvestitionen,\n      Engpass-Behebung, Kapazitätsplanung\n\n\n    ## Lösungsarchitektur: Ein vollständiges Dashboard-Set für Observability\n\n    Nach dem Deployment stellt der Observability-Stack ein Set von\n    Grafana-Dashboards bereit, das Echtzeit- und historische Transparenz über die\n    CI/CD-Plattform bietet. Ein typisches Deployment umfasst:\n\n    * **Pipeline Overview Dashboard:** Eine übergeordnete Ansicht mit Gesamtzahl\n      der Pipeline-Läufe, Erfolgs-/Fehlerquoten über die Zeit (als gestapelte\n      Balken- oder Zeitreihencharts) und Trends bei der durchschnittlichen\n      Pipeline-Dauer. Panels verwenden farbcodierte Statusindikatoren (Grün für\n      Erfolg, Rot für Fehler, Gelb für Abbruch), damit Plattformteams\n      Verschlechterungen auf einen Blick erkennen.\n    * **Job Performance Dashboard:** Drill-down-Panels mit Verteilungen der\n      einzelnen Job-Dauern (Histogramm), den 10 langsamsten Jobs nach\n      Durchschnittsdauer und Job-Fehler-Heatmaps nach Projekt und Stage. Hier\n      identifizieren Teams konkrete Engpass-Jobs, die sich zu optimieren lohnen.\n    * **Runner & Infrastructure Dashboard:** Kombiniert Node-Exporter-Host-Metriken\n      (CPU, Arbeitsspeicher, Disk) mit Pipeline-Queue-Zeit-Daten, um\n      Infrastruktur-Sättigung mit Pipeline-Wartezeiten zu korrelieren. Nützlich\n      für Kapazitätsplanungsentscheidungen wie die Skalierung von Runner-Pools oder\n      das Upgrade von Instanzgrößen.\n    * **Deployment Frequency Dashboard:** Verfolgt Deployment-Anzahl und\n      -Dauer über die Zeit pro Umgebung, abgestimmt auf DORA-Metriken. Hilft\n      der Engineering-Führungsebene, Lieferdurchsatz und Environment-Drift\n      (Commits hinter main) zu bewerten.\n\n    Jedes Dashboard wird automatisch über Grafanas dateibasiertes Provisioning\n    bereitgestellt, sodass es konsistent über alle Umgebungen hinweg deployed wird.\n    Die Dashboards lassen sich über Grafana-Variablen weiter anpassen, um nach\n    Projekt, Ref/Branch oder Zeitraum zu filtern.\n\n    ![Lösungsarchitektur](https://res.cloudinary.com/about-gitlab-com/image/upload/v1777382608/Blog/Imported/blog-building-ci-cd-observability-stack-for-gitlab-self-managed/image1.png)\n\n    Die Lösung benötigt zwei Exporter:\n\n    * **Pipeline Exporter:** Erfasst CI/CD-Metriken über die GitLab API\n      (Pipeline-Dauer, Job-Status, Deployments)\n    * **Node Exporter:** Erfasst Host-Metriken (CPU, Arbeitsspeicher, Disk)\n      für die Infrastruktur-Korrelation\n\n    **Voraussetzungen:**\n\n    * GitLab Self-Managed Version 18.1+\n    * **Container-Orchestrierungsplattform:** Ein Kubernetes-Cluster (empfohlen\n      für Unternehmens-Deployments) oder eine Container-Runtime wie Docker/Podman\n      für kleinere Umgebungen oder Proof-of-Concept-Deployments. Die primäre\n      Deployment-Anleitung unten zielt auf Kubernetes; eine Docker-Compose-Alternative\n      ist im Anhang für lokales Testen und Evaluation verfügbar\n    * GitLab Personal Access Token (Scope **read_api**)\n\n    Die vollständige Implementierungsanleitung mit allen Kubernetes-Manifesten\n    folgt direkt im Anschluss.\n\n\n    ## Kubernetes-Deployment (empfohlen)\n\n    Für Unternehmensumgebungen wird jede Komponente als separates Deployment in\n    einem dedizierten Namespace deployed. Dieser Ansatz integriert sich in\n    bestehende Cluster-Infrastruktur, Secrets-Management und Network-Policies.\n\n    ### 1. Namespace und Secret erstellen\n\n    ```bash\n    kubectl create namespace gitlab-observability\n\n    # GitLab-Token-Secret erstellen (siehe Abschnitt Secrets-Management\n    # für unternehmensgerechte Ansätze mit externen Secret-Operatoren)\n    kubectl create secret generic gitlab-token \\\n      --from-literal=token=glpat-xxxxxxxxxxxx \\\n      -n gitlab-observability\n    ```\n\n    ### 2. Pipeline Exporter deployen\n\n    ```yaml\n    # exporter-deployment.yaml\n    apiVersion: apps/v1\n    kind: Deployment\n    metadata:\n      name: gitlab-ci-pipelines-exporter\n      namespace: gitlab-observability\n    spec:\n      replicas: 1\n      selector:\n        matchLabels:\n          app: gitlab-ci-pipelines-exporter\n      template:\n        metadata:\n          labels:\n            app: gitlab-ci-pipelines-exporter\n        spec:\n          containers:\n            - name: exporter\n              image: mvisonneau/gitlab-ci-pipelines-exporter:latest\n              ports:\n                - containerPort: 8080\n              env:\n                - name: GCPE_GITLAB_TOKEN\n                  valueFrom:\n                    secretKeyRef:\n                      name: gitlab-token\n                      key: token\n                - name: GCPE_CONFIG\n                  value: /etc/gcpe/config.yml\n              volumeMounts:\n                - name: config\n                  mountPath: /etc/gcpe\n          volumes:\n            - name: config\n              configMap:\n                name: gcpe-config\n    ---\n    apiVersion: v1\n    kind: Service\n    metadata:\n      name: gitlab-ci-pipelines-exporter\n      namespace: gitlab-observability\n    spec:\n      selector:\n        app: gitlab-ci-pipelines-exporter\n      ports:\n        - port: 8080\n          targetPort: 8080\n    ```\n\n    ### 3. Node Exporter deployen (DaemonSet)\n\n    ```yaml\n    # node-exporter-daemonset.yaml\n    apiVersion: apps/v1\n    kind: DaemonSet\n    metadata:\n      name: node-exporter\n      namespace: gitlab-observability\n    spec:\n      selector:\n        matchLabels:\n          app: node-exporter\n      template:\n        metadata:\n          labels:\n            app: node-exporter\n        spec:\n          containers:\n            - name: node-exporter\n              image: prom/node-exporter:latest\n              ports:\n                - containerPort: 9100\n    ---\n    apiVersion: v1\n    kind: Service\n    metadata:\n      name: node-exporter\n      namespace: gitlab-observability\n    spec:\n      selector:\n        app: node-exporter\n      ports:\n        - port: 9100\n          targetPort: 9100\n    ```\n\n    ### 4. Prometheus deployen\n\n    ```yaml\n    # prometheus-deployment.yaml\n    apiVersion: apps/v1\n    kind: Deployment\n    metadata:\n      name: prometheus\n      namespace: gitlab-observability\n    spec:\n      replicas: 1\n      selector:\n        matchLabels:\n          app: prometheus\n      template:\n        metadata:\n          labels:\n            app: prometheus\n        spec:\n          containers:\n            - name: prometheus\n              image: prom/prometheus:latest\n              ports:\n                - containerPort: 9090\n              volumeMounts:\n                - name: config\n                  mountPath: /etc/prometheus\n          volumes:\n            - name: config\n              configMap:\n                name: prometheus-config\n    ---\n    apiVersion: v1\n    kind: Service\n    metadata:\n      name: prometheus\n      namespace: gitlab-observability\n    spec:\n      selector:\n        app: prometheus\n      ports:\n        - port: 9090\n          targetPort: 9090\n    ```\n\n    ### 5. Grafana deployen\n\n    Das folgende Grafana-Deployment startet mit deaktivierter Authentifizierung\n    (`GF_AUTH_ANONYMOUS_ENABLED: true`) für den einfachen Einstieg.\n\n    **Diese Einstellung erlaubt jedem mit Netzwerkzugang, alle Dashboards ohne\n    Anmeldung einzusehen.** Für Produktions-Deployments diese Variable entfernen\n    oder auf false setzen und einen geeigneten Authentifizierungs-Provider\n    (LDAP, SAML/SSO oder OAuth) konfigurieren, um den Zugriff auf autorisierte\n    Nutzende zu beschränken.\n\n    ```yaml\n    # grafana-deployment.yaml\n    apiVersion: apps/v1\n    kind: Deployment\n    metadata:\n      name: grafana\n      namespace: gitlab-observability\n    spec:\n      replicas: 1\n      selector:\n        matchLabels:\n          app: grafana\n      template:\n        metadata:\n          labels:\n            app: grafana\n        spec:\n          containers:\n            - name: grafana\n              image: grafana/grafana:10.0.0\n              ports:\n                - containerPort: 3000\n              env:\n                # Für Produktion ENTFERNEN oder auf 'false' setzen.\n                # Bei 'true' können alle Nutzenden mit Netzwerkzugang\n                # Dashboards ohne Authentifizierung einsehen.\n                - name: GF_AUTH_ANONYMOUS_ENABLED\n                  value: 'true'\n              volumeMounts:\n                - name: dashboards-provider\n                  mountPath: /etc/grafana/provisioning/dashboards\n                - name: datasources\n                  mountPath: /etc/grafana/provisioning/datasources\n                - name: dashboards\n                  mountPath: /var/lib/grafana/dashboards\n          volumes:\n            - name: dashboards-provider\n              configMap:\n                name: grafana-dashboards-provider\n            - name: datasources\n              configMap:\n                name: grafana-datasources\n            - name: dashboards\n              configMap:\n                name: grafana-dashboards\n    ---\n    apiVersion: v1\n    kind: Service\n    metadata:\n      name: grafana\n      namespace: gitlab-observability\n    spec:\n      selector:\n        app: grafana\n      ports:\n        - port: 3000\n          targetPort: 3000\n    ```\n\n    ### 6. Network Policy setzen\n\n    Den Inter-Pod-Traffic auf die erforderlichen Kommunikationspfade beschränken:\n\n    ```yaml\n    # network-policy.yaml\n    apiVersion: networking.k8s.io/v1\n    kind: NetworkPolicy\n    metadata:\n      name: observability-policy\n      namespace: gitlab-observability\n    spec:\n      podSelector: {}\n      policyTypes:\n        - Ingress\n      ingress:\n        # Prometheus scrapt Exporter und Node-Exporter\n        - from:\n            - podSelector:\n                matchLabels:\n                  app: prometheus\n          ports:\n            - port: 8080\n            - port: 9100\n        # Grafana fragt Prometheus ab\n        - from:\n            - podSelector:\n                matchLabels:\n                  app: grafana\n          ports:\n            - port: 9090\n    ```\n\n    ### 7. Validieren\n\n    ```bash\n    kubectl get pods -n gitlab-observability\n    kubectl port-forward svc/grafana 3000:3000 -n gitlab-observability\n    curl http://localhost:3000/api/health\n    ```\n\n\n    ## Konfigurationsreferenz\n\n    ### Exporter-Konfiguration\n\n    ```yaml\n    # gitlab-ci-pipelines-exporter.yml (ConfigMap: gcpe-config)\n    log:\n      level: info\n    gitlab:\n      url: https://gitlab.your-domain.com\n      maximum_requests_per_second: 10\n    project_defaults:\n      pull:\n        pipeline:\n          jobs:\n            enabled: true\n    wildcards:\n      - owner:\n          name: your-group-name\n          kind: group\n        archived: false\n    ```\n\n    ### Prometheus-Konfiguration\n\n    ```yaml\n    # prometheus.yml (ConfigMap: prometheus-config)\n    global:\n      scrape_interval: 15s\n    scrape_configs:\n      - job_name: 'gitlab-ci-pipelines-exporter'\n        static_configs:\n          - targets: ['gitlab-ci-pipelines-exporter:8080']\n      - job_name: 'node-exporter'\n        static_configs:\n          - targets: ['node-exporter:9100']\n    ```\n\n    ### Grafana-Datenquellen\n\n    ```yaml\n    # datasources.yml (ConfigMap: grafana-datasources)\n    apiVersion: 1\n    datasources:\n      - name: Prometheus\n        type: prometheus\n        access: proxy\n        url: http://prometheus:9090\n        isDefault: true\n    # dashboards.yml (ConfigMap: grafana-dashboards-provider)\n    apiVersion: 1\n    providers:\n      - name: 'default'\n        folder: 'GitLab CI/CD'\n        type: file\n        options:\n          path: /var/lib/grafana/dashboards\n    ```\n\n\n    ## Wichtige Metriken\n\n    ### Pipeline-Exporter-Metriken\n\n    | Metrik | Beschreibung |\n    | :---- | :---- |\n    | `gitlab_ci_pipeline_duration_seconds` | Pipeline-Ausführungszeit |\n    | `gitlab_ci_pipeline_status` | Pipeline-Erfolg/-Fehler nach Projekt |\n    | `gitlab_ci_pipeline_job_duration_seconds` | Einzelne Job-Ausführungszeit |\n    | `gitlab_ci_pipeline_job_status` | Job-Erfolgs-/-Fehlerstatus |\n    | `gitlab_ci_pipeline_job_artifact_size_bytes` | Artifact-Speicherverbrauch |\n    | `gitlab_ci_pipeline_coverage` | Code-Coverage-Prozentsatz |\n    | `gitlab_ci_environment_deployment_count` | Deployment-Häufigkeit |\n    | `gitlab_ci_environment_deployment_duration_seconds` | Deployment-Ausführungszeit |\n    | `gitlab_ci_environment_behind_commits_count` | Environment-Drift gegenüber main |\n\n    ### Node-Exporter-Metriken\n\n    | Metrik | Beschreibung |\n    | :---- | :---- |\n    | `node_cpu_seconds_total` | CPU-Auslastung |\n    | `node_memory_MemAvailable_bytes` | Verfügbarer Arbeitsspeicher |\n    | `node_filesystem_avail_bytes` | Verfügbarer Festplattenspeicher |\n    | `node_load1` | 1-Minuten-Lastdurchschnitt |\n\n\n    ## Fehlerbehebung\n\n    ### Grafana-Plugin-Installation in Air-gapped-Umgebungen\n\n    Für Offline-Umgebungen Plugins manuell installieren. Beispiel für Kubernetes:\n\n    ```bash\n    # Plugin-ZIP in den Grafana-Pod kopieren\n    kubectl cp grafana-polystat-panel-2.1.16.zip \\\n      gitlab-observability/grafana-\u003Cpod-id>:/tmp/\n    # Plugin entpacken\n    kubectl exec -it -n gitlab-observability deploy/grafana -- \\\n      sh -c \"unzip /tmp/grafana-polystat-panel-2.1.16.zip -d /var/lib/grafana/plugins/\"\n    # Grafana-Pod neu starten\n    kubectl rollout restart deployment/grafana -n gitlab-observability\n    # Installation prüfen\n    kubectl exec -it -n gitlab-observability deploy/grafana -- \\\n      ls -al /var/lib/grafana/plugins/\n    ```\n\n\n    ## Unternehmensaspekte\n\n    Für regulierte Branchen gilt:\n\n    * **Token-Sicherheit:** GitLab Personal Access Tokens in einem dedizierten\n      Secrets-Manager speichern, nicht hartcodiert in ConfigMaps. Token-Rotation\n      durchsetzen und den Scope auf **read\\_api** beschränken.\n    * **Netzwerksegmentierung:** Hinter einem Reverse Proxy mit TLS-Terminierung\n      deployen. In Kubernetes einen Ingress-Controller mit automatisierter\n      Zertifikatsbereitstellung verwenden.\n    * **Authentifizierung:** Grafana mit dem Identity Provider der Organisation\n      konfigurieren (SAML, LDAP oder OAuth/OIDC), um rollenbasierte\n      Zugriffskontrolle auf Dashboards durchzusetzen.\n\n\n    ## Warum GitLab?\n\n    GitLabs API-First-Design ermöglicht individuelle Observability-Lösungen, die\n    native Funktionen wie Value Stream Analytics und DORA-Metriken ergänzen. Die\n    offene Architektur erlaubt es Unternehmen, bewährte Open-Source-Werkzeuge –\n    wie den gitlab-ci-pipelines-exporter – direkt in bestehende\n    Unternehmensinfrastruktur zu integrieren, ohne etablierte Workflows zu\n    unterbrechen.\n\n    Mit wachsender Observability-Reife bieten GitLabs eingebaute\n    Observability-Funktionen einen natürlichen nächsten Schritt – tiefere,\n    integrierte Transparenz ohne zusätzliche Werkzeuge. Mehr zu den nativen\n    Plattformfunktionen unter\n    [GitLab Observability](https://docs.gitlab.com/operations/observability/observability/).\n  category: engineering\n  tags:\n    - CI/CD\n    - product\n    - tutorial\nconfig:\n  featured: false\n  template: BlogPost\n  slug: how-to-build-ci-cd-observability-at-scale\n",{"config":714,"title":693,"description":715},{"noIndex":10},"Praxisleitfaden zu GitLab Pipeline Analytics für Self-Managed-Instanzen: Operationale Insights mit Prometheus und Grafana gewinnen.","de-de/blog/how-to-build-ci-cd-observability-at-scale",[541,708,709],[92,708,709],"t81TpES0_MVA2N3gS1BHgaU2RRwiPQKR3uyp0PUVx4A",[721,730,739,749,758,767,776,785,794],{"content":722,"config":728},{"title":723,"heroImage":724,"category":9,"description":725,"authors":726},"5 GitLab-Pipeline-Muster für komplexe Engineering-Herausforderungen","https://res.cloudinary.com/about-gitlab-com/image/upload/v1772721753/frfsm1qfscwrmsyzj1qn.png","Wie Parent-Child-Pipelines, DAG-Execution, MR-Pipelines und CI/CD Components komplexe Delivery-Probleme lösen – von Monorepos bis zur governed Plattform.",[727],"Omid Khan",{"externalUrl":-1,"slug":729},"5-ways-gitlab-pipeline-logic-solves-real-engineering-problems",{"content":731,"config":737},{"title":732,"heroImage":733,"category":9,"description":734,"authors":735},"GitLab Container Virtual Registry mit Docker Hardened Images einrichten","https://res.cloudinary.com/about-gitlab-com/image/upload/v1772111172/mwhgbjawn62kymfwrhle.png","Mehrere Registries hinter einem Endpunkt – GitLab Container Virtual Registry mit Docker Hardened Images, Caching und Audit-Trail.",[736],"Tim Rizzi",{"externalUrl":-1,"slug":738},"using-gitlab-container-virtual-registry-with-docker-hardened-images",{"content":740,"config":747},{"title":741,"heroImage":742,"category":9,"description":743,"authors":744},"Migration von Azure DevOps zu GitLab systematisch planen","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749658924/Blog/Hero%20Images/securitylifecycle-light.png","Professional Services Migrationsansatz mit mehrstufiger Struktur, 200-300 Projekt-Wellen und systematischem Risikomanagement für Enterprise-Migrationen.",[745,746],"Evgeny Rudinsky","Michael Leopard",{"externalUrl":-1,"slug":748},"migration-from-azure-devops-to-gitlab",{"content":750,"config":756},{"title":751,"heroImage":752,"category":9,"description":753,"authors":754},"Wie wir die größte GitLab-Instanz 12-mal täglich bereitstellen","https://res.cloudinary.com/about-gitlab-com/image/upload/v1764108112/tyntnsy3xotlmehtnfkb.png","Systematische Deployment-Pipeline mit mehrstufigen Rollouts, Canary-Strategie (5% Traffic) und Datenbank-Migrationen für Millionen Entwickler(innen) weltweit.",[755],"John Skarbek",{"externalUrl":-1,"slug":757},"continuously-deploying-the-largest-gitlab-instance",{"content":759,"config":765},{"title":760,"heroImage":761,"category":9,"description":762,"authors":763},"MR-Review-Zeit mit Value Stream Management reduzieren","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097876/Blog/Hero%20Images/Blog/Hero%20Images/REFERENCE%20-%20display%20preview%20for%20blog%20images%20%282%29_2pKf8RsKzAaThmQfqHIaa7_1750097875817.png","GitLab Engineering nutzt VSM zur Identifikation von Engpässen im MR-Review-Prozess. Systematische Analyse mit Custom Stages.",[764],"Haim Snir",{"externalUrl":-1,"slug":766},"how-we-reduced-mr-review-time-with-value-stream-management",{"content":768,"config":774},{"title":769,"heroImage":770,"category":9,"description":771,"authors":772},"Streamlit-Framework: Systematische Infrastruktur-Governance","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097447/Blog/Hero%20Images/Blog/Hero%20Images/blog-image-template-1800x945%20%284%29_3LZkiDjHLjhqEkvOvBsVKp_1750097447404.png","Das GitLab Data Team zeigt, wie frühzeitige Infrastruktur-Governance exponentiell steigende Wartungskosten verhindert. Ein systematischer Ansatz für Streamlit-Anwendungen in regulierten Umgebungen.",[773],"Radovan Bacovic",{"externalUrl":-1,"slug":775},"how-we-built-a-structured-streamlit-application-framework-in-snowflake",{"content":777,"config":783},{"title":778,"heroImage":779,"category":9,"description":780,"authors":781},"Git-Workflows systematisch optimieren","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750098264/Blog/Hero%20Images/Blog/Hero%20Images/AdobeStock_519147119_2RafH61mqosMZv8HGAlsUj_1750098264407.jpg","Git clone-Operationen optimieren – bis zu 93 % weniger Clone-Zeit und 98 % weniger Speicherplatzbedarf.",[782],"Darwin Sanoy",{"externalUrl":-1,"slug":784},"supercharge-your-git-workflows",{"content":786,"config":792},{"title":787,"heroImage":788,"category":9,"description":789,"authors":790},"Was ist YAML? Alles erklärt, von den Grundlagen bis zur Anwendung","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662547/Blog/Hero%20Images/what_is_yaml.jpg","YAML ist ein Format, das für Konfigurationsdateien und mehr verwendet wird. Dieser Artikel erklärt die Grundlagen von YAML bis hin zu praktischen Anwendungen mit Kubernetes.",[791],"GitLab Team",{"externalUrl":-1,"slug":793},"what-is-yaml",{"content":795,"config":801},{"title":796,"heroImage":797,"category":9,"description":798,"authors":799},"Von manuellen Testzyklen zu automatisierten Embedded-Workflows: GitLabs Ansatz für virtuelle Testumgebungen","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099203/Blog/Hero%20Images/Blog/Hero%20Images/blog-image-template-1800x945%20%2820%29_2bJGC5ZP3WheoqzlLT05C5_1750099203484.png","Managed Lifecycle Environments automatisieren virtuelle Testumgebungen für Embedded-Systeme und lösen dabei die typischen Probleme von Umgebungs-Wildwuchs und explodierenden Kosten.",[800,782],"Matt DeLaney",{"externalUrl":-1,"slug":802},"how-gitlab-transforms-embedded-systems-testing-cycles",1777934883183]