[{"data":1,"prerenderedAt":763},["ShallowReactive",2],{"/de-de/blog/continuously-deploying-the-largest-gitlab-instance":3,"navigation-de-de":36,"banner-de-de":440,"footer-de-de":450,"blog-post-authors-de-de-John Skarbek":655,"blog-related-posts-de-de-continuously-deploying-the-largest-gitlab-instance":669,"assessment-promotions-de-de":714,"next-steps-de-de":753},{"id":4,"title":5,"authorSlugs":6,"body":8,"categorySlug":9,"config":10,"content":14,"description":8,"extension":25,"isFeatured":11,"meta":26,"navigation":11,"path":27,"publishedDate":20,"seo":28,"stem":32,"tagSlugs":33,"__hash__":35},"blogPosts/de-de/blog/continuously-deploying-the-largest-gitlab-instance.yml","Continuously Deploying The Largest Gitlab Instance",[7],"john-skarbek",null,"engineering",{"featured":11,"template":12,"slug":13},true,"BlogPost","continuously-deploying-the-largest-gitlab-instance",{"heroImage":15,"title":16,"description":17,"authors":18,"date":20,"category":9,"tags":21,"body":24},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1764108112/tyntnsy3xotlmehtnfkb.png","Wie wir die größte GitLab-Instanz 12-mal täglich bereitstellen","Systematische Deployment-Pipeline mit mehrstufigen Rollouts, Canary-Strategie (5% Traffic) und Datenbank-Migrationen für Millionen Entwickler(innen) weltweit.",[19],"John Skarbek","2025-12-01",[22,23],"product","inside GitLab","GitLab führt täglich bis zu 12 Code-Bereitstellungen auf der weltweit größten GitLab-Instanz – GitLab.com – ohne Ausfallzeiten durch. Diese Bereitstellungen nutzen GitLabs eigene CI/CD-Plattform und betreffen Millionen Entwickler(innen) weltweit. Die hohe Bereitstellungsfrequenz dient als primäres Qualitätstor und Belastungstest. Organisationen, die auf GitLab für ihre DevOps-Workflows setzen, nutzen eine auf der eigenen Infrastruktur im Enterprise-Maßstab bewährte Plattform.\n\nIn regulierten Branchen wie dem Finanzwesen und der Automobilproduktion sind Zero-Downtime-Bereitstellungen keine Option, sondern Voraussetzung. Die NIS2-Richtlinie fordert in Artikel 21 systematische Risikoanalyse und Business-Continuity-Management – genau das, was GitLab.coms progressive Rollout-Strategie in der Praxis demonstriert. Durch mehrstufige Validierung mit isoliertem Canary-Traffic (5% aller Anfragen) werden potenzielle Probleme erkannt, bevor Millionen Nutzer(innen) betroffen sind.\n\n## Die Herausforderung: Frequenz trifft Skalierung\n\n**Für GitLab:** Bereitstellungsfrequenz ist geschäftskritisch. Schnelle Deployment-Zyklen ermöglichen Reaktion auf Kundenfeedback innerhalb von Stunden, sofortige Security-Patches und Validierung neuer Features in Production vor Skalierung.\n\n**Für Kund(inn)en:** Jede Bereitstellung auf GitLab.com validiert die Deployment-Praktiken, die GitLab seinen Nutzer(inne)n empfiehlt. Features werden auf der weltweit größten GitLab-Instanz getestet, bevor sie Kundenumgebungen erreichen. Dies liefert:\n\n* Neueste Features sofort verfügbar (Stunden statt Wochen)\n* Bewährte Zuverlässigkeit im Maßstab\n* Zero-Downtime-Bereitstellungen garantieren durchgängigen Zugriff\n* Dokumentation basiert auf tatsächlichen Production-Praktiken\n\n## Code-to-Production-Architektur\n\nDie Deployment-Pipeline durchläuft strukturierte Phasen, wobei jede Phase als Checkpoint auf dem Weg zur Production-Bereitstellung fungiert:\n\n```mermaid\n    graph TD\n        A[Code Proposed] --> B[Merge Request Created]\n        B --> C[Pipeline Triggered]\n        C --> D[Build & Test]\n        D --> E{Spec/Integration/QA Tests Pass?}\n        E -->|No| F[Feedback Loop]\n        F --> B\n        E -->|Yes| G[Merge to default branch]\n        G -->|Periodically| H[Auto-Deploy Branch]\n\n        subgraph \"Deployment Pipeline\"\n            H --> I[Package Creation]\n            I --> K[Canary Environment]\n            K --> L[QA Validation]\n            L --> M[Main Environment]\n\n        end\n```\n\n## Progressive Rollout-Strategie\n\n### Build und Paket-Erstellung\n\nGitLab erstellt sowohl Omnibus-Pakete als auch Cloud Native GitLab (CNG) Images. Omnibus-Pakete werden auf der Gitaly-Flotte bereitgestellt (Git-Storage-Layer), während CNG-Images alle anderen Komponenten als containerisierte Workloads ausführen. Eine geplante Pipeline sucht regelmäßig nach dem jüngsten Commit mit erfolgreicher Pipeline und erstellt daraus einen Auto-Deploy-Branch.\n\n```mermaid\n    graph LR\n        A[Create branch] --> B[Build]\n        B --> C[Choose Built package]\n        C --> D[Start Deploy Pipeline]\n```\n\n### Canary-Strategie und mehrstufige Validierung\n\nGitLabs QA-Prozess arbeitet Hand in Hand mit der Canary-Strategie durch umgebungsbasierte Validierung. [Etwa 5% des gesamten Traffics durchlaufen die Canary-Stage](https://handbook.gitlab.com/handbook/engineering/infrastructure/environments/canary-stage/#environments-canary-stage). Dieser Ansatz erhöht die Komplexität von Datenbankmigrationen, gewährleistet aber nahtlose Bereitstellung eines zuverlässigen Produkts.\n\n**Progressive Rollout-Phasen:**\n\n1. **Staging Canary:** Initiale Validierungsumgebung\n2. **Production Canary:** Limitierter Production-Traffic\n3. **Staging Main:** Vollständige Staging-Umgebung\n4. **Production Main:** Vollständiger Production-Rollout\n\n```mermaid\n    graph TD\n        C[Staging Canary Deploy]\n        C --> D[QA Smoke Main Stage Tests]\n        C --> E[QA Smoke Canary Stage Tests]\n        D --> F\n        E --> F{Tests Pass?}\n        F -->|Yes| G[Production Canary Deploy]\n        G --> S[QA Smoke Main Stage Tests]\n        G --> T[QA Smoke Canary Stage Tests]\n        F -->|No| H[Issue Creation]\n        H --> K[Fix & Backport]\n        K --> C\n\n        S --> M[Canary Traffic Monitoring]\n        T --> M[Canary Traffic Monitoring baking period]\n        M --> U[Production Safety Checks]\n        U --> N[Staging Main]\n        N --> V[Production Main]\n```\n\nQA-Validierung erfolgt an mehreren Checkpoints: nach jeder Canary-Bereitstellung und nach Post-Deploy-Migrationen. Weitere Details zur [GitLab-Teststrategie](https://handbook.gitlab.com/handbook/engineering/testing/) finden sich im Handbook.\n\n## Deployment-Pipeline-Stages\n\nGitLab.com repräsentiert reale Deployment-Komplexität im Maßstab. Als größte bekannte GitLab-Instanz nutzen Bereitstellungen denselben offiziellen GitLab Helm Chart und dasselbe Linux-Paket wie Kund(inn)en. Mehr zur [GitLab.com-Architektur](https://handbook.gitlab.com/handbook/engineering/infrastructure/production/architecture/#gitlab-com-architecture) im Handbook.\n\n**Dogfooding im Maßstab:** GitLab nutzt dieselben Verfahren, die für [Zero-Downtime-Upgrades](https://docs.gitlab.com/update/zero_downtime/) dokumentiert sind. Was bei GitLab nicht reibungslos funktioniert, wird Kund(inn)en nicht empfohlen.\n\nFolgende Stages laufen für alle Environment- und Stage-Upgrades:\n\n```mermaid\n    graph LR\n        a[prep] --> c[Regular Migrations - Canary stage only]\n        a --> f[Assets - Canary stage only]\n        c --> d[Gitaly]\n        d --> k8s\n\n        subgraph subGraph0[\"VM workloads\"]\n          d[\"Gitaly\"]\n        end\n\n        subgraph subGraph1[\"Kubernetes workloads\"]\n          k8s[\"k8s\"]\n        end\n\n        subgraph fleet[\"fleet\"]\n          subGraph0\n          subGraph1\n        end\n```\n\n**Stage-Details:**\n\n* **Prep:** Validiert Deployment-Bereitschaft und führt Pre-Deployment-Checks durch\n* **Migrations:** Führt reguläre Datenbankmigrationen aus (nur Canary-Stage)\n* **Assets:** Lädt statische Assets in GCS-Bucket hoch (nur Canary-Stage)\n* **Gitaly:** Aktualisiert Gitaly-VM-Storage-Layer via Omnibus-Paket\n* **Kubernetes:** Deployed containerisierte GitLab-Komponenten via Helm Chart\n\n### Multi-Version-Kompatibilität: Die versteckte Herausforderung\n\nWährend der Bereitstellung existiert eine Zeitspanne, in der das Datenbankschema dem Code voraus ist, den die Main-Stage kennt. Dies geschieht, weil die Canary-Stage bereits neuen Code deployed und reguläre Datenbankmigrationen ausführt, während die Main-Stage noch die vorherige Code-Version ausführt.\n\n**Beispiel:** Bei Hinzufügen eines neuen `merge_readiness`-Felds zu Merge Requests laufen manche Server mit Code, der dieses Feld erwartet, während andere nichts davon wissen. Schlechte Handhabung würde GitLab.com für Millionen Nutzer(innen) unterbrechen. Gute Handhabung bleibt unbemerkt.\n\nMit wenigen Ausnahmen läuft die Mehrheit der Services für eine gewisse Zeit in leicht neuerer Version in Canary. Diese Szenarien sind transiente Zustände, können aber mehrere Stunden oder Tage in Live-Production-Umgebung persistieren. Daher müssen sie mit derselben Sorgfalt wie permanente Zustände behandelt werden.\n\n## Datenbank-Operationen\n\nDatenbankmigrationen stellen eine besondere Herausforderung im Canary-Deployment-Modell dar. Schemaänderungen müssen neue Features unterstützen und gleichzeitig Rollback-Fähigkeit bewahren:\n\n* **Regular Migrations:** Laufen während Canary-Stage, rückwärtskompatibel, nur reversible Änderungen\n* **Post-Deploy-Migrations:** \"Point of no Return\"-Migrationen, die erst nach mehreren erfolgreichen Bereitstellungen laufen\n\n```mermaid\n    graph LR\n        A[Regular Migrations] --> B[Canary Stage Deploy]\n        B --> C[Main Stage Deploy]\n        C --> D[Post Deploy Migrations]\n```\n\nPost-Deploy-Migrationen enthalten oft Änderungen, die nicht einfach rückgängig gemacht werden können – Datentransformationen, Column-Drops oder strukturelle Änderungen, die ältere Code-Versionen unterbrechen würden. Durch Ausführung nach Erlangung von Vertrauen durch mehrere erfolgreiche Bereitstellungen wird sichergestellt:\n\n1. Neuer Code ist stabil, Rollback unwahrscheinlich\n2. Performance-Charakteristiken in Production verstanden\n3. Edge Cases erkannt und adressiert\n4. Blast Radius minimiert, falls etwas schiefgeht\n\nDieser Ansatz bietet optimale Balance: schnelle Feature-Bereitstellung durch Canary-Releases bei gleichzeitiger Rollback-Fähigkeit bis Vertrauen in Deployment-Stabilität besteht.\n\n**Expand-Migrate-Contract-Pattern:** Datenbank-, Frontend- und Anwendungskompatibilitäts-Änderungen folgen einem sorgfältig orchestrierten dreiphasigen Ansatz:\n\n1. **Expand:** Neue Strukturen hinzufügen, alte funktional belassen\n2. **Migrate:** Neuen Application-Code deployen, der neue Strukturen nutzt\n3. **Contract:** Alte Strukturen in Post-Deploy-Migrationen entfernen\n\n**Beispiel für `merge_readiness`-Column:**\n\n1. **Expand:** Neue Column mit Default-Value hinzufügen; bestehender Code ignoriert sie\n2. **Migrate:** Code deployen, der neue Column liest und schreibt, alten Ansatz weiter unterstützt\n3. **Contract:** Nach mehreren erfolgreichen Bereitstellungen alte Column in Post-Deploy-Migration entfernen\n\nAlle Datenbank-Operationen, Application-Code und Frontend-Code unterliegen Guidelines, dokumentiert in der [Multi-Version-Compatibility-Dokumentation](https://docs.gitlab.com/development/multi_version_compatibility/).\n\n## Ergebnisse und Auswirkungen\n\n**Für GitLab:**\n\n* Bis zu 12 Bereitstellungen täglich auf GitLab.com\n* Zero-Downtime-Bereitstellungen für Millionen Entwickler(innen)\n* Security-Patches erreichen Production innerhalb von Stunden\n* Neue Features in Production im Maßstab validiert vor General Availability\n\n**Für Kunden:**\n\n* Bewährte Deployment-Patterns für eigene Anwendungen\n* Features auf weltweit größter GitLab-Instanz getestet vor Erreichen der Kundenumgebung\n* Dokumentation reflektiert tatsächliche Production-Praktiken\n* Vertrauen, dass GitLabs empfohlene Upgrade-Prozeduren in jedem Maßstab funktionieren\n\n## Erkenntnisse für Engineering-Teams\n\nDie hier beschriebenen Muster – von Expand-Migrate-Contract für Datenbankmigrationen bis zur Multi-Version-Kompatibilität – sind auf kleinere Deployments übertragbar. Nicht jede Organisation benötigt 12 Bereitstellungen täglich, aber die systematische Herangehensweise an Rollback-Fähigkeit und Validierungspunkte gilt unabhängig von der Skalierung.\n\nGitLabs Deployment-Pipeline repräsentiert ein ausgereiftes System, das Deployment-Geschwindigkeit mit operationaler Zuverlässigkeit ausbalanciert. Das progressive Deployment-Modell, umfassende Testing-Integration und robuste Rollback-Fähigkeiten bieten Grundlage für zuverlässige Software-Auslieferung im Maßstab.\n\n**Zentrale Überlegungen für Engineering-Teams:**\n\n* **Automatisiertes Testing:** Umfassende Test-Coverage durch Deployment-Pipeline\n* **Progressive Rollouts:** Gestufte Bereitstellungen zur Risikominimierung und schnellen Wiederherstellung\n* **Monitoring-Integration:** Umfassende Observability über alle Deployment-Stages\n* **Incident Response:** Schnelle Erkennungs- und Lösungsfähigkeiten für Deployment-Probleme\n\nGitLabs Architektur demonstriert, wie moderne CI/CD-Systeme Komplexität großskaliger Bereitstellungen managen und gleichzeitig Geschwindigkeit für wettbewerbsfähige Software-Entwicklung bewahren.\n\n## Vollständige technische Dokumentation\n\nDieser Artikel beschreibt die Deployment-Patterns und systematische Herangehensweise für GitLab.com. Für vollständige Implementierungsdetails, spezifische Konfigurationsbeispiele und tiefergehende technische Architekturbeschreibungen siehe die [englische Originalversion](https://about.gitlab.com/blog/continuously-deploying-the-largest-gitlab-instance/).\n\nWeitere Dokumentation zu Auto-Deploy und Verfahren:\n\n* [Engineering Deployments](https://handbook.gitlab.com/handbook/engineering/deployments-and-releases/deployments/)\n* [Release Procedural Documentation](https://gitlab-org.gitlab.io/release/docs/)\n* [GitLab Environment Toolkit](https://gitlab.com/gitlab-org/gitlab-environment-toolkit)\n\n## Weitere Ressourcen\n\n* [How we decreased GitLab repo backup times from 48 hours to 41 minutes](https://about.gitlab.com/blog/how-we-decreased-gitlab-repo-backup-times-from-48-hours-to-41-minutes/)\n* [How we supercharged GitLab CI statuses with WebSockets](https://about.gitlab.com/blog/how-we-supercharged-gitlab-ci-statuses-with-websockets/)\n* [How we reduced MR review time with Value Stream Management](https://about.gitlab.com/blog/how-we-reduced-mr-review-time-with-value-stream-management/)","yml",{},"/de-de/blog/continuously-deploying-the-largest-gitlab-instance",{"noIndex":29,"title":30,"description":31},false,"Zero-Downtime-Deployment: 12x täglich im Enterprise-Maßstab","Progressive Rollouts, Canary-Validierung und Multi-Version-Kompatibilität für GitLab.com – bewährte Deployment-Strategie im Maßstab.","de-de/blog/continuously-deploying-the-largest-gitlab-instance",[22,34],"inside-gitlab","Lyl91AlzWqYilcjnvZzIvvfJy7XwX6LXhCcGNkeuOqc",{"data":37},{"logo":38,"freeTrial":43,"sales":48,"login":53,"items":58,"search":367,"minimal":402,"duo":420,"pricingDeployment":430},{"config":39},{"href":40,"dataGaName":41,"dataGaLocation":42},"/de-de/","gitlab logo","header",{"text":44,"config":45},"Kostenlose Testversion anfordern",{"href":46,"dataGaName":47,"dataGaLocation":42},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":49,"config":50},"Vertrieb kontaktieren",{"href":51,"dataGaName":52,"dataGaLocation":42},"/de-de/sales/","sales",{"text":54,"config":55},"Anmelden",{"href":56,"dataGaName":57,"dataGaLocation":42},"https://gitlab.com/users/sign_in/","sign in",[59,86,182,187,288,348],{"text":60,"config":61,"cards":63},"Plattform",{"dataNavLevelOne":62},"platform",[64,70,78],{"title":60,"description":65,"link":66},"Die intelligente Orchestrierungsplattform für DevSecOps",{"text":67,"config":68},"Erkunde unsere Plattform",{"href":69,"dataGaName":62,"dataGaLocation":42},"/de-de/platform/",{"title":71,"description":72,"link":73},"GitLab Duo Agent Platform","Agentische KI für den gesamten Softwareentwicklungszyklus",{"text":74,"config":75},"Lerne GitLab Duo kennen",{"href":76,"dataGaName":77,"dataGaLocation":42},"/de-de/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":79,"description":80,"link":81},"Gründe, die für GitLab sprechen","Erfahre, warum Unternehmen auf GitLab setzen",{"text":82,"config":83},"Mehr erfahren",{"href":84,"dataGaName":85,"dataGaLocation":42},"/de-de/why-gitlab/","why gitlab",{"text":87,"left":11,"config":88,"link":90,"lists":94,"footer":164},"Produkt",{"dataNavLevelOne":89},"solutions",{"text":91,"config":92},"Alle Lösungen anzeigen",{"href":93,"dataGaName":89,"dataGaLocation":42},"/de-de/solutions/",[95,120,142],{"title":96,"description":97,"link":98,"items":103},"Automatisierung","CI/CD und Automatisierung zur Beschleunigung der Bereitstellung",{"config":99},{"icon":100,"href":101,"dataGaName":102,"dataGaLocation":42},"AutomatedCodeAlt","/de-de/solutions/delivery-automation/","automated software delivery",[104,108,111,116],{"text":105,"config":106},"CI/CD",{"href":107,"dataGaLocation":42,"dataGaName":105},"/de-de/solutions/continuous-integration/",{"text":71,"config":109},{"href":76,"dataGaLocation":42,"dataGaName":110},"gitlab duo agent platform - product menu",{"text":112,"config":113},"Quellcodeverwaltung",{"href":114,"dataGaLocation":42,"dataGaName":115},"/de-de/solutions/source-code-management/","Source Code Management",{"text":117,"config":118},"Automatisierte Softwarebereitstellung",{"href":101,"dataGaLocation":42,"dataGaName":119},"Automated software delivery",{"title":121,"description":122,"link":123,"items":128},"Sicherheit","Entwickle schneller, ohne die Sicherheit zu gefährden",{"config":124},{"href":125,"dataGaName":126,"dataGaLocation":42,"icon":127},"/de-de/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[129,133,138],{"text":130,"config":131},"Application Security Testing",{"href":125,"dataGaName":132,"dataGaLocation":42},"Application security testing",{"text":134,"config":135},"Schutz der Software-Lieferkette",{"href":136,"dataGaLocation":42,"dataGaName":137},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":139,"config":140},"Software Compliance",{"href":141,"dataGaName":139,"dataGaLocation":42},"/de-de/solutions/software-compliance/",{"title":143,"link":144,"items":149},"Bewertung",{"config":145},{"icon":146,"href":147,"dataGaName":148,"dataGaLocation":42},"DigitalTransformation","/de-de/solutions/visibility-measurement/","visibility and measurement",[150,154,159],{"text":151,"config":152},"Sichtbarkeit und Bewertung",{"href":147,"dataGaLocation":42,"dataGaName":153},"Visibility and Measurement",{"text":155,"config":156},"Wertstrommanagement",{"href":157,"dataGaLocation":42,"dataGaName":158},"/de-de/solutions/value-stream-management/","Value Stream Management",{"text":160,"config":161},"Analysen und Einblicke",{"href":162,"dataGaLocation":42,"dataGaName":163},"/de-de/solutions/analytics-and-insights/","Analytics and insights",{"title":165,"items":166},"GitLab für",[167,172,177],{"text":168,"config":169},"Enterprise",{"href":170,"dataGaLocation":42,"dataGaName":171},"/de-de/enterprise/","enterprise",{"text":173,"config":174},"Kleinunternehmen",{"href":175,"dataGaLocation":42,"dataGaName":176},"/de-de/small-business/","small business",{"text":178,"config":179},"den öffentlichen Sektor",{"href":180,"dataGaLocation":42,"dataGaName":181},"/de-de/solutions/public-sector/","public sector",{"text":183,"config":184},"Preise",{"href":185,"dataGaName":186,"dataGaLocation":42,"dataNavLevelOne":186},"/de-de/pricing/","pricing",{"text":188,"config":189,"link":191,"lists":195,"feature":275},"Ressourcen",{"dataNavLevelOne":190},"resources",{"text":192,"config":193},"Alle Ressourcen anzeigen",{"href":194,"dataGaName":190,"dataGaLocation":42},"/de-de/resources/",[196,229,247],{"title":197,"items":198},"Erste Schritte",[199,204,209,214,219,224],{"text":200,"config":201},"Installieren",{"href":202,"dataGaName":203,"dataGaLocation":42},"/de-de/install/","install",{"text":205,"config":206},"Kurzanleitungen",{"href":207,"dataGaName":208,"dataGaLocation":42},"/de-de/get-started/","quick setup checklists",{"text":210,"config":211},"Lernen",{"href":212,"dataGaLocation":42,"dataGaName":213},"https://university.gitlab.com/","learn",{"text":215,"config":216},"Produktdokumentation",{"href":217,"dataGaName":218,"dataGaLocation":42},"https://docs.gitlab.com/","product documentation",{"text":220,"config":221},"Best-Practice-Videos",{"href":222,"dataGaName":223,"dataGaLocation":42},"/de-de/getting-started-videos/","best practice videos",{"text":225,"config":226},"Integrationen",{"href":227,"dataGaName":228,"dataGaLocation":42},"/de-de/integrations/","integrations",{"title":230,"items":231},"Entdecken",[232,237,242],{"text":233,"config":234},"Kundenerfolge",{"href":235,"dataGaName":236,"dataGaLocation":42},"/de-de/customers/","customer success stories",{"text":238,"config":239},"Blog",{"href":240,"dataGaName":241,"dataGaLocation":42},"/de-de/blog/","blog",{"text":243,"config":244},"Remote",{"href":245,"dataGaName":246,"dataGaLocation":42},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":248,"items":249},"Vernetzen",[250,255,260,265,270],{"text":251,"config":252},"GitLab-Services",{"href":253,"dataGaName":254,"dataGaLocation":42},"/de-de/services/","services",{"text":256,"config":257},"Community",{"href":258,"dataGaName":259,"dataGaLocation":42},"/community/","community",{"text":261,"config":262},"Forum",{"href":263,"dataGaName":264,"dataGaLocation":42},"https://forum.gitlab.com/","forum",{"text":266,"config":267},"Veranstaltungen",{"href":268,"dataGaName":269,"dataGaLocation":42},"/events/","events",{"text":271,"config":272},"Partner",{"href":273,"dataGaName":274,"dataGaLocation":42},"/de-de/partners/","partners",{"backgroundColor":276,"textColor":277,"text":278,"image":279,"link":283},"#2f2a6b","#fff","Perspektiven für die Softwareentwicklung der Zukunft",{"altText":280,"config":281},"the source promo card",{"src":282},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.svg",{"text":284,"config":285},"Lies die News",{"href":286,"dataGaName":287,"dataGaLocation":42},"/de-de/the-source/","the source",{"text":289,"config":290,"lists":292},"Unternehmen",{"dataNavLevelOne":291},"company",[293],{"items":294},[295,300,306,308,313,318,323,328,333,338,343],{"text":296,"config":297},"Über",{"href":298,"dataGaName":299,"dataGaLocation":42},"/de-de/company/","about",{"text":301,"config":302,"footerGa":305},"Karriere",{"href":303,"dataGaName":304,"dataGaLocation":42},"/jobs/","jobs",{"dataGaName":304},{"text":266,"config":307},{"href":268,"dataGaName":269,"dataGaLocation":42},{"text":309,"config":310},"Geschäftsführung",{"href":311,"dataGaName":312,"dataGaLocation":42},"/company/team/e-group/","leadership",{"text":314,"config":315},"Team",{"href":316,"dataGaName":317,"dataGaLocation":42},"/company/team/","team",{"text":319,"config":320},"Handbuch",{"href":321,"dataGaName":322,"dataGaLocation":42},"https://handbook.gitlab.com/","handbook",{"text":324,"config":325},"Investor Relations",{"href":326,"dataGaName":327,"dataGaLocation":42},"https://ir.gitlab.com/","investor relations",{"text":329,"config":330},"Trust Center",{"href":331,"dataGaName":332,"dataGaLocation":42},"/de-de/security/","trust center",{"text":334,"config":335},"AI Transparency Center",{"href":336,"dataGaName":337,"dataGaLocation":42},"/de-de/ai-transparency-center/","ai transparency center",{"text":339,"config":340},"Newsletter",{"href":341,"dataGaName":342,"dataGaLocation":42},"/company/contact/#contact-forms","newsletter",{"text":344,"config":345},"Presse",{"href":346,"dataGaName":347,"dataGaLocation":42},"/press/","press",{"text":349,"config":350,"lists":351},"Kontakt",{"dataNavLevelOne":291},[352],{"items":353},[354,357,362],{"text":49,"config":355},{"href":51,"dataGaName":356,"dataGaLocation":42},"talk to sales",{"text":358,"config":359},"Support-Portal",{"href":360,"dataGaName":361,"dataGaLocation":42},"https://support.gitlab.com","support portal",{"text":363,"config":364},"Kundenportal",{"href":365,"dataGaName":366,"dataGaLocation":42},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":368,"login":369,"suggestions":376},"Schließen",{"text":370,"link":371},"Um Repositories und Projekte zu durchsuchen, melde dich an bei",{"text":372,"config":373},"gitlab.com",{"href":56,"dataGaName":374,"dataGaLocation":375},"search login","search",{"text":377,"default":378},"Vorschläge",[379,381,386,388,393,398],{"text":71,"config":380},{"href":76,"dataGaName":71,"dataGaLocation":375},{"text":382,"config":383},"Code Suggestions (KI)",{"href":384,"dataGaName":385,"dataGaLocation":375},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":105,"config":387},{"href":107,"dataGaName":105,"dataGaLocation":375},{"text":389,"config":390},"GitLab auf AWS",{"href":391,"dataGaName":392,"dataGaLocation":375},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":394,"config":395},"GitLab auf Google Cloud",{"href":396,"dataGaName":397,"dataGaLocation":375},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":399,"config":400},"Warum GitLab?",{"href":84,"dataGaName":401,"dataGaLocation":375},"Why GitLab?",{"freeTrial":403,"mobileIcon":408,"desktopIcon":413,"secondaryButton":416},{"text":404,"config":405},"Kostenlos testen",{"href":406,"dataGaName":47,"dataGaLocation":407},"https://gitlab.com/-/trials/new/","nav",{"altText":409,"config":410},"GitLab-Symbol",{"src":411,"dataGaName":412,"dataGaLocation":407},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":409,"config":414},{"src":415,"dataGaName":412,"dataGaLocation":407},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":197,"config":417},{"href":418,"dataGaName":419,"dataGaLocation":407},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de/compare/gitlab-vs-github/","get started",{"freeTrial":421,"mobileIcon":426,"desktopIcon":428},{"text":422,"config":423},"Erfahre mehr über GitLab Duo",{"href":424,"dataGaName":425,"dataGaLocation":407},"/de-de/gitlab-duo/","gitlab duo",{"altText":409,"config":427},{"src":411,"dataGaName":412,"dataGaLocation":407},{"altText":409,"config":429},{"src":415,"dataGaName":412,"dataGaLocation":407},{"freeTrial":431,"mobileIcon":436,"desktopIcon":438},{"text":432,"config":433},"Zurück zur Preisübersicht",{"href":185,"dataGaName":434,"dataGaLocation":407,"icon":435},"back to pricing","GoBack",{"altText":409,"config":437},{"src":411,"dataGaName":412,"dataGaLocation":407},{"altText":409,"config":439},{"src":415,"dataGaName":412,"dataGaLocation":407},{"title":441,"button":442,"config":447},"Sieh dir an, wie agentische KI die Softwarebereitstellung transformiert",{"text":443,"config":444},"GitLab Transcend jetzt ansehen",{"href":445,"dataGaName":446,"dataGaLocation":42},"/de-de/events/transcend/virtual/","transcend event",{"layout":448,"icon":449},"release","AiStar",{"data":451},{"text":452,"source":453,"edit":459,"contribute":464,"config":469,"items":474,"minimal":647},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":454,"config":455},"Quelltext der Seite anzeigen",{"href":456,"dataGaName":457,"dataGaLocation":458},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":460,"config":461},"Diese Seite bearbeiten",{"href":462,"dataGaName":463,"dataGaLocation":458},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":465,"config":466},"Beteilige dich",{"href":467,"dataGaName":468,"dataGaLocation":458},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":470,"facebook":471,"youtube":472,"linkedin":473},"https://x.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[475,498,553,580,614],{"title":60,"links":476,"subMenu":481},[477],{"text":478,"config":479},"DevSecOps-Plattform",{"href":69,"dataGaName":480,"dataGaLocation":458},"devsecops platform",[482],{"title":183,"links":483},[484,488,493],{"text":485,"config":486},"Tarife anzeigen",{"href":185,"dataGaName":487,"dataGaLocation":458},"view plans",{"text":489,"config":490},"Vorteile von Premium",{"href":491,"dataGaName":492,"dataGaLocation":458},"/de-de/pricing/premium/","why premium",{"text":494,"config":495},"Vorteile von Ultimate",{"href":496,"dataGaName":497,"dataGaLocation":458},"/de-de/pricing/ultimate/","why ultimate",{"title":499,"links":500},"Lösungen",[501,506,509,511,516,521,525,528,531,536,538,540,543,548],{"text":502,"config":503},"Digitale Transformation",{"href":504,"dataGaName":505,"dataGaLocation":458},"/de-de/topics/digital-transformation/","digital transformation",{"text":507,"config":508},"Sicherheit und Compliance",{"href":125,"dataGaName":132,"dataGaLocation":458},{"text":117,"config":510},{"href":101,"dataGaName":102,"dataGaLocation":458},{"text":512,"config":513},"Agile Entwicklung",{"href":514,"dataGaName":515,"dataGaLocation":458},"/de-de/solutions/agile-delivery/","agile delivery",{"text":517,"config":518},"Cloud-Transformation",{"href":519,"dataGaName":520,"dataGaLocation":458},"/de-de/topics/cloud-native/","cloud transformation",{"text":522,"config":523},"SCM",{"href":114,"dataGaName":524,"dataGaLocation":458},"source code management",{"text":105,"config":526},{"href":107,"dataGaName":527,"dataGaLocation":458},"continuous integration & delivery",{"text":155,"config":529},{"href":157,"dataGaName":530,"dataGaLocation":458},"value stream management",{"text":532,"config":533},"GitOps",{"href":534,"dataGaName":535,"dataGaLocation":458},"/de-de/solutions/gitops/","gitops",{"text":168,"config":537},{"href":170,"dataGaName":171,"dataGaLocation":458},{"text":173,"config":539},{"href":175,"dataGaName":176,"dataGaLocation":458},{"text":541,"config":542},"Öffentlicher Sektor",{"href":180,"dataGaName":181,"dataGaLocation":458},{"text":544,"config":545},"Bildungswesen",{"href":546,"dataGaName":547,"dataGaLocation":458},"/de-de/solutions/education/","education",{"text":549,"config":550},"Finanzdienstleistungen",{"href":551,"dataGaName":552,"dataGaLocation":458},"/de-de/solutions/finance/","financial services",{"title":188,"links":554},[555,557,559,561,564,566,568,570,572,574,576,578],{"text":200,"config":556},{"href":202,"dataGaName":203,"dataGaLocation":458},{"text":205,"config":558},{"href":207,"dataGaName":208,"dataGaLocation":458},{"text":210,"config":560},{"href":212,"dataGaName":213,"dataGaLocation":458},{"text":215,"config":562},{"href":217,"dataGaName":563,"dataGaLocation":458},"docs",{"text":238,"config":565},{"href":240,"dataGaName":241,"dataGaLocation":458},{"text":233,"config":567},{"href":235,"dataGaName":236,"dataGaLocation":458},{"text":243,"config":569},{"href":245,"dataGaName":246,"dataGaLocation":458},{"text":251,"config":571},{"href":253,"dataGaName":254,"dataGaLocation":458},{"text":256,"config":573},{"href":258,"dataGaName":259,"dataGaLocation":458},{"text":261,"config":575},{"href":263,"dataGaName":264,"dataGaLocation":458},{"text":266,"config":577},{"href":268,"dataGaName":269,"dataGaLocation":458},{"text":271,"config":579},{"href":273,"dataGaName":274,"dataGaLocation":458},{"title":289,"links":581},[582,584,586,588,590,592,594,598,603,605,607,609],{"text":296,"config":583},{"href":298,"dataGaName":291,"dataGaLocation":458},{"text":301,"config":585},{"href":303,"dataGaName":304,"dataGaLocation":458},{"text":309,"config":587},{"href":311,"dataGaName":312,"dataGaLocation":458},{"text":314,"config":589},{"href":316,"dataGaName":317,"dataGaLocation":458},{"text":319,"config":591},{"href":321,"dataGaName":322,"dataGaLocation":458},{"text":324,"config":593},{"href":326,"dataGaName":327,"dataGaLocation":458},{"text":595,"config":596},"Sustainability",{"href":597,"dataGaName":595,"dataGaLocation":458},"/sustainability/",{"text":599,"config":600},"Vielfalt, Inklusion und Zugehörigkeit",{"href":601,"dataGaName":602,"dataGaLocation":458},"/de-de/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":329,"config":604},{"href":331,"dataGaName":332,"dataGaLocation":458},{"text":339,"config":606},{"href":341,"dataGaName":342,"dataGaLocation":458},{"text":344,"config":608},{"href":346,"dataGaName":347,"dataGaLocation":458},{"text":610,"config":611},"Transparenzerklärung zu moderner Sklaverei",{"href":612,"dataGaName":613,"dataGaLocation":458},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":615,"links":616},"Nimm Kontakt auf",[617,620,625,627,632,637,642],{"text":618,"config":619},"Sprich mit einem Experten/einer Expertin",{"href":51,"dataGaName":52,"dataGaLocation":458},{"text":621,"config":622},"Support",{"href":623,"dataGaName":624,"dataGaLocation":458},"/support/","get help",{"text":363,"config":626},{"href":365,"dataGaName":366,"dataGaLocation":458},{"text":628,"config":629},"Status",{"href":630,"dataGaName":631,"dataGaLocation":458},"https://status.gitlab.com/","status",{"text":633,"config":634},"Nutzungsbedingungen",{"href":635,"dataGaName":636,"dataGaLocation":458},"/terms/","terms of use",{"text":638,"config":639},"Datenschutzerklärung",{"href":640,"dataGaName":641,"dataGaLocation":458},"/de-de/privacy/","privacy statement",{"text":643,"config":644},"Cookie-Einstellungen",{"dataGaName":645,"dataGaLocation":458,"id":646,"isOneTrustButton":11},"cookie preferences","ot-sdk-btn",{"items":648},[649,651,653],{"text":633,"config":650},{"href":635,"dataGaName":636,"dataGaLocation":458},{"text":638,"config":652},{"href":640,"dataGaName":641,"dataGaLocation":458},{"text":643,"config":654},{"dataGaName":645,"dataGaLocation":458,"id":646,"isOneTrustButton":11},[656],{"id":657,"title":19,"body":8,"config":658,"content":661,"description":8,"extension":25,"meta":664,"navigation":11,"path":665,"seo":666,"stem":667,"__hash__":668},"blogAuthors/en-us/blog/authors/john-skarbek.yml",{"template":659,"gitlabHandle":660},"BlogAuthor","skarbek",{"name":19,"config":662},{"headshot":663},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1751303547/nq8dxitzoybran2r7crm.png",{},"/en-us/blog/authors/john-skarbek",{},"en-us/blog/authors/john-skarbek","nCwAkCMUv4nyRXTlh0-D0dgPvTS8mamZO-9zskk_RKQ",[670,685,701],{"content":671,"config":683},{"category":9,"tags":672,"body":675,"date":676,"heroImage":677,"authors":678,"title":681,"description":682},[673,674,105],"tutorial","git","Enterprise-Migrationen in regulierten Branchen wie Finanzwesen und Automobilindustrie erfordern systematisches Risikomanagement gemäß NIS2-Richtlinie Artikel 21. Die mehrstufige Migrationsstruktur mit Testläufen vor Produktions-Wellen und kontrollierten Change-Freezes demonstriert Business-Continuity-Management in der Praxis. GitLab Professional Services organisiert Migrationen in Wellen von 200-300 Projekten, um Komplexität zu managen und API-Rate-Limits zu respektieren.\n\n## Überblick\n\nGitLab bietet [Congregate](https://gitlab.com/gitlab-org/professional-services-automation/tools/migration/congregate/) (maintained by GitLab Professional Services) und [eingebauten Git-Repository-Import](https://docs.gitlab.com/user/project/import/repo_by_url/) für Migrationen von Azure DevOps (ADO). Beide Optionen unterstützen Repository-basierte oder Bulk-Migration und erhalten Git-Commit-History, Branches und Tags. Mit Congregate werden zusätzliche Assets wie Wikis, Work Items, CI/CD-Variablen, Container-Images, Packages und Pipelines migriert (siehe [Feature-Matrix](https://gitlab.com/gitlab-org/professional-services-automation/tools/migration/congregate/-/blob/master/customer/ado-migration-features-matrix.md)).\n\nEnterprises folgen typischerweise einem mehrstufigen Ansatz:\n\n- Repositories von ADO zu GitLab migrieren (Congregate oder eingebauter Import)\n- Pipelines von Azure Pipelines zu GitLab CI/CD migrieren\n- Verbleibende Assets wie Boards, Work Items und Artifacts zu GitLab Issues, Epics und Package/Container Registries migrieren\n\nMehrstufige Migrationsphasen (siehe [Diagramm](https://about.gitlab.com/blog/migration-from-azure-devops-to-gitlab/#overview)):\n\n- Prerequisites (IdP, Runners, Change Management)\n- Migration Phase (Source Code, History, Work Items)\n- Post-Migration (Pipelines, Assets, Security)\n\n## Migration planen\n\n**Zentrale Planungsfragen:**\n\n- Wie schnell muss die Migration abgeschlossen werden?\n- Was genau wird migriert?\n- Wer führt die Migration durch?\n- Welche Organisationsstruktur wird in GitLab benötigt?\n- Welche Einschränkungen, Limitierungen oder Fallstricke müssen berücksichtigt werden?\n\nDie Timeline bestimmt weitgehend den Migrationsansatz. Identifizierung von Champions oder Teams mit ADO- und GitLab-Erfahrung unterstützt Adoption und Guidance.\n\n**Inventar erstellen:**\n\nDas GitLab Professional Services [Evaluate](https://gitlab.com/gitlab-org/professional-services-automation/tools/utilities/evaluate#beta-azure-devops)-Tool produziert ein vollständiges Inventar der Azure DevOps Organisation: Repositories, PR-Counts, Contributors, Pipelines, Work Items, CI/CD-Variablen. Bei Professional Services Engagements wird dieser Report mit Engagement Manager oder Technical Architect geteilt für Migrationsplanung.\n\nMigrations-Timing wird primär bestimmt durch Pull-Request-Count, Repository-Größe und Contribution-Menge. Beispiel: 1.000 kleine Repositories mit wenigen PRs migrieren schneller als wenige Repositories mit Zehntausenden PRs. Inventar-Daten ermöglichen Aufwands-Schätzung und Test-Run-Planung.\n\nIn Professional Services Engagements werden Migrationen in Wellen von 200-300 Projekten organisiert, um Komplexität zu managen und API-Rate-Limits zu respektieren (sowohl [GitLab](https://docs.gitlab.com/security/rate_limits/) als auch [ADO](https://learn.microsoft.com/en-us/azure/devops/integrate/concepts/rate-limits?view=azure-devops)).\n\n**Tool-Auswahl:**\n\nGitLabs [eingebauter Repository-Importer](https://docs.gitlab.com/user/project/import/repo_by_url/) migriert Git-Repositories (Commits, Branches, Tags) einzeln. Congregate erhält Pull Requests (in GitLab: Merge Requests), Kommentare und Metadata; der eingebaute Import fokussiert auf Git-Daten (History, Branches, Tags).\n\nAssets die typischerweise separate Migration oder manuelle Neuerstellung erfordern:\n\n- Azure Pipelines → GitLab CI/CD Pipelines (siehe [CI/CD YAML](https://docs.gitlab.com/ci/yaml/) oder [CI/CD Components](https://docs.gitlab.com/ci/components/)). Alternativ: AI-basierte Pipeline-Konvertierung in Congregate.\n- Work Items und Boards → GitLab Issues, Epics, Issue Boards\n- Artifacts, Container-Images (ACR) → GitLab Package/Container Registry\n- Service Hooks, externe Integrationen → in GitLab neu erstellen\n\n[Permissions-Modelle](https://docs.gitlab.com/user/permissions/) unterscheiden sich zwischen ADO und GitLab. Permissions-Mapping planen statt exakter Preservation zu erwarten.\n\n**Organisationsstruktur in GitLab:**\n\nEmpfohlener Ansatz: ADO-Organisationen auf GitLab-Groups mappen (nicht viele kleine Groups). Migration als Gelegenheit nutzen, GitLab-Struktur zu rationalisieren (siehe [Struktur-Diagramm](https://about.gitlab.com/blog/migration-from-azure-devops-to-gitlab/#planning-your-migration)):\n\n- **ADO Organization** → GitLab Top-level Group\n- **ADO Project** → GitLab Subgroup (optional)\n- **ADO Repository** → GitLab Project\n\nWeitere Empfehlungen:\n\n- Subgroups und Project-Level-Permissions für verwandte Repositories nutzen\n- Zugriff über GitLab Groups und Group-Membership managen\n- GitLab [Permissions](https://docs.gitlab.com/ee/user/permissions.html) und [SAML Group Links](https://docs.gitlab.com/user/group/saml_sso/group_sync/) für Enterprise-RBAC-Modell evaluieren\n\n**ADO Work Items Migration:**\n\nADO Boards und Work Items mappen zu GitLab Issues, Epics und Issue Boards. ADO Epics und Features werden GitLab Epics. Andere Work-Item-Typen (User Stories, Tasks, Bugs) werden project-scoped Issues. Standard-Felder bleiben erhalten; ausgewählte Custom Fields können migriert werden. Parent-Child-Relationships bleiben erhalten. Links zu Pull Requests werden zu Merge-Request-Links konvertiert.\n\n![Migration eines Work Items zu GitLab Issue](https://res.cloudinary.com/about-gitlab-com/image/upload/v1764769188/ztesjnxxfbwmfmtckyga.png)\n\n**Pipelines-Migration:**\n\nCongregate bietet [AI-basierte Konvertierung](https://gitlab.com/gitlab-org/professional-services-automation/tools/migration/congregate/-/merge_requests/1298) für multi-stage YAML-Pipelines von Azure DevOps zu GitLab CI/CD. Die automatisierte Konvertierung funktioniert optimal für einfache Single-File-Pipelines und liefert einen funktionalen Ausgangspunkt, nicht ein produktionsreifes `.gitlab-ci.yml`-File. Das Tool generiert funktional äquivalente GitLab-Pipelines zur weiteren Optimierung.\n\n- Konvertiert Azure Pipelines YAML zu `.gitlab-ci.yml` automatisch\n- Geeignet für straightforward Single-File-Pipeline-Konfigurationen\n- Liefert Boilerplate zur Migrations-Beschleunigung, nicht finales Production-Artifact\n- Erfordert Review und Anpassung für komplexe Szenarien, Custom Tasks oder Enterprise-Requirements\n- Unterstützt keine Azure DevOps Classic Release Pipelines\n\nRepository-Owner sollten [GitLab CI/CD Dokumentation](https://docs.gitlab.com/ci/) konsultieren für weitere Pipeline-Optimierung nach initialer Konvertierung.\n\n## Migrationen durchführen\n\nNach der Planung werden Migrationen in Stages durchgeführt, beginnend mit Trial Runs. Trial Migrations identifizieren organisations-spezifische Issues frühzeitig und ermöglichen Duration-Messung, Outcome-Validierung und Approach-Finetuning vor Production.\n\n**Was Trial Migrations validieren:**\n\n- Ob Repository und Assets erfolgreich migrieren (History, Branches, Tags; plus MRs/Comments bei Congregate)\n- Ob Destination sofort nutzbar ist (Permissions, Runners, CI/CD-Variablen, Integrationen)\n- Wie lange jeder Batch benötigt für Schedule- und Stakeholder-Expectations\n\n**Downtime-Guidance:**\n\nGitLabs eingebauter Git-Import und Congregate erfordern inhärent keine Downtime. Für Production-Wellen: Changes in ADO freezen (Branch-Protections oder Read-only), um verpasste Commits, PR-Updates oder mid-migration Work Items zu vermeiden. Trial Runs erfordern keine Freezes.\n\n**Batching-Guidance:**\n\nTrial-Batches back-to-back durchführen für kürzere elapsed Time. Teams validieren Results asynchron. Geplante Group/Subgroup-Struktur für Batch-Definition nutzen und API-Rate-Limits respektieren.\n\n**Empfohlene Schritte:**\n\n1. Test-Destination in GitLab erstellen (GitLab.com: dedicated Group/Namespace; Self-managed: Top-level Group)\n2. Authentication vorbereiten (Azure DevOps PAT, GitLab Personal Access Token mit api und read_repository Scopes)\n3. Trial Migrations durchführen (Repos only: eingebauter Import; Repos + PRs/MRs: Congregate)\n4. Post-Trial Follow-up (Repo-History, Branches, Tags, Merge Requests, Issues/Epics, Labels, Relationships verifizieren)\n5. Permissions/Roles, Protected Branches, Runners/Tags, Variables/Secrets, Integrations/Webhooks prüfen\n6. Pipelines (`.gitlab-ci.yml`) oder konvertierte Pipelines validieren\n7. User-Validierung für Functionality und Data-Fidelity\n8. Production-Migrationen in Waves durchführen (Change-Freezes in ADO erzwingen, Progress und Logs monitoren)\n\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/ibIXGfrVbi4?si=ZxOVnXjCF-h4Ne0N\" frameborder=\"0\" allowfullscreen=\"true\">\u003C/iframe>\n\u003C/figure>\n\n## Zentrale ADO-zu-GitLab-Mappings\n\nWichtigste Struktur-Mappings für Migrationsplanung:\n\n- **ADO Organization** → GitLab Group (Top-level Namespace)\n- **ADO Project** → GitLab Group oder Subgroup (Permissions-Boundary)\n- **ADO Repository** → GitLab Project (Git-Repo plus Issues, CI/CD, Wiki)\n- **Pull Request** → Merge Request (Code Review, Approvals)\n- **Azure Pipelines** → GitLab CI/CD (`.gitlab-ci.yml`)\n- **Agent Pools** → GitLab Runners (Job-Execution)\n- **Work Items** → GitLab Issues/Epics (Planning-Funktionalität)\n- **Variable Groups** → CI/CD Variables (Project/Group/Instance Level)\n\nFür vollständige Terminologie-Referenztabelle mit allen Mappings siehe [englische Originalversion](https://about.gitlab.com/blog/migration-from-azure-devops-to-gitlab/).\n\n## Professional Services Migrationsmuster\n\nGitLab Professional Services nutzt bewährte Muster für Enterprise-Migrationen:\n\n**Systematische Planung:** Evaluate-Tool liefert vollständiges Inventar (Repositories, PRs, Contributors, Pipelines, Work Items). Klassifikation nach Komplexität (Work Items = Planning-Team-Involvement; Pipelines = Conversion-Requirements) ermöglicht Timeline-Schätzung und Batch-Definition.\n\n**Controlled Execution:** Wellen von 200-300 Projekten managen Komplexität und respektieren API-Rate-Limits. Trial-Migrationen vor Production-Waves identifizieren Issues frühzeitig. Change-Freezes in ADO während Production-Wellen vermeiden mid-migration Updates.\n\n**Risikominimierung:** Multi-Phase-Ansatz (Prerequisites → Migration → Post-migration) mit Validierungs-Checkpoints an jeder Phase. Trial-Runs ermöglichen asynchrone Team-Validierung ohne Production-Impact.\n\n## Praktische Implementierung\n\nFür vollständige Implementierungsdetails, Konfigurationsbeispiele, Pipeline-Konvertierungs-Patterns und detaillierte Post-Migration-Checklisten siehe [englische Originalversion](https://about.gitlab.com/blog/migration-from-azure-devops-to-gitlab/).\n\nWeitere Professional Services Ressourcen:\n\n- [Professional Services Full Catalog](https://about.gitlab.com/professional-services/catalog/)\n- [Congregate Migration Tool](https://gitlab.com/gitlab-org/professional-services-automation/tools/migration/congregate/)\n- [Evaluate Inventory Tool](https://gitlab.com/gitlab-org/professional-services-automation/tools/utilities/evaluate)\n","2025-12-03","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749658924/Blog/Hero%20Images/securitylifecycle-light.png",[679,680],"Evgeny Rudinsky","Michael Leopard","Migration von Azure DevOps zu GitLab systematisch planen","Professional Services Migrationsansatz mit mehrstufiger Struktur, 200-300 Projekt-Wellen und systematischem Risikomanagement für Enterprise-Migrationen.",{"featured":11,"template":12,"slug":684},"migration-from-azure-devops-to-gitlab",{"content":686,"config":699},{"title":687,"description":688,"authors":689,"heroImage":691,"date":692,"category":9,"tags":693,"body":698},"MR-Review-Zeit mit Value Stream Management reduzieren","GitLab Engineering nutzt VSM zur Identifikation von Engpässen im MR-Review-Prozess. Systematische Analyse mit Custom Stages.",[690],"Haim Snir","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","2025-10-30",[22,694,695,696,697],"features","DevSecOps platform","workflow","solutions architecture","Das GitLab Engineering-Team nutzt die eigenen Produkte intern – eine Praxis, die im Englischen als \"Dogfooding\" bezeichnet wird. Diese Selbstnutzung hat zu Verbesserungen bei der Beschleunigung der Software-Delivery-Zyklen für Kunden geführt. Dieser Artikel beleuchtet einen spezifischen Anwendungsfall, bei dem [GitLab Value Stream Management (VSM)](https://about.gitlab.com/solutions/value-stream-management/) Verbesserungen für unser Engineering-Team ermöglicht hat. Es wird gezeigt, wie VSM dabei half, zwei zentrale Herausforderungen anzugehen: die Messung des Wegs von der Idee bis zur Fertigstellung eines Merge Requests und die Optimierung der Deployment-Workflows.\n\nValue Stream Management ist in der deutschen Industrie als Wertstromanalyse etabliert – insbesondere in der Fertigung und Automobilbranche wird diese Lean-Methode zur Identifikation von Verschwendung eingesetzt. GitLabs VSM-Funktionen übertragen diesen systematischen Ansatz auf Software-Entwicklungsprozesse und ermöglichen die Unterscheidung zwischen wertschöpfenden und nicht-wertschöpfenden Aktivitäten im Entwicklungsworkflow.\n\n## Die Herausforderung: Engpässe in MR-Reviews identifizieren\n\nTrotz gut definierter Workflows stellte ein Team fest, dass Merge Requests länger als erwartet brauchten, um geprüft und gemerged zu werden. Die Herausforderung bestand nicht nur in den Verzögerungen selbst, sondern darin zu verstehen, wo im Review-Prozess diese Verzögerungen auftraten und warum.\n\nDas Ziel des Teams war klar:\n\n- Identifizieren, wo Zeit vom initialen Konzept bis zum finalen Merge eines MR verbracht wurde\n- Spezifische Engpässe im Review-Prozess lokalisieren\n- Verstehen, wie MR-Größe, Komplexität oder Dokumentationsqualität die Review-Zeit beeinflussen\n\n## Der Ansatz: MR-Review-Zeit in GitLab Value Stream Analytics messen\n\nValue Stream Analytics (VSA) ermöglicht es Organisationen, ihren gesamten Workflow von der Idee bis zur Auslieferung abzubilden und dabei zwischen wertschöpfenden Aktivitäten (VA) und nicht-wertschöpfenden Aktivitäten (NVA) im Prozessfluss zu unterscheiden. Durch die Berechnung des Verhältnisses von wertschöpfender Zeit zur gesamten Lead Time kann das Team verschwenderische Aktivitäten identifizieren, die zu Verzögerungen bei MR-Reviews führen.\n\nUm die notwendigen Metriken zu erhalten, passte das Team GitLab VSA an, um bessere Sichtbarkeit in den MR-Review-Prozess zu erhalten.\n\n### 1. Custom Stage für MR-Review einrichten\n\nDas Team fügte eine [neue Custom Stage](https://docs.gitlab.com/ee/user/group/value_stream_analytics/#value-stream-stage-events) in VSA mit dem Namen **Review Time to Merge** hinzu, um spezifisch die Zeit vom ersten Zuweisen eines Reviewers bis zum Merge des MR zu tracken.\n\n- Start-Event: MR first reviewer assigned\n- End-Event: MR merged\n\nDurch die Definition dieser Stage begann VSA, die Dauer des MR-Review-Prozesses zu messen und lieferte präzise Daten darüber, wo Zeit verbracht wurde.\n\n![Defining stage of VSA](https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097884/Blog/Content%20Images/Blog/Content%20Images/image2_aHR0cHM6_1750097883929.png)\n\n### 2. Total Time Chart für Klarheit nutzen\n\nMit der Custom Stage eingerichtet, nutzte das Team das [**Total Time Chart** auf der VSA Overview-Seite](https://about.gitlab.com/blog/value-stream-total-time-chart/) (**Analyze > Value Stream**), um zu visualisieren, wie viel Zeit während der neuen MR-Review-Stage verbracht wurde. Durch den Vergleich der Werte, die durch jeden Bereich im Chart dargestellt wurden, konnte das Team schnell identifizieren, wie diese Stage zur gesamten Software-Delivery-Lifecycle-Zeit (SDLC) beitrug.\n\n![total time chart for VSA](https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097884/Blog/Content%20Images/Blog/Content%20Images/image1_aHR0cHM6_1750097883930.png)\n\n### 3. Für tiefere Erkenntnisse detailliert analysieren\n\nUm spezifische Verzögerungen zu untersuchen, nutzte das Team die **Stage Navigation Bar**, um tiefer in die MR-Review-Stage einzutauchen. Diese Ansicht ermöglichte:\n\n- MRs nach Review-Zeit sortieren: Die Stage-Tabelle zeigte alle zugehörigen MRs sortiert nach Review-Dauer, sodass langsame MRs leicht erkennbar waren\n- Individuelle MRs analysieren: Für jeden MR konnte das Team Faktoren wie Verzögerungen bei der Reviewer-Zuweisung, mehrere Feedback-Runden, Leerlaufzeit nach Approval und MR-Größe/Komplexität untersuchen\n\n## Das Ergebnis: Umsetzbare Erkenntnisse und Verbesserungen\n\nDurch die Anpassung von VSA zur Verfolgung der [MR-Review-Zeit](https://docs.gitlab.com/user/project/merge_requests/reviews/) deckte das Team mehrere zentrale Erkenntnisse auf:\n\n- **Verzögerungen bei Reviewer-Zuweisung:** Einige MRs erfuhren Verzögerungen, weil Reviewer spät zugewiesen wurden oder Reviewer zu viele MRs in ihrer Queue hatten\n- **Langsame Review-Start-Zeiten:** Selbst nach Zuweisung lagen bestimmte MRs untätig, bevor Reviews begannen – oft aufgrund von Kontextwechseln oder konkurrierenden Prioritäten\n- **Mehrere Feedback-Schleifen:** Größere MRs erforderten oft mehrere Feedback-Runden, was die Review-Zeit erheblich verlängerte\n- **Leerlaufzeit nach Approval:** Einige MRs wurden approved, aber nicht zeitnah gemerged – oft aufgrund von Deployment-Koordinationsproblemen\n\nFür den Engineering Manager im Team erwies sich VSA als wertvoll für die Verwaltung des Team-Workflows: \"Ich habe VSA genutzt, um zu begründen, wo wir Zeit bei der MR-Fertigstellung verbrachten. Wir haben VSA auf unsere Bedürfnisse angepasst, und es war sehr hilfreich für unsere Untersuchungen nach Verbesserungsmöglichkeiten.\"\n\nAus dieser Dogfooding-Erfahrung entwickeln wir nun eine wichtige Erweiterung zur Verbesserung der Sichtbarkeit in den Review-Prozess. Wir fügen ein neues Event zu VSA hinzu – [Merge request last approved at](https://gitlab.com/gitlab-org/gitlab/-/issues/503754) – das eine Stage erzeugt, die MR-Review-Schritte noch granularer aufschlüsselt.\n\n## Die Kraft datengestützter Entscheidungen\n\nDurch die Nutzung von GitLabs VSA haben wir nicht nur Engpässe identifiziert – wir erhielten umsetzbare Erkenntnisse, die zu Verbesserungen bei der MR-Review-Zeit und der allgemeinen Entwickler-Produktivität führten. Wir optimierten Merge-Request-Review-Zyklen und erhöhten den Entwickler-Durchsatz, was unser Commitment zu kontinuierlicher Verbesserung durch Messung bestätigt.\n\n> Möchtest du erfahren, wie VSA deinem Team helfen kann? [Starte eine kostenlose GitLab Ultimate-Testversion](https://about.gitlab.com/free-trial/), passe deine Value Streams an und sieh, wie du Verbesserungen im gesamten SDLC für deine Teams erreichen kannst. [Teile dann dein Feedback und deine Erfahrungen in diesem Issue](https://gitlab.com/gitlab-org/gitlab/-/issues/520962).\n\n## Weiterführende Informationen\n\n- [Optimize value stream efficiency to do more with less, faster](https://about.gitlab.com/the-source/platform/optimize-value-stream-efficiency-to-do-more-with-less-faster/)\n- [New Scheduled Reports Generation tool simplifies value stream management](https://about.gitlab.com/blog/new-scheduled-reports-generation-tool-simplifies-value-stream-management/)\n- [Value stream analytics documentation](https://docs.gitlab.com/user/group/value_stream_analytics/)\n- [Value stream management: Total Time Chart simplifies top-down optimization flow](https://about.gitlab.com/blog/value-stream-total-time-chart/)\n",{"slug":700,"featured":29,"template":12},"how-we-reduced-mr-review-time-with-value-stream-management",{"content":702,"config":712},{"title":703,"description":704,"authors":705,"heroImage":707,"date":708,"body":709,"category":9,"tags":710},"Streamlit-Framework: Systematische Infrastruktur-Governance","Das GitLab Data Team zeigt, wie frühzeitige Infrastruktur-Governance exponentiell steigende Wartungskosten verhindert. Ein systematischer Ansatz für Streamlit-Anwendungen in regulierten Umgebungen.",[706],"Radovan Bacovic","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","2025-10-20","Das GitLab Data Team hat dutzende isolierte [Streamlit](https://streamlit.io/)-Anwendungen in eine einheitliche, sichere und skalierbare Lösung für die Snowflake-Umgebung überführt. Die Kombination von Python, Snowflake, Streamlit und GitLab ermöglicht systematische Infrastrukturkontrolle. Dieser Beitrag beschreibt den methodischen Ansatz und die erzielten Ergebnisse.\n## Die Ausgangssituation\nDutzende Streamlit-Anwendungen in verschiedenen Umgebungen, unterschiedliche Python-Versionen, inkonsistente Sicherheitspraktiken beim Zugriff auf sensible Daten. Manche Anwendungen funktionieren, andere versagen ohne nachvollziehbaren Grund. Niemand weiß, wer welche Anwendung erstellt hat oder wie sie zu warten ist.\nGenau vor dieser Situation stand unser Data Team. Anwendungen entstanden isoliert, ohne Standardisierung, ohne Security-Oversight, ohne klaren Deployment-Prozess. Das Ergebnis: ein Compliance-Risiko und eine Wartungslast, die exponentiell wuchs.\n\n![Funktionale Architektur (High-Level-Übersicht)](https://res.cloudinary.com/about-gitlab-com/image/upload/v1760035999/i50lpkrwy9bok056rdak.png)\n\u003Cp>\u003C/p>\n\u003Ccenter>\u003Ci>Funktionale Architektur (High-Level-Übersicht)\u003C/i>\u003C/center>\n## Der methodische Ansatz\nAls \"Customer Zero\" haben wir das gesamte Framework auf GitLabs eigener CI/CD-Infrastruktur und den Projekt-Management-Tools aufgebaut. Die Grundkomponenten:\n1. [GitLab](https://about.gitlab.com/platform/) (Produkt)\n1. [Snowflake](https://about.gitlab.com/platform/) – Single Source of Truth (SSOT) für Data-Warehouse-Aktivitäten\n1. [Streamlit](https://streamlit.io/) – Open-Source-Tool für visuelle Anwendungen mit Python-Code\nDies ermöglichte direkten Zugriff auf Enterprise-DevSecOps-Funktionen: automatisierte Tests, Code-Review-Prozesse und Deployment-Pipelines von Beginn an. Durch GitLabs integrierte Features für Issue-Tracking, Merge-Requests und automatisierte Deployments (CI/CD-Pipelines) konnten wir schnell iterieren und das Framework gegen reale Enterprise-Anforderungen validieren. Dieser Internal-First-Ansatz stellte sicher, dass die Lösung im Produktiveinsatz bei GitLab selbst validiert wurde.\n### Erkenntnisse aus der Implementierung\nDie wichtigste Erkenntnis beim Aufbau des Streamlit Application Framework in Snowflake: **Struktur schlägt Chaos systematisch** – Governance früh implementieren, nicht nachträglich, wenn die Wartungskosten exponentiell steigen.\nRollen und Verantwortlichkeiten müssen klar definiert sein. Infrastruktur-Concerns werden von Application Development getrennt, sodass jedes Team sich auf seine Stärken konzentrieren kann.\nSecurity und Compliance können keine Nachgedanken sein. Sie müssen von Tag eins in Templates und automatisierte Prozesse integriert werden. Konsistente Standards vorab durchzusetzen ist wesentlich effizienter als nachträgliche Implementierung. Investitionen in Automatisierung und CI/CD-Pipelines zahlen sich aus, da manuelle Prozesse nicht skalieren und menschliche Fehler einführen.\n![Framework-Architektur (Gesamtübersicht)](https://res.cloudinary.com/about-gitlab-com/image/upload/v1760035998/qt9gfemxjnj8kjumkuh7.png)\n\u003Cp>\u003C/p>\n\u003Ccenter>\u003Ci>Framework-Architektur (Gesamtübersicht)\u003C/i>\u003C/center>\n## Das Streamlit Application Framework\nDas Framework verwandelt dezentrale Ansätze in eine strukturierte Lösung. Entwicklungsteams erhalten Freiheit innerhalb sicherer Leitplanken, während Deployment automatisiert und Wartungskomplexität eliminiert wird.\n### Drei Rollen, ein einheitlicher Prozess\nDas Framework führt einen strukturierten Ansatz mit drei klar getrennten Rollen ein:\n1. **Maintainers** (Data-Team-Mitglieder und Contributors) verwalten die Infrastruktur: CI/CD-Pipelines, Security-Templates und Compliance-Regeln. Sie stellen sicher, dass das Framework funktioniert und sicher bleibt.\n2. **Creators** (Anwendungsentwicklungsteams) konzentrieren sich auf ihre Kernkompetenzen: Visualisierungen erstellen, Snowflake-Daten einbinden, User Experiences gestalten. Volle Flexibilität beim Erstellen neuer Anwendungen von Grund auf, beim Hinzufügen neuer Pages zu bestehenden Apps, beim Integrieren zusätzlicher Python-Libraries und beim Bauen komplexer Datenvisualisierungen, ohne Beschäftigung mit Deployment-Pipelines oder Security-Konfigurationen.\n3. **Viewers** (Endnutzer) greifen auf fertige, sichere Anwendungen zu, ohne technischen Overhead. Benötigt wird lediglich Snowflake-Zugriff.\n![Rollen-Übersicht und ihre Funktionen](https://res.cloudinary.com/about-gitlab-com/image/upload/v1760035999/oatqyx3ug7vsgzishpma.png)\n\u003Cp>\u003C/p>\n\u003Ccenter>\u003Ci>Rollen-Übersicht und ihre Funktionen\u003C/i>\u003C/center>\n## Vollständige Automatisierung\nDurch CI/CD-Implementierung gehören tagelange manuelle Deployments und Konfigurationsaufwand der Vergangenheit an. Das Framework bietet:\n- **Umgebungsvorbereitung per Kommando:** Mit `make`-Befehlen ist die Umgebung in wenigen Sekunden installiert und einsatzbereit.\n```yaml ================================================================================ ✅ Snowflake CLI successfully installed and configured! Connection: gitlab_streamlit User: YOU@GITLAB.COM Account: gitlab ================================================================================ Using virtualenv: /Users/YOU/repos/streamlit/.venv 📚 Installing project dependencies... Installing dependencies from lock file No dependencies to install or update ✅ Streamlit environment prepared! ```\n- **Automatisierte CI/CD-Pipelines:** Übernehmen Testing, Code-Review und Deployment von Development bis Production.\n- **Sichere Sandbox-Umgebungen:** Ermöglichen sichere Entwicklung und Tests vor Production-Deployment.\n```yaml ╰─$ make streamlit-rules 🔍 Running Streamlit compliance check... ================================================================================ CODE COMPLIANCE REPORT ================================================================================ Generated: 2025-07-09 14:01:16 Files checked: 1\nSUMMARY: ✅ Passed: 1 ❌ Failed: 0 Success Rate: 100.0%\nAPPLICATION COMPLIANCE SUMMARY: 📱 Total Applications Checked: 1 ⚠️ Applications with Issues: 0 📊 File Compliance Rate: 100.0%\nDETAILED RESULTS BY APPLICATION: ... ```\n- **Template-basierte Anwendungserstellung:** Gewährleistet Konsistenz über alle Anwendungen und Pages hinweg.\n```shell ╰─$ make streamlit-new-page STREAMLIT_APP=sales_dashboard STREAMLIT_PAGE_NAME=analytics 📝 Generating new Streamlit page: analytics for app: sales_dashboard 📃 Create new page from template: Page name: analytics App directory: sales_dashboard Template path: page_template.py ✅ Successfully created 'analytics.py' in 'sales_dashboard' directory from template ```\n- **Poetry-basiertes Dependency-Management:** Verhindert Versionskonflikte und erhält saubere Umgebungen.\n- **Organisierte Projektstruktur:** Dedizierte Ordner für Anwendungen, Templates, Compliance-Regeln und Configuration-Management.\n```text ├── src/ │   ├── applications/     # Ordner für Streamlit-Anwendungen │   │   ├── main_app/     # Main-Dashboard-Anwendung │   │   ├── components/   # Gemeinsam genutzte Komponenten │   │   └── \u003Cyour_apps>/  # Eigene Anwendungen │   │   └── \u003Cyour_apps2>/ # Weitere Anwendungen │   ├── templates/        # Anwendungs- und Page-Templates │   ├── compliance/       # Compliance-Regeln und -Checks │   └── setup/            # Setup- und Konfigurations-Utilities ├── tests/                # Test-Dateien ├── config.yml            # Umgebungskonfiguration ├── Makefile              # Build- und Deployment-Automatisierung └── README.md             # Haupt-README-Datei ```\n- **Optimierter Workflow:** Von lokaler Entwicklung über Test-Schema bis Production, vollständig automatisiert durch GitLab CI/CD-Pipelines.\n![GitLab CI/CD-Pipelines für vollständige Prozessautomatisierung](https://res.cloudinary.com/about-gitlab-com/image/upload/v1760035998/usyma2jkgiazu9iay1au.png)\n\u003Cp>\u003C/p> \u003Ccenter>\u003Ci>GitLab CI/CD-Pipelines für vollständige Prozessautomatisierung\u003C/i>\u003C/center>\n## Security und Compliance by Design\nStatt Security nachträglich hinzuzufügen, baut das Streamlit Application Framework sie von Grund auf ein. Jede Anwendung folgt denselben Security-Standards, Compliance-Anforderungen werden automatisch durchgesetzt. Audit-Trails werden über den gesamten Development-Lifecycle gepflegt.\nCompliance-Regeln werden mit einem einzigen Kommando eingeführt und verifiziert. Beispielsweise lassen sich definieren, welche Klassen und Methoden verpflichtend sind, welche Dateien vorhanden sein müssen und welche Rollen für das Teilen der Anwendung erlaubt oder verboten sind. Die Regeln sind flexibel und beschreibend – Definition erfolgt in einer YAML-Datei:\n```yaml class_rules:\n  - name: \"Inherit code for the page from GitLabDataStreamlitInit\"\n    description: \"All Streamlit apps must inherit from GitLabDataStreamlitInit\"\n    severity: \"error\"\n    required: true\n    class_name: \"*\"\n    required_base_classes:\n      - \"GitLabDataStreamlitInit\"\n    required_methods:\n      - \"__init__\"\n      - \"set_page_layout\"\n      - \"setup_ui\"\n      - \"run\"\n\nfunction_rules:\n  - name: \"Main function required\"\n    description: \"Must have a main() function\"\n    severity: \"error\"\n    required: true\n    function_name: \"main\"\n\nimport_rules:\n  - name: \"Import GitLabDataStreamlitInit\"\n    description: \"Must import the mandatory base class\"\n    severity: \"error\"\n    required: true\n    module_name: \"gitlab_data_streamlit_init\"\n    required_items:\n      - \"GitLabDataStreamlitInit\"\n  - name: \"Import streamlit\"\n    description: \"Must import streamlit library\"\n    severity: \"error\"\n    required: true\n    module_name: \"streamlit\"\n\nfile_rules:\n  - name: \"Snowflake configuration required (snowflake.yml)\"\n    description: \"Each application must have a snowflake.yml configuration file\"\n    severity: \"error\"\n    required: true\n    file_pattern: \"**/applications/**/snowflake.yml\"\n    base_path: \"\"\n  - name: \"Snowflake environment required (environment.yml)\"\n    description: \"Each application must have a environment.yml configuration file\"\n    severity: \"error\"\n    required: true\n    file_pattern: \"**/applications/**/environment.yml\"\n    base_path: \"\"\n  - name: \"Share specification required (share.yml)\"\n    description: \"Each application must have a share.yml file\"\n    severity: \"warning\"\n    required: true\n    file_pattern: \"**/applications/**/share.yml\"\n    base_path: \"\"\n  - name: \"README.md required (README.md)\"\n    description: \"Each application should have a README.md file with a proper documentation\"\n    severity: \"error\"\n    required: true\n    file_pattern: \"**/applications/**/README.md\"\n    base_path: \"\"\n  - name: \"Starting point recommended (dashboard.py)\"\n    description: \"Each application must have a dashboard.py as a starting point\"\n    severity: \"warning\"\n    required: true\n    file_pattern: \"**/applications/**/dashboard.py\"\n    base_path: \"\"\n\nsql_rules:\n  - name: \"SQL files must contain only SELECT statements\"\n    description: \"SQL files and SQL code in other files should only contain SELECT statements for data safety\"\n    severity: \"error\"\n    required: true\n    file_extensions: [\".sql\", \".py\"]\n    select_only: true\n    forbidden_statements:\n      - ....\n    case_sensitive: false\n  - name: \"SQL queries should include proper SELECT statements\"\n    description: \"When SQL is present, it should contain proper SELECT statements\"\n    severity: \"warning\"\n    required: false\n    file_extensions: [\".sql\", \".py\"]\n    required_statements:\n      - \"SELECT\"\n    case_sensitive: false\n\nshare_rules:\n  - name: \"Valid functional roles in share.yml\"\n    description: \"Share.yml files must contain only valid functional roles from the approved list\"\n    severity: \"error\"\n    required: true\n    file_pattern: \"**/applications/**/share.yml\"\n    valid_roles:\n      - ...\n    safe_data_roles:\n      - ...\n  - name: \"Share.yml file format validation\"\n    description: \"Share.yml files must follow the correct YAML format structure\"\n    severity: \"error\"\n    required: true\n    file_pattern: \"**/applications/**/share.yml\"\n    required_keys:\n      - \"share\"\n    min_roles: 1\n    max_roles: 10\n```\nMit einem einzigen Kommando:\n```bash ╰─$ make streamlit-rules ```\nlassen sich alle erstellten Regeln verifizieren und validieren, dass Entwicklungsteams (die eine Streamlit-Anwendung erstellen) die von den Creators (die Policies und Building Blocks des Frameworks festlegen) spezifizierten Richtlinien befolgen und alle Building Blocks an der richtigen Stelle sind. Dies gewährleistet konsistentes Verhalten über alle Streamlit-Anwendungen hinweg.\n```yaml 🔍 Running Streamlit compliance check... ================================================================================ CODE COMPLIANCE REPORT ================================================================================ Generated: 2025-08-18 17:05:12 Files checked: 4\nSUMMARY: ✅ Passed: 4 ❌ Failed: 0 Success Rate: 100.0%\nAPPLICATION COMPLIANCE SUMMARY: 📱 Total Applications Checked: 1 ⚠️ Applications with Issues: 0 📊 File Compliance Rate: 100.0%\nDETAILED RESULTS BY APPLICATION: ================================================================================ ✅ PASS APPLICATION: main_app ------------------------------------------------------------ 📁 FILES ANALYZED (4): ✅ dashboard.py 📦 Classes: SnowflakeConnectionTester 🔧 Functions: main 📥 Imports: os, pwd, gitlab_data_streamlit_init, snowflake.snowpark.exceptions, streamlit\n✅ show_streamlit_apps.py 📦 Classes: ShowStreamlitApps 🔧 Functions: main 📥 Imports: pandas, gitlab_data_streamlit_init, snowflake_session, streamlit\n✅ available_packages.py 📦 Classes: AvailablePackages 🔧 Functions: main 📥 Imports: pandas, gitlab_data_streamlit_init, streamlit\n✅ share.yml 👥 Share Roles: snowflake_analyst_safe\n📄 FILE COMPLIANCE FOR MAIN_APP: ✅ Required files found: ✓ snowflake.yml ✓ environment.yml ✓ share.yml ✓ README.md ✓ dashboard.py\nRULES CHECKED: ---------------------------------------- Class Rules (1): - Inherit code for the page from GitLabDataStreamlitInit (error)\nFunction Rules (1): - Main function required (error)\nImport Rules (2): - Import GitLabDataStreamlitInit (error) - Import streamlit (error)\nFile Rules (5): - Snowflake configuration required (snowflake.yml) (error) - Snowflake environment required (environment.yml) (error) - Share specification required (share.yml) (warning) - README.md required (README.md) (error) - Starting point recommended (dashboard.py) (warning)\nSQL Rules (2): - SQL files must contain only SELECT statements (error) 🗄 SELECT-only mode enabled 🚨 Forbidden: INSERT, UPDATE, DELETE, DROP, ALTER... - SQL queries should include proper SELECT statements (warning)\nShare Rules (2): - Valid functional roles in share.yml (error) 👥 Valid roles: 15 roles defined 🔒 Safe data roles: 11 roles - Share.yml file format validation (error) ------------------------------------------------------------ ✅ Compliance check passed ----------------------------------------------------------- ```\n## Developer Experience\nOb bevorzugte IDE, webbasierte Entwicklungsumgebung oder Snowflake Snowsight – die Experience bleibt konsistent. Das Framework bietet:\n- **Template-basierte Entwicklung:** Neue Anwendungen und Pages werden über standardisierte Templates erstellt, was Konsistenz und Best Practices von Tag eins sicherstellt. Keine verstreuten Designs und Elemente mehr.\n```yaml ╰─$ make streamlit-new-app NAME=sales_dashboard 🔧 Configuration Environment: TEST 📝 Configuration File: config.yml 📜 Config Loader Script: ./setup/get_config.sh 🐍 Python Version: 3.12 📁 Applications Directory: ./src/applications 🗄 Database: ... 📊 Schema: ... 🏗 Stage: ... 🏭 Warehouse: ... 🆕 Creating new Streamlit app: sales_dashboard Initialized the new project in ./src/applications/sales_dashboard ```\n- **Poetry Package Management:** Alle Dependencies werden über Poetry verwaltet, was isolierte Umgebungen schafft, die bestehende Python-Setups nicht stören.\n```toml [tool.poetry] name = \"GitLab Data Streamlit\" version = \"0.1.1\" description = \"GitLab Data Team Streamlit project\" authors = [\"GitLab Data Team \u003C*****@gitlab.com>\"] readme = \"README.md\"\n[tool.poetry.dependencies] python = \"\u003C3.13,>=3.12\" snowflake-snowpark-python = \"==1.32.0\" snowflake-connector-python = {extras = [\"development\", \"pandas\", \"secure-local-storage\"], version = \"^3.15.0\"} streamlit = \"==1.22.0\" watchdog = \"^6.0.0\" types-toml = \"^0.10.8.20240310\" pytest = \"==7.0.0\" black = \"==25.1.0\" importlib-metadata = \"==4.13.0\" pyyaml = \"==6.0.2\" python-qualiter = \"*\" ruff = \"^0.1.0\" types-pyyaml = \"^6.0.12.20250516\" jinja2 = \"==3.1.6\"\n[build-system] requires = [\"poetry-core\"] build-backend = \"poetry.core.masonry.api\" ```\n- **Multi-Page-Application-Support:** Teams können problemlos komplexe Anwendungen mit mehreren Pages erstellen und neue Libraries nach Bedarf hinzufügen. Multi-Page-Anwendungen sind Teil des Frameworks – Fokus liegt auf der Logik, nicht auf Design und Strukturierung.\n![Multi-Page-Anwendungsbeispiel (in Snowflake)](https://res.cloudinary.com/about-gitlab-com/image/upload/v1760035999/at1q2xgmjthkrgju4okm.png)\n\u003Cp>\u003C/p>\n\u003Ccenter>\u003Ci>Multi-Page-Anwendungsbeispiel (in Snowflake)\u003C/i>\u003C/center>\n\u003Cp>\u003C/p>\n- **Nahtlose Snowflake-Integration:** Integrierte Konnektoren und Authentication-Handling für sicheren Datenzugriff bieten dieselbe Experience in lokaler Entwicklung und direkt in Snowflake.\n```yaml make streamlit-push-test APPLICATION_NAME=sales_dashboard 📤 Deploying Streamlit app to test environment: sales_dashboard ... ------------------------------------------------------------------------------------------------------------ 🔗 Running share command for application: sales_dashboard Running commands to grant shares 🚀 Executing: snow streamlit share sales_dashboard with SOME_NICE_ROLE ✅ Command executed successfully 📊 Execution Summary: 1/1 commands succeeded ```\n- **Umfassendes Makefile:** Alle gängigen Kommandos sind in einfache Makefile-Befehle verpackt, von lokaler Entwicklung über Testing bis Deployment, inklusive CI/CD-Pipelines.\n- **Sichere lokale Entwicklung:** Alles läuft in isolierten Poetry-Umgebungen, schützt das System und bietet Production-ähnliche Experiences.\n![Konsistente Experience unabhängig von der Umgebung (Beispiel lokale Entwicklung)](https://res.cloudinary.com/about-gitlab-com/image/upload/v1760035999/phmubsb34hn2mfefjvqh.png)\n\u003Cp>\u003C/p>\n\u003Ccenter>\u003Ci>Konsistente Experience unabhängig von der Umgebung (Beispiel lokale Entwicklung)\u003C/i>\u003C/center>\n\u003Cp>\u003C/p>\n- **Collaboration via Code:** Alle Anwendungen und Komponenten sind in einem Repository zusammengefasst, was der gesamten Organisation ermöglicht, an denselben Ressourcen zu kollaborieren und doppelte Arbeit sowie redundante Setups zu vermeiden.\n## Implementierungsschritte\nBei ähnlichen Herausforderungen mit verstreuten Streamlit-Anwendungen:\n1. **Bestandsaufnahme:** Bestehende Anwendungen inventarisieren und Problembereiche identifizieren.\n2. **Rollen definieren:** Maintainer-Verantwortlichkeiten von Creator- und Endnutzer-Anforderungen trennen.\n3. **Mit Templates beginnen:** Standardisierte Anwendungs-Templates erstellen, die Security- und Compliance-Anforderungen durchsetzen.\n4. **CI/CD implementieren:** Deployment-Pipeline automatisieren, um manuelle Fehler zu reduzieren und Konsistenz sicherzustellen.\n![Die in Snowflake deployte Anwendung](https://res.cloudinary.com/about-gitlab-com/image/upload/v1760036003/mzge9s1fhkhnx38y1a3i.png)\n\u003Cp>\u003C/p>\n\u003Ccenter>\u003Ci>Die in Snowflake deployte Anwendung\u003C/i>\u003C/center>\n## Einordnung\nDieses Framework behandelt Daten-Anwendungen als vollwertige Komponenten der Enterprise-Architektur.\nDurch die Bereitstellung von Struktur ohne Flexibilitätsverlust hat das GitLab Data Team eine Umgebung geschaffen, in der Teams mit minimalen technischen Vorkenntnissen schnell innovieren können, während höchste Security- und Compliance-Standards gewahrt bleiben.\n### Ausblick\nWir entwickeln das Framework basierend auf User-Feedback und entstehenden Anforderungen kontinuierlich weiter. Zukünftige Verbesserungen umfassen erweiterte Template-Libraries, verbesserte Monitoring-Funktionen, mehr Flexibilität und eine optimierte User Experience.\n**Das Ziel: ein Foundation schaffen, das mit den wachsenden Data-Application-Anforderungen der Organisation skaliert.**\nWeitere technische Details zur Implementierung im [englischen Original](https://about.gitlab.com/blog/how-we-built-a-structured-streamlit-application-framework-in-snowflake/).\n## Zusammenfassung\nDas [GitLab Data Team](https://handbook.gitlab.com/handbook/enterprise-data/) hat dutzende verstreute, unsichere Streamlit-Anwendungen ohne Standardisierung in ein einheitliches, Enterprise-taugliches Framework mit klarer Rollentrennung überführt:\n1. **Maintainers** verwalten Infrastruktur und Security.\n2. **Creators** konzentrieren sich auf Anwendungsentwicklung ohne Deployment-Overhead.\n3. **Viewers** greifen auf fertige, compliance-konforme Apps zu.\nDie verwendeten Building Blocks:\n1. Automatisierte **CI/CD**-Pipelines\n2. Vollständig kollaborativer und versionierter Code in **git**\n3. **Template-basierte** Entwicklung\n4. Integrierte **Security**-Compliance und Testing\n5. **Poetry-verwaltete** Umgebungen\nWir haben den Wartungs-Overhead eliminiert und gleichzeitig schnelle Innovation ermöglicht – der Beweis, dass Struktur und Flexibilität vereinbar sind, wenn Data Applications als vollwertige Enterprise-Assets behandelt werden, nicht als Wegwerf-Prototypen.\n",[22,694,711,673],"security",{"featured":29,"template":12,"slug":713},"how-we-built-a-structured-streamlit-application-framework-in-snowflake",{"promotions":715},[716,730,742],{"id":717,"categories":718,"header":720,"text":721,"button":722,"image":727},"ai-modernization",[719],"ai-ml","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":723,"config":724},"Get your AI maturity score",{"href":725,"dataGaName":726,"dataGaLocation":241},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":728},{"src":729},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":731,"categories":732,"header":734,"text":721,"button":735,"image":739},"devops-modernization",[22,733],"devsecops","Are you just managing tools or shipping innovation?",{"text":736,"config":737},"Get your DevOps maturity score",{"href":738,"dataGaName":726,"dataGaLocation":241},"/assessments/devops-modernization-assessment/",{"config":740},{"src":741},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":743,"categories":744,"header":745,"text":721,"button":746,"image":750},"security-modernization",[711],"Are you trading speed for security?",{"text":747,"config":748},"Get your security maturity score",{"href":749,"dataGaName":726,"dataGaLocation":241},"/assessments/security-modernization-assessment/",{"config":751},{"src":752},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"header":754,"blurb":755,"button":756,"secondaryButton":761},"Beginne noch heute, schneller zu entwickeln","Entdecke, was dein Team mit der intelligenten Orchestrierungsplattform für DevSecOps erreichen kann.\n",{"text":757,"config":758},"Kostenlosen Test starten",{"href":759,"dataGaName":47,"dataGaLocation":760},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":49,"config":762},{"href":51,"dataGaName":52,"dataGaLocation":760},1772652048928]