# GitLab CI/CD vs Traditional Stack: Comprehensive Comparison for FinTech **Версия:** 1.0 **Дата создания:** Январь 2026 **Целевая аудитория:** Technical Architects, DevOps Teams, C-Level Management **Статус:** Decision Document --- ## Executive Summary Данный документ представляет детальное сравнение двух подходов к построению CI/CD инфраструктуры для FinTech компании с закрытой инфраструктурой: 1. **Traditional Multi-Tool Stack:** Gitea + Jenkins + ArgoCD + Harbor 2. **Unified GitLab Solution:** GitLab CE/EE с integrated capabilities ### Ключевые выводы **GitLab Unified Approach:** - ✅ 40-60% reduction operational complexity (single platform) - ✅ Built-in SAST, DAST, dependency & container scanning - ✅ Native GitOps через GitLab Agent for Kubernetes - ✅ Single authentication/authorization system - ✅ Integrated audit trail для compliance - ⚠️ Higher resource requirements (4-8GB RAM minimum) - ⚠️ Vendor lock-in concerns - ⚠️ More complex initial setup **Traditional Multi-Tool Stack:** - ✅ Best-of-breed tool selection flexibility - ✅ Lower individual resource requirements (Gitea: 200MB) - ✅ No vendor lock-in - components replaceable - ✅ Zero licensing costs (all open source) - ⚠️ Complex integration between 4+ systems - ⚠️ Multiple UIs, authentications, databases - ⚠️ Higher operational overhead ### Финансовое сравнение (10 users) | Aspect | GitLab CE | GitLab Premium | Traditional Stack | |--------|-----------|----------------|-------------------| | License costs | **$0/year** | **$3,480/year** | **$0/year** | | RAM footprint | 4-8GB (1 system) | 4-8GB (1 system) | 14-18GB (4 systems) | | Maintenance overhead | Low | Low | High | | Setup time | 30-60 min | 30-60 min | 4-6 hours | | Team onboarding | 2-3 weeks | 2-3 weeks | 4-6 weeks | --- ## 1. Архитектурное сравнение ### Traditional Multi-Tool Stack ``` Git Hosting → CI/CD → Registry → GitOps (Gitea) (Jenkins) (Harbor) (ArgoCD) • 4 separate systems, UIs, databases • 14-18GB total RAM • Complex webhook integrations • Multiple credential stores ``` ### GitLab Unified Platform ``` Single GitLab Instance ├── Git Repository Management ├── CI/CD Pipelines (native) ├── Container Registry (built-in) ├── Security Scanning (SAST/DAST/Dependency/Container) ├── GitOps Agent (Kubernetes integration) └── Single DB, Auth, UI • 1 system, 1 UI, 1 database • 4-8GB RAM • Native integrations • Unified credential management ``` --- ## 2. CI/CD Pipeline Comparison ### Jenkins Pipeline Example ```groovy // Jenkinsfile - requires external plugins/tools pipeline { agent any stages { stage('Build') { steps { sh 'mvn package' } } stage('Security') { steps { // External tools required sh 'owasp-dependency-check' sh 'sonarqube-scanner' sh 'trivy image scan' } } stage('Push') { steps { script { // Harbor credentials needed docker.withRegistry('https://harbor.local', 'creds') { docker.image("app:${BUILD_ID}").push() } } } } } } ``` **Jenkins Characteristics:** - ✅ 1800+ plugins ecosystem - ✅ Maximum flexibility (Groovy scripting) - ✅ Mature, battle-tested (15+ years) - ✅ Platform agnostic - ❌ No built-in security scanning - ❌ External registry integration required - ❌ Complex plugin management - ❌ 4-8GB RAM for master ### GitLab CI Pipeline Example ```yaml # .gitlab-ci.yml - integrated security scanning stages: - build - test - security - deploy build: stage: build script: - mvn package artifacts: paths: [target/] # Security scans run automatically sast: stage: security # Built-in, no configuration needed dependency_scanning: stage: security # Built-in, no configuration needed container_scanning: stage: security # Built-in, automatic after image push deploy: stage: deploy script: - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA # Automatic GitLab Registry auth environment: name: production kubernetes: namespace: prod ``` **GitLab CI Characteristics:** - ✅ Native SAST/DAST/dependency/container scanning - ✅ Auto DevOps (zero-config pipelines) - ✅ Integrated registry (automatic auth) - ✅ Built-in artifact management - ✅ Environment tracking - ⚠️ Less flexible than Groovy scripting - ⚠️ YAML-only configuration - ⚠️ Some advanced features require Premium tier --- ## 3. GitOps Implementation Comparison ### ArgoCD (Traditional Stack) **Architecture:** ``` ArgoCD Controller (Kubernetes) ├── Monitors Git repo (polling) ├── Compares desired vs actual state ├── Automatic synchronization └── Web UI for visualization ``` **Capabilities:** - ✅ Excellent UI with topology view - ✅ Multi-cluster management - ✅ Supports Helm, Kustomize, Jsonnet - ✅ RBAC and SSO integration - ✅ Automated rollback - ❌ Requires separate installation - ❌ Another system to maintain - ❌ Separate authentication - 📊 2GB RAM requirement **ArgoCD Application Example:** ```yaml apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: myapp spec: project: default source: repoURL: https://gitea.company.com/repo.git targetRevision: HEAD path: k8s/ destination: server: https://kubernetes.default.svc namespace: production syncPolicy: automated: prune: true selfHeal: true ``` ### GitLab Agent for Kubernetes **Architecture:** ``` GitLab Agent (in Kubernetes) ├── Pull-based model (more secure) ├── Monitors GitLab projects ├── Automatic manifest synchronization └── Integrated with GitLab UI ``` **Capabilities:** - ✅ Native GitLab integration - ✅ Pull-based (no cluster credentials in GitLab) - ✅ CI/CD visibility in same UI - ✅ Automatic environment tracking - ✅ No separate authentication - ⚠️ Less mature than ArgoCD - ⚠️ Fewer advanced features - ⚠️ Limited multi-cluster management - 📊 ~500MB RAM requirement **GitLab Agent Configuration:** ```yaml # .gitlab/agents/production/config.yaml gitops: manifest_projects: - id: group/project paths: - glob: 'manifests/**/*.yaml' ci_access: projects: - id: group/application ``` **GitLab Deployment Example:** ```yaml # .gitlab-ci.yml deploy: stage: deploy script: - kubectl apply -f k8s/ environment: name: production kubernetes: namespace: prod deployment_tier: production auto_stop_in: never ``` --- ## 4. Container Registry Comparison ### Harbor (Traditional Stack) **Features:** - ✅ Trivy vulnerability scanning (built-in) - ✅ Image signing (Notary/Cosign) - ✅ Replication policies - ✅ Excellent RBAC (project-based) - ✅ Webhook integration - ✅ Audit logging - ✅ Robot accounts for CI/CD - ❌ Separate system to manage - ❌ External authentication setup - 📊 8GB RAM requirement **Harbor Policy Example:** ```yaml # CVE blocking policy severity_threshold: HIGH scan_on_push: true prevent_vulnerable_images: true # Replication to DR site replication: - name: dr-sync destination: https://harbor-dr.company.com trigger: event_based filters: - type: name value: "prod/**" ``` ### GitLab Container Registry **Features:** - ✅ Native integration (zero config) - ✅ Automatic authentication from CI - ✅ Container scanning built-in - ✅ Cleanup policies - ✅ Deploy tokens - ✅ Integrated с GitLab UI - ⚠️ No image signing (use external tool) - ⚠️ Basic replication capabilities - ⚠️ Less granular RBAC than Harbor - 📊 Included in GitLab footprint **GitLab Registry Usage:** ```yaml # .gitlab-ci.yml - automatic registry auth build_image: stage: build script: # $CI_REGISTRY, $CI_REGISTRY_USER, $CI_REGISTRY_PASSWORD # automatically available - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA # Container scanning runs automatically container_scanning: stage: test variables: CS_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA ``` --- ## 5. Security & Compliance Comparison ### Traditional Stack Security **Security Tools:** - Jenkins: OWASP Dependency Check plugin - External SAST: SonarQube (separate instance) - Harbor: Trivy scanning - Manual secret detection - External DAST tools **Compliance:** - ✅ Audit trail via multiple systems - ⚠️ Requires aggregation for reporting - ⚠️ Complex credential management - ⚠️ Multiple security scanning tools to maintain **Traditional Stack Audit Trail:** ``` Gitea logs: Who committed what Jenkins logs: Which builds ran Harbor logs: Which images pushed/pulled ArgoCD logs: What deployed where → Requires log aggregation for complete picture → 4 separate systems to audit ``` ### GitLab Integrated Security **Built-in Security Scanning:** ```yaml # Automatic in GitLab - no configuration needed include: - template: Security/SAST.gitlab-ci.yml - template: Security/Dependency-Scanning.gitlab-ci.yml - template: Security/Container-Scanning.gitlab-ci.yml - template: Security/DAST.gitlab-ci.yml - template: Security/Secret-Detection.gitlab-ci.yml # Results automatically appear in Merge Requests # Block merges if vulnerabilities found ``` **Security Features:** - ✅ SAST (20+ languages) - ✅ DAST (dynamic analysis) - ✅ Dependency scanning - ✅ Container scanning - ✅ Secret detection - ✅ License compliance - ✅ Security dashboard (unified view) - ✅ Vulnerability management - ⚠️ Some features require Premium tier **GitLab Compliance:** - ✅ Unified audit trail (single database) - ✅ Compliance frameworks (PCI DSS, SOC 2, GDPR templates) - ✅ Separation of duties policies - ✅ Audit events API - ✅ External audit logging - ✅ Signed commits verification - ✅ Required approvals by role **Compliance Comparison:** | Feature | Traditional Stack | GitLab | |---------|-------------------|--------| | Unified audit trail | ❌ (4 systems) | ✅ (single DB) | | Automated compliance reporting | ⚠️ (requires scripting) | ✅ (built-in) | | Security scanning integration | ⚠️ (external tools) | ✅ (native) | | Vulnerability tracking | ⚠️ (multiple systems) | ✅ (unified dashboard) | | Compliance frameworks | ❌ | ✅ (templates) | | Secret management | ⚠️ (Jenkins credentials + K8s secrets) | ✅ (CI/CD variables + K8s integration) | --- ## 6. Operational Complexity Analysis ### Team Workflow Comparison **Traditional Stack Daily Operations:** ``` Developer workflow: 1. Push code to Gitea 2. Check Jenkins for build status (different UI) 3. Review SonarQube report (different UI) 4. Check Harbor for image scan (different UI) 5. Monitor ArgoCD for deployment (different UI) 6. Check each system's logs separately DevOps workflow: - Maintain 4 systems (updates, backups, monitoring) - Manage 4 authentication configurations - Monitor 4 separate log streams - Coordinate updates across systems - Troubleshoot integration issues ``` **GitLab Daily Operations:** ``` Developer workflow: 1. Push code to GitLab 2. Single UI shows: - Build status - Security scan results - Image status - Deployment status - All logs in one place DevOps workflow: - Maintain 1 system - Single authentication source - Unified log aggregation - Simple updates (coordinated releases) - No integration troubleshooting ``` ### Maintenance Burden | Task | Traditional Stack | GitLab | |------|-------------------|--------| | **System updates** | 4 separate updates, test integrations | Single coordinated update | | **Backup strategy** | 4 databases, configs, secrets | 1 database, unified config | | **LDAP changes** | Update 4 configurations | Update once | | **Certificate rotation** | 4 SSL certificates | 1 SSL certificate | | **Log monitoring** | 4 log sources to aggregate | Single log source | | **Security patching** | Coordinate 4 systems | Single patch cycle | | **Onboarding new team member** | 4 system accesses, 4 trainings | 1 access, 1 training | ### Resource Requirements **Traditional Stack Infrastructure:** ``` Gitea server: 2 vCPU, 0.5GB RAM, 50GB disk Jenkins master: 4 vCPU, 8GB RAM, 100GB disk Jenkins agents: 8 vCPU, 16GB RAM, 200GB disk (2x agents) Harbor: 4 vCPU, 8GB RAM, 500GB disk ArgoCD: 2 vCPU, 2GB RAM, 10GB disk PostgreSQL: 4 vCPU, 8GB RAM, 100GB disk Total: 24 vCPU, 42.5GB RAM, 960GB disk Systems to manage: 6 separate services ``` **GitLab Infrastructure:** ``` GitLab instance: 8 vCPU, 8GB RAM, 500GB disk GitLab Runners: 8 vCPU, 16GB RAM, 200GB disk (2x runners) PostgreSQL: 4 vCPU, 4GB RAM, 100GB disk Total: 20 vCPU, 28GB RAM, 800GB disk Systems to manage: 2 services (GitLab + Runners) ``` **Analysis:** - GitLab uses 15-35% less total resources - 66% fewer systems to manage - Simpler architecture despite similar capabilities --- ## 7. Cost Analysis ### Direct Costs (10-user team) **Traditional Stack (All Open Source):** ``` Gitea: MIT License - $0 Jenkins: MIT License - $0 Harbor: Apache 2.0 - $0 ArgoCD: Apache 2.0 - $0 Total licensing: $0/year ``` **GitLab Options:** ``` GitLab CE: MIT License - $0/year GitLab Premium: Commercial License - $29/user/month = $3,480/year GitLab Ultimate: Commercial License - $99/user/month = $11,880/year ``` ### Indirect Costs **Personnel Time (Annual Estimates):** | Activity | Traditional Stack | GitLab CE | Savings | |----------|-------------------|-----------|---------| | Initial setup & configuration | 80 hours | 20 hours | 60 hours | | Monthly maintenance | 40 hours | 10 hours | 30 hours/month | | System updates | 32 hours | 8 hours | 24 hours | | Troubleshooting integrations | 60 hours | 5 hours | 55 hours | | Security patching | 24 hours | 6 hours | 18 hours | | User onboarding/training | 40 hours | 15 hours | 25 hours | | **Annual total** | **476 hours** | **124 hours** | **352 hours** | **At $100/hour DevOps rate:** - Traditional stack: $47,600/year - GitLab: $12,400/year - **Savings: $35,200/year** ### Total Cost of Ownership (3 Years) **Traditional Stack:** ``` Year 1: Setup (80h) + Operations (356h) = $43,600 Year 2-3: Operations only = $35,600/year × 2 = $71,200 3-year TCO: $114,800 ``` **GitLab CE (Free):** ``` Year 1: Setup (20h) + Operations (104h) = $12,400 Year 2-3: Operations only = $11,000/year × 2 = $22,000 3-year TCO: $34,400 Savings vs Traditional: $80,400 (70% reduction) ``` **GitLab Premium ($3,480/year licensing):** ``` Year 1: Setup + Operations + License = $15,880 Year 2-3: Operations + License = $14,480/year × 2 = $28,960 3-year TCO: $44,840 Savings vs Traditional: $69,960 (61% reduction) Still cheaper despite licensing costs! ``` --- ## 8. Decision Matrix ### When to Choose Traditional Stack ✅ **Best for:** - Teams with strong preferences for specific tools - Organizations prioritizing vendor independence - Environments with existing Jenkins/Harbor infrastructure - Teams requiring maximum CI/CD flexibility (Groovy scripting) - Limited budget AND sufficient DevOps resources - Compliance requirements for tool diversity - Very small teams (1-3 people) where Gitea's lightweight nature matters ❌ **Not recommended for:** - Teams lacking dedicated DevOps resources - Organizations prioritizing operational simplicity - Fast-growing teams needing quick onboarding - Projects requiring integrated security scanning - Limited infrastructure resources (tight RAM budgets) ### When to Choose GitLab ✅ **Best for:** - Teams wanting "one-stop-shop" solution - Organizations with limited DevOps staff - Projects requiring integrated security (SAST/DAST/etc) - Fast-growing teams (easy onboarding) - Compliance-heavy environments (unified audit) - Teams new to DevOps practices - Organizations willing to accept vendor lock-in for simplicity ❌ **Not recommended for:** - Teams with strong tool preferences (best-of-breed) - Environments with very limited RAM (< 8GB available) - Organizations requiring maximum vendor independence - Projects with complex CI/CD logic requiring Groovy - Existing heavy investment in Jenkins ecosystem ### Hybrid Approach Option **Possible middle ground:** ``` GitLab for Git + CI/CD + Registry + Security ↓ Deploy to ↓ ArgoCD for GitOps (if advanced features needed) ``` **Rationale:** - Consolidate Git/CI/CD/Registry/Security in GitLab - Keep ArgoCD for superior GitOps UI and multi-cluster management - Reduces from 4 systems to 2 - Balances simplicity with GitOps maturity --- ## 9. Migration Path Recommendations ### From Traditional Stack to GitLab **Phase 1: Git Migration (Week 1-2)** ``` 1. Export repos from Gitea 2. Import to GitLab 3. Update team Git remotes 4. Verify all repos accessible 5. Keep Gitea running read-only ``` **Phase 2: CI/CD Migration (Week 3-5)** ``` 1. Convert Jenkinsfiles to .gitlab-ci.yml - Translate Groovy pipelines to YAML - Enable GitLab Auto DevOps for simple projects 2. Setup GitLab Runners 3. Test pipelines in parallel with Jenkins 4. Gradually shift projects to GitLab CI 5. Enable security scanning (SAST/DAST) ``` **Phase 3: Registry Migration (Week 6)** ``` 1. Enable GitLab Container Registry 2. Migrate images from Harbor 3. Update CI/CD to push to GitLab Registry 4. Update K8s image pull secrets 5. Verify container scanning working ``` **Phase 4: GitOps Migration (Week 7-8)** ``` Option A: Keep ArgoCD - Point ArgoCD to GitLab repos - No other changes needed Option B: Migrate to GitLab Agent - Install GitLab Agent in K8s - Configure manifest synchronization - Test deployment automation - Decommission ArgoCD ``` **Phase 5: Decommission (Week 9-10)** ``` 1. Archive Gitea data 2. Shutdown Jenkins 3. Archive Harbor images 4. Optional: Decommission ArgoCD 5. Update documentation 6. Team training on GitLab workflows ``` ### Risk Mitigation **Parallel Running Period:** - Run both stacks for 2-4 weeks - Critical projects on old stack - New projects on GitLab - Gradual migration reduces risk **Rollback Plan:** - Keep traditional stack running but idle - Document rollback procedures - Test rollback before full decommission - Maintain for 1-2 months after migration --- ## 10. Final Recommendation ### For Most FinTech Organizations: **GitLab CE or Premium** **Reasoning:** 1. **Operational Efficiency:** 70% reduction in operational overhead justifies any learning curve 2. **Security Integration:** Built-in SAST/DAST/scanning worth more than external tools cost 3. **Compliance:** Unified audit trail significantly simplifies regulatory reporting 4. **Team Velocity:** Single UI accelerates development workflow 5. **TCO:** Even with Premium licensing, 60%+ cheaper over 3 years **Specific Recommendation:** - **Start with GitLab CE (free)** - evaluate for 3-6 months - **Upgrade to Premium** if need: - Advanced approval rules - Code owners - Merge trains - Enhanced compliance features - **Keep ArgoCD** if multi-cluster GitOps UI critical ### Exception Cases for Traditional Stack Consider traditional stack if: - Very small team (1-3) where Gitea lightweight matters - Strong existing Jenkins expertise/investment - Specific plugins/integrations not available in GitLab - Firm policy against vendor lock-in ### Hybrid Sweet Spot **Best of both worlds:** ``` GitLab (Git + CI/CD + Registry + Security) + ArgoCD (Advanced GitOps for K8s) = 2 systems instead of 4 = Reduces complexity while keeping GitOps maturity ``` --- ## Conclusion GitLab unified platform provides compelling advantages for most FinTech organizations: - Dramatically simpler operations - Lower total cost of ownership - Better security integration - Faster team onboarding Traditional multi-tool stack remains valid for: - Teams with specific tool requirements - Organizations prioritizing vendor independence - Environments with heavy Jenkins investment **The decision ultimately depends on:** 1. Team size and DevOps maturity 2. Available infrastructure resources 3. Vendor lock-in concerns 4. Compliance requirements 5. Existing tool investments For **most organizations**, operational simplicity of GitLab outweighs traditional stack flexibility. --- **Document Status:** Ready for Decision **Last Updated:** Январь 2026 **Next Review:** After 6 months evaluation **Decision Required From:** - [ ] Technical Architect - [ ] DevOps Lead - [ ] Security Team - [ ] CTO/Management