[{"data":1,"prerenderedAt":739},["ShallowReactive",2],{"/de-de/blog/categories/engineering":3,"navigation-de-de":20,"banner-de-de":434,"footer-de-de":444,"engineering-category-page-total-items-de-de":680,"engineering-category-page-featured-de-de":681,"engineering-category-page-4-de-de":710},{"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",{"data":21},{"logo":22,"freeTrial":27,"sales":32,"login":37,"items":42,"search":352,"minimal":386,"duo":404,"switchNav":413,"pricingDeployment":424},{"config":23},{"href":24,"dataGaName":25,"dataGaLocation":26},"/de-de/","gitlab logo","header",{"text":28,"config":29},"Kostenlose Testversion anfordern",{"href":30,"dataGaName":31,"dataGaLocation":26},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de&glm_content=default-saas-trial/","free trial",{"text":33,"config":34},"Vertrieb kontaktieren",{"href":35,"dataGaName":36,"dataGaLocation":26},"/de-de/sales/","sales",{"text":38,"config":39},"Anmelden",{"href":40,"dataGaName":41,"dataGaLocation":26},"https://gitlab.com/users/sign_in/","sign in",[43,70,167,172,273,333],{"text":44,"config":45,"cards":47},"Plattform",{"dataNavLevelOne":46},"platform",[48,54,62],{"title":44,"description":49,"link":50},"Die intelligente Orchestrierungsplattform für DevSecOps",{"text":51,"config":52},"Die Plattform erkunden",{"href":53,"dataGaName":46,"dataGaLocation":26},"/de-de/platform/",{"title":55,"description":56,"link":57},"GitLab Duo Agent Platform","Agentische KI für den gesamten Software-Lebenszyklus",{"text":58,"config":59},"Lerne GitLab Duo kennen",{"href":60,"dataGaName":61,"dataGaLocation":26},"/de-de/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":63,"description":64,"link":65},"Warum GitLab?","Erfahre, warum sich Unternehmen für GitLab entscheiden",{"text":66,"config":67},"Mehr erfahren",{"href":68,"dataGaName":69,"dataGaLocation":26},"/de-de/why-gitlab/","why gitlab",{"text":71,"left":14,"config":72,"link":74,"lists":78,"footer":149},"Produkt",{"dataNavLevelOne":73},"solutions",{"text":75,"config":76},"Alle Lösungen anzeigen",{"href":77,"dataGaName":73,"dataGaLocation":26},"/de-de/solutions/",[79,104,127],{"title":80,"description":81,"link":82,"items":87},"Automatisierung","CI/CD und Automatisierung zur Beschleunigung der Bereitstellung",{"config":83},{"icon":84,"href":85,"dataGaName":86,"dataGaLocation":26},"AutomatedCodeAlt","/de-de/solutions/delivery-automation/","automated software delivery",[88,92,95,100],{"text":89,"config":90},"CI/CD",{"href":91,"dataGaLocation":26,"dataGaName":89},"/de-de/solutions/continuous-integration/",{"text":55,"config":93},{"href":60,"dataGaLocation":26,"dataGaName":94},"gitlab duo agent platform - product menu",{"text":96,"config":97},"Quellcodeverwaltung",{"href":98,"dataGaLocation":26,"dataGaName":99},"/de-de/solutions/source-code-management/","Source Code Management",{"text":101,"config":102},"Automatische Softwarebereitstellung",{"href":85,"dataGaLocation":26,"dataGaName":103},"Automated software delivery",{"title":105,"description":106,"link":107,"items":112},"Sicherheit","Entwickle Code schneller ohne Abstriche bei der Sicherheit",{"config":108},{"href":109,"dataGaName":110,"dataGaLocation":26,"icon":111},"/de-de/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[113,117,122],{"text":114,"config":115},"Anwendungssicherheitstests",{"href":109,"dataGaName":116,"dataGaLocation":26},"Application security testing",{"text":118,"config":119},"Schutz der Software-Lieferkette",{"href":120,"dataGaLocation":26,"dataGaName":121},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":123,"config":124},"Software-Compliance",{"href":125,"dataGaName":126,"dataGaLocation":26},"/de-de/solutions/software-compliance/","software compliance",{"title":128,"link":129,"items":134},"Auswertung",{"config":130},{"icon":131,"href":132,"dataGaName":133,"dataGaLocation":26},"DigitalTransformation","/de-de/solutions/visibility-measurement/","visibility and measurement",[135,139,144],{"text":136,"config":137},"Sichtbarkeit und Auswertung",{"href":132,"dataGaLocation":26,"dataGaName":138},"Visibility and Measurement",{"text":140,"config":141},"Wertstrommanagement",{"href":142,"dataGaLocation":26,"dataGaName":143},"/de-de/solutions/value-stream-management/","Value Stream Management",{"text":145,"config":146},"Analysen und Einblicke",{"href":147,"dataGaLocation":26,"dataGaName":148},"/de-de/solutions/analytics-and-insights/","Analytics and insights",{"title":150,"items":151},"GitLab für",[152,157,162],{"text":153,"config":154},"Enterprise",{"href":155,"dataGaLocation":26,"dataGaName":156},"/de-de/enterprise/","enterprise",{"text":158,"config":159},"Kleinunternehmen",{"href":160,"dataGaLocation":26,"dataGaName":161},"/de-de/small-business/","small business",{"text":163,"config":164},"Öffentlicher Sektor",{"href":165,"dataGaLocation":26,"dataGaName":166},"/de-de/solutions/public-sector/","public sector",{"text":168,"config":169},"Preise",{"href":170,"dataGaName":171,"dataGaLocation":26,"dataNavLevelOne":171},"/de-de/pricing/","pricing",{"text":173,"config":174,"link":176,"lists":180,"feature":260},"Ressourcen",{"dataNavLevelOne":175},"resources",{"text":177,"config":178},"Alle Ressourcen anzeigen",{"href":179,"dataGaName":175,"dataGaLocation":26},"/de-de/resources/",[181,214,232],{"title":182,"items":183},"Erste Schritte",[184,189,194,199,204,209],{"text":185,"config":186},"Installieren",{"href":187,"dataGaName":188,"dataGaLocation":26},"/de-de/install/","install",{"text":190,"config":191},"Kurzanleitungen",{"href":192,"dataGaName":193,"dataGaLocation":26},"/de-de/get-started/","quick setup checklists",{"text":195,"config":196},"Lernen",{"href":197,"dataGaLocation":26,"dataGaName":198},"https://university.gitlab.com/","learn",{"text":200,"config":201},"Produktdokumentation",{"href":202,"dataGaName":203,"dataGaLocation":26},"https://docs.gitlab.com/","product documentation",{"text":205,"config":206},"Best-Practice-Videos",{"href":207,"dataGaName":208,"dataGaLocation":26},"/de-de/getting-started-videos/","best practice videos",{"text":210,"config":211},"Integrationen",{"href":212,"dataGaName":213,"dataGaLocation":26},"/de-de/integrations/","integrations",{"title":215,"items":216},"Entdecken",[217,222,227],{"text":218,"config":219},"Kundenerfolge",{"href":220,"dataGaName":221,"dataGaLocation":26},"/de-de/customers/","customer success stories",{"text":223,"config":224},"Blog",{"href":225,"dataGaName":226,"dataGaLocation":26},"/de-de/blog/","blog",{"text":228,"config":229},"Remote",{"href":230,"dataGaName":231,"dataGaLocation":26},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":233,"items":234},"Vernetzen",[235,240,245,250,255],{"text":236,"config":237},"GitLab Services",{"href":238,"dataGaName":239,"dataGaLocation":26},"/de-de/services/","services",{"text":241,"config":242},"Community",{"href":243,"dataGaName":244,"dataGaLocation":26},"/community/","community",{"text":246,"config":247},"Forum",{"href":248,"dataGaName":249,"dataGaLocation":26},"https://forum.gitlab.com/","forum",{"text":251,"config":252},"Veranstaltungen",{"href":253,"dataGaName":254,"dataGaLocation":26},"/events/","events",{"text":256,"config":257},"Partner",{"href":258,"dataGaName":259,"dataGaLocation":26},"/de-de/partners/","partners",{"background":261,"textColor":262,"text":263,"image":264,"link":268},"#2f2a6b","#fff","Perspektiven für die Softwareentwicklung der Zukunft",{"altText":265,"config":266},"The Source Promo-Karte",{"src":267},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.svg",{"text":269,"config":270},"Aktuelles",{"href":271,"dataGaName":272,"dataGaLocation":26},"/de-de/the-source/","the source",{"text":274,"config":275,"lists":277},"Unternehmen",{"dataNavLevelOne":276},"company",[278],{"items":279},[280,285,291,293,298,303,308,313,318,323,328],{"text":281,"config":282},"Über",{"href":283,"dataGaName":284,"dataGaLocation":26},"/de-de/company/","about",{"text":286,"config":287,"footerGa":290},"Karriere",{"href":288,"dataGaName":289,"dataGaLocation":26},"/jobs/","jobs",{"dataGaName":289},{"text":251,"config":292},{"href":253,"dataGaName":254,"dataGaLocation":26},{"text":294,"config":295},"Geschäftsführung",{"href":296,"dataGaName":297,"dataGaLocation":26},"/company/team/e-group/","leadership",{"text":299,"config":300},"Team",{"href":301,"dataGaName":302,"dataGaLocation":26},"/company/team/","team",{"text":304,"config":305},"Handbuch",{"href":306,"dataGaName":307,"dataGaLocation":26},"https://handbook.gitlab.com/","handbook",{"text":309,"config":310},"Investor Relations",{"href":311,"dataGaName":312,"dataGaLocation":26},"https://ir.gitlab.com/","investor relations",{"text":314,"config":315},"Trust Center",{"href":316,"dataGaName":317,"dataGaLocation":26},"/de-de/security/","trust center",{"text":319,"config":320},"AI Transparency Center",{"href":321,"dataGaName":322,"dataGaLocation":26},"/de-de/ai-transparency-center/","ai transparency center",{"text":324,"config":325},"Newsletter",{"href":326,"dataGaName":327,"dataGaLocation":26},"/company/contact/#contact-forms","newsletter",{"text":329,"config":330},"Presse",{"href":331,"dataGaName":332,"dataGaLocation":26},"/press/","press",{"text":334,"config":335,"lists":336},"Kontakt",{"dataNavLevelOne":276},[337],{"items":338},[339,342,347],{"text":33,"config":340},{"href":35,"dataGaName":341,"dataGaLocation":26},"talk to sales",{"text":343,"config":344},"Support-Portal",{"href":345,"dataGaName":346,"dataGaLocation":26},"https://support.gitlab.com","support portal",{"text":348,"config":349},"Kundenportal",{"href":350,"dataGaName":351,"dataGaLocation":26},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":353,"login":354,"suggestions":361},"Schließen",{"text":355,"link":356},"Um Repositorys und Projekte zu durchsuchen, melde dich an bei",{"text":357,"config":358},"gitlab.com",{"href":40,"dataGaName":359,"dataGaLocation":360},"search login","search",{"text":362,"default":363},"Vorschläge",[364,366,371,373,378,383],{"text":55,"config":365},{"href":60,"dataGaName":55,"dataGaLocation":360},{"text":367,"config":368},"Codevorschläge (KI)",{"href":369,"dataGaName":370,"dataGaLocation":360},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":89,"config":372},{"href":91,"dataGaName":89,"dataGaLocation":360},{"text":374,"config":375},"GitLab auf AWS",{"href":376,"dataGaName":377,"dataGaLocation":360},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":379,"config":380},"GitLab auf Google Cloud",{"href":381,"dataGaName":382,"dataGaLocation":360},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":63,"config":384},{"href":68,"dataGaName":385,"dataGaLocation":360},"Why GitLab?",{"freeTrial":387,"mobileIcon":392,"desktopIcon":397,"secondaryButton":400},{"text":388,"config":389},"Kostenlos testen",{"href":390,"dataGaName":31,"dataGaLocation":391},"https://gitlab.com/-/trials/new/","nav",{"altText":393,"config":394},"GitLab-Symbol",{"src":395,"dataGaName":396,"dataGaLocation":391},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":393,"config":398},{"src":399,"dataGaName":396,"dataGaLocation":391},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":182,"config":401},{"href":402,"dataGaName":403,"dataGaLocation":391},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de/get-started/","get started",{"freeTrial":405,"mobileIcon":409,"desktopIcon":411},{"text":406,"config":407},"Mehr über GitLab Duo erfahren",{"href":60,"dataGaName":408,"dataGaLocation":391},"gitlab duo",{"altText":393,"config":410},{"src":395,"dataGaName":396,"dataGaLocation":391},{"altText":393,"config":412},{"src":399,"dataGaName":396,"dataGaLocation":391},{"button":414,"mobileIcon":419,"desktopIcon":421},{"text":415,"config":416},"/Option",{"href":417,"dataGaName":418,"dataGaLocation":391},"#contact","switch",{"altText":393,"config":420},{"src":395,"dataGaName":396,"dataGaLocation":391},{"altText":393,"config":422},{"src":423,"dataGaName":396,"dataGaLocation":391},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":425,"mobileIcon":430,"desktopIcon":432},{"text":426,"config":427},"Zurück zur Preisübersicht",{"href":170,"dataGaName":428,"dataGaLocation":391,"icon":429},"back to pricing","GoBack",{"altText":393,"config":431},{"src":395,"dataGaName":396,"dataGaLocation":391},{"altText":393,"config":433},{"src":399,"dataGaName":396,"dataGaLocation":391},{"title":435,"button":436,"config":441},"Sieh dir an, wie agentische KI die Softwarebereitstellung transformiert",{"text":437,"config":438},"GitLab Transcend jetzt ansehen",{"href":439,"dataGaName":440,"dataGaLocation":26},"/de-de/events/transcend/virtual/","transcend event",{"layout":442,"icon":443,"disabled":14},"release","AiStar",{"data":445},{"text":446,"source":447,"edit":453,"contribute":458,"config":463,"items":468,"minimal":671},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":448,"config":449},"Quelltext der Seite anzeigen",{"href":450,"dataGaName":451,"dataGaLocation":452},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":454,"config":455},"Diese Seite bearbeiten",{"href":456,"dataGaName":457,"dataGaLocation":452},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":459,"config":460},"Beteilige dich",{"href":461,"dataGaName":462,"dataGaLocation":452},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":464,"facebook":465,"youtube":466,"linkedin":467},"https://x.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[469,514,567,609,636],{"title":168,"links":470,"subMenu":485},[471,475,480],{"text":472,"config":473},"Tarife anzeigen",{"href":170,"dataGaName":474,"dataGaLocation":452},"view plans",{"text":476,"config":477},"Vorteile von Premium",{"href":478,"dataGaName":479,"dataGaLocation":452},"/de-de/pricing/premium/","why premium",{"text":481,"config":482},"Vorteile von Ultimate",{"href":483,"dataGaName":484,"dataGaLocation":452},"/de-de/pricing/ultimate/","why ultimate",[486],{"title":334,"links":487},[488,490,492,494,499,504,509],{"text":33,"config":489},{"href":35,"dataGaName":36,"dataGaLocation":452},{"text":343,"config":491},{"href":345,"dataGaName":346,"dataGaLocation":452},{"text":348,"config":493},{"href":350,"dataGaName":351,"dataGaLocation":452},{"text":495,"config":496},"Status",{"href":497,"dataGaName":498,"dataGaLocation":452},"https://status.gitlab.com/","status",{"text":500,"config":501},"Nutzungsbedingungen",{"href":502,"dataGaName":503,"dataGaLocation":452},"/terms/","terms of use",{"text":505,"config":506},"Datenschutzerklärung",{"href":507,"dataGaName":508,"dataGaLocation":452},"/de-de/privacy/","privacy statement",{"text":510,"config":511},"Cookie-Einstellungen",{"dataGaName":512,"dataGaLocation":452,"id":513,"isOneTrustButton":14},"cookie preferences","ot-sdk-btn",{"title":71,"links":515,"subMenu":524},[516,520],{"text":517,"config":518},"DevSecOps-Plattform",{"href":53,"dataGaName":519,"dataGaLocation":452},"devsecops platform",{"text":521,"config":522},"KI-unterstützte Entwicklung",{"href":60,"dataGaName":523,"dataGaLocation":452},"ai-assisted development",[525],{"title":526,"links":527},"Themen",[528,532,537,542,547,552,557,562],{"text":89,"config":529},{"href":530,"dataGaName":531,"dataGaLocation":452},"/de-de/topics/ci-cd/","cicd",{"text":533,"config":534},"GitOps",{"href":535,"dataGaName":536,"dataGaLocation":452},"/de-de/topics/gitops/","gitops",{"text":538,"config":539},"DevOps",{"href":540,"dataGaName":541,"dataGaLocation":452},"/de-de/topics/devops/","devops",{"text":543,"config":544},"Versionskontrolle",{"href":545,"dataGaName":546,"dataGaLocation":452},"/de-de/topics/version-control/","version control",{"text":548,"config":549},"DevSecOps",{"href":550,"dataGaName":551,"dataGaLocation":452},"/de-de/topics/devsecops/","devsecops",{"text":553,"config":554},"Cloud-nativ",{"href":555,"dataGaName":556,"dataGaLocation":452},"/de-de/topics/cloud-native/","cloud native",{"text":558,"config":559},"KI für das Programmieren",{"href":560,"dataGaName":561,"dataGaLocation":452},"/de-de/topics/devops/ai-for-coding/","ai for coding",{"text":563,"config":564},"Agentische KI",{"href":565,"dataGaName":566,"dataGaLocation":452},"/de-de/topics/agentic-ai/","agentic ai",{"title":568,"links":569},"Lösungen",[570,573,575,580,584,587,590,593,595,597,599,604],{"text":114,"config":571},{"href":109,"dataGaName":572,"dataGaLocation":452},"Application Security Testing",{"text":101,"config":574},{"href":85,"dataGaName":86,"dataGaLocation":452},{"text":576,"config":577},"Agile Entwicklung",{"href":578,"dataGaName":579,"dataGaLocation":452},"/de-de/solutions/agile-delivery/","agile delivery",{"text":581,"config":582},"SCM",{"href":98,"dataGaName":583,"dataGaLocation":452},"source code management",{"text":89,"config":585},{"href":91,"dataGaName":586,"dataGaLocation":452},"continuous integration & delivery",{"text":140,"config":588},{"href":142,"dataGaName":589,"dataGaLocation":452},"value stream management",{"text":533,"config":591},{"href":592,"dataGaName":536,"dataGaLocation":452},"/de-de/solutions/gitops/",{"text":153,"config":594},{"href":155,"dataGaName":156,"dataGaLocation":452},{"text":158,"config":596},{"href":160,"dataGaName":161,"dataGaLocation":452},{"text":163,"config":598},{"href":165,"dataGaName":166,"dataGaLocation":452},{"text":600,"config":601},"Bildungswesen",{"href":602,"dataGaName":603,"dataGaLocation":452},"/de-de/solutions/education/","education",{"text":605,"config":606},"Finanzdienstleistungen",{"href":607,"dataGaName":608,"dataGaLocation":452},"/de-de/solutions/finance/","financial services",{"title":173,"links":610},[611,613,615,617,620,622,624,626,628,630,632,634],{"text":185,"config":612},{"href":187,"dataGaName":188,"dataGaLocation":452},{"text":190,"config":614},{"href":192,"dataGaName":193,"dataGaLocation":452},{"text":195,"config":616},{"href":197,"dataGaName":198,"dataGaLocation":452},{"text":200,"config":618},{"href":202,"dataGaName":619,"dataGaLocation":452},"docs",{"text":223,"config":621},{"href":225,"dataGaName":226,"dataGaLocation":452},{"text":218,"config":623},{"href":220,"dataGaName":221,"dataGaLocation":452},{"text":228,"config":625},{"href":230,"dataGaName":231,"dataGaLocation":452},{"text":236,"config":627},{"href":238,"dataGaName":239,"dataGaLocation":452},{"text":241,"config":629},{"href":243,"dataGaName":244,"dataGaLocation":452},{"text":246,"config":631},{"href":248,"dataGaName":249,"dataGaLocation":452},{"text":251,"config":633},{"href":253,"dataGaName":254,"dataGaLocation":452},{"text":256,"config":635},{"href":258,"dataGaName":259,"dataGaLocation":452},{"title":274,"links":637},[638,640,642,644,646,648,650,655,660,662,664,666],{"text":281,"config":639},{"href":283,"dataGaName":276,"dataGaLocation":452},{"text":286,"config":641},{"href":288,"dataGaName":289,"dataGaLocation":452},{"text":294,"config":643},{"href":296,"dataGaName":297,"dataGaLocation":452},{"text":299,"config":645},{"href":301,"dataGaName":302,"dataGaLocation":452},{"text":304,"config":647},{"href":306,"dataGaName":307,"dataGaLocation":452},{"text":309,"config":649},{"href":311,"dataGaName":312,"dataGaLocation":452},{"text":651,"config":652},"Nachhaltigkeit",{"href":653,"dataGaName":654,"dataGaLocation":452},"/sustainability/","Sustainability",{"text":656,"config":657},"Vielfalt, Inklusion und Zugehörigkeit",{"href":658,"dataGaName":659,"dataGaLocation":452},"/de-de/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":314,"config":661},{"href":316,"dataGaName":317,"dataGaLocation":452},{"text":324,"config":663},{"href":326,"dataGaName":327,"dataGaLocation":452},{"text":329,"config":665},{"href":331,"dataGaName":332,"dataGaLocation":452},{"text":667,"config":668},"Transparenzerklärung zu moderner Sklaverei",{"href":669,"dataGaName":670,"dataGaLocation":452},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":672},[673,675,678],{"text":500,"config":674},{"href":502,"dataGaName":503,"dataGaLocation":452},{"text":676,"config":677},"Cookies",{"dataGaName":512,"dataGaLocation":452,"id":513,"isOneTrustButton":14},{"text":505,"config":679},{"href":507,"dataGaName":508,"dataGaLocation":452},31,{"id":682,"title":683,"authorSlugs":684,"authors":686,"body":688,"category":9,"categorySlug":9,"config":689,"content":692,"date":696,"description":693,"extension":12,"externalUrl":6,"featured":10,"heroImage":695,"isFeatured":10,"meta":700,"navigation":14,"path":701,"publishedDate":696,"rawbody":702,"seo":703,"slug":691,"stem":706,"tagSlugs":707,"tags":708,"template":690,"updatedDate":6,"__hash__":709},"blogPosts/de-de/blog/how-to-build-ci-cd-observability-at-scale.yml","CI/CD-Observability im Unternehmensmaßstab aufbauen",[685],"paul-meresanu",[687],"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":690,"slug":691},"BlogPost","how-to-build-ci-cd-observability-at-scale",{"title":683,"description":693,"authors":694,"heroImage":695,"date":696,"body":688,"category":9,"tags":697},"Dieser Praxisleitfaden zu GitLab Pipeline Analytics hilft Self-Managed-Nutzern, mit Prometheus und Grafana operationale Insights zu gewinnen.",[687],"https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-04-28",[89,698,699],"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":704,"title":683,"description":705},{"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",[531,698,699],[89,698,699],"t81TpES0_MVA2N3gS1BHgaU2RRwiPQKR3uyp0PUVx4A",[711,721,730],{"content":712,"config":719},{"title":713,"heroImage":714,"category":9,"description":715,"authors":716},"Konfigurationsmanagement mit GitLab und Ansible","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749665322/Blog/Hero%20Images/gitlab-ansible-cover.png","Entdecke die beeindruckende Leistungsfähigkeit von GitLab CI, wenn es darum geht, Ansible-Playbooks im Rahmen von Infrastructure as Code umzusetzen.",[717,718],"Brad Downey","Sara Kassabian",{"externalUrl":-1,"slug":720},"using-ansible-and-gitlab-as-infrastructure-for-code",{"content":722,"config":728},{"title":723,"heroImage":724,"category":9,"description":725,"authors":726},"4 Situationen, in denen sich eine aufgeräumte Git-Commit-Historie lohnt ","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659457/Blog/Hero%20Images/keep-git-commit-history-clean.jpg","Erfahre, warum eine saubere Git-Commit-Historie die Nachvollziehbarkeit verbessert, Fehler behebt und die Codequalität steigert.",[727],"Kushal Pandya",{"externalUrl":-1,"slug":729},"keeping-git-commit-history-clean",{"content":731,"config":737},{"title":732,"heroImage":733,"category":9,"description":734,"authors":735},"Was ist das Gitlab Container Registry?","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749665223/Blog/Hero%20Images/containers.jpg"," Die auf Open Source basierende GitLab Container Registry ist nicht nur eine eigenständige Registry, sondern vollständig in GitLab integriert.",[736],"Mark Pundsack",{"externalUrl":-1,"slug":738},"gitlab-container-registry",1777493686510]