5.3: GitLab CI Configuration

What You'll Learn

  • Understand GitLab CI/CD architecture and capabilities
  • Learn how to integrate GitLab Duo AI features for intelligent development workflows
  • Explore advanced CI/CD patterns for embedded systems development with GitLab
  • Master GitLab's predictive test selection and AI-powered code review features

16.03.1 GitLab Duo AI - Overview

What is GitLab Duo?

GitLab Duo is GitLab's comprehensive AI-powered suite that integrates AI capabilities throughout the software development lifecycle. It leverages large language models (LLMs) to enhance developer productivity, code quality, and security.

Key Features

Code Suggestions

Description: AI-powered code completion and generation similar to GitHub Copilot.

Capabilities:

  • Real-time code completions as you type
  • Multi-line code suggestions
  • Context-aware recommendations based on your codebase
  • Support for multiple programming languages
  • Function and method generation from comments

How to Enable:

  1. Prerequisites:

    • GitLab Ultimate (SaaS or Self-managed 16.1+)
    • Supported IDE with GitLab extension:
      • VS Code: GitLab Workflow extension
      • JetBrains IDEs: GitLab plugin
      • Neovim: gitlab.vim plugin
  2. For SaaS (GitLab.com):

    • Navigate to your user Settings > Preferences > GitLab Duo
    • Toggle "Enable Code Suggestions"
    • Configure in your IDE extension settings
  3. For Self-Managed:

    • Admin must enable at instance level: Admin Area > Settings > General > GitLab Duo
    • Check "Enable GitLab Duo features"
    • Users then enable in their personal settings

Configuration:

// VS Code settings.json
{
  "gitlab.duoCodeSuggestions.enabled": true,
  "gitlab.duoCodeSuggestions.additionalLanguages": ["python", "javascript", "go", "c", "cpp"],
  "gitlab.duoCodeSuggestions.openTabsContext": true
}

Tier Availability (as of Q4 2024):

  • Free: No
  • Premium: No
  • Ultimate: Yes (SaaS and Self-managed 16.1+)

Note: GitLab Duo features and availability evolve rapidly. Verify current tier requirements at docs.gitlab.com.

GitLab Duo Chat

Description: Conversational AI assistant integrated into GitLab's interface for answering questions about code, explaining errors, and providing guidance.

Capabilities:

  • Answer questions about your code and projects
  • Explain code snippets and functions
  • Generate code based on natural language descriptions
  • Explain CI/CD errors and failures
  • Suggest fixes for security vulnerabilities
  • Generate test cases
  • Refactor code suggestions

Usage Examples:

# In GitLab interface or IDE:

# Ask about code
"Explain this function: [paste code]"

# Generate code
"Write a Python function to validate email addresses using regex"

# CI/CD help
"Why is my pipeline failing with error: 'permission denied'"

# Security
"How do I fix CVE-2023-12345 in my dependencies?"

# Testing
"Generate unit tests for this controller class"

Common Prompts:

# Code explanation
"Explain this function: [paste code]"

# Generate code
"Write a Python function to parse JSON and validate schema"

# Fix errors
"How do I fix this error: [paste error message]"

# Security
"Review this code for security vulnerabilities: [paste code]"

# Testing
"Generate unit tests for this class: [paste code]"

# Refactoring
"Refactor this code to improve performance: [paste code]"

# CI/CD help
"Why is my pipeline failing with 'permission denied'?"

# Documentation
"Generate JSDoc comments for this function"

Tier Availability:

  • Free: No
  • Premium: No
  • Ultimate: Yes (16.0+)

Vulnerability Resolution

Description: AI-powered automatic vulnerability detection and remediation suggestions.

Capabilities:

  • Automatic vulnerability explanation in security reports
  • AI-generated merge requests with vulnerability fixes
  • Context-aware remediation suggestions
  • Dependency upgrade recommendations
  • Security best practices guidance

Configuration in .gitlab-ci.yml:

include:
  - template: Security/SAST.gitlab-ci.yml
  - template: Security/Dependency-Scanning.gitlab-ci.yml
  - template: Security/Secret-Detection.gitlab-ci.yml
  - template: Security/Container-Scanning.gitlab-ci.yml

variables:
  SAST_EXCLUDED_PATHS: "spec, test, tests, tmp"
  SECURE_LOG_LEVEL: "info"

Usage Workflow:

  1. Security scan runs in pipeline
  2. Vulnerabilities detected in security dashboard
  3. AI explains vulnerability impact
  4. AI suggests remediation code
  5. Create auto-generated MR with fix

How to Use:

  • Navigate to Security & Compliance > Vulnerability Report
  • Select a vulnerability
  • Click "Resolve with AI" or "Create merge request"

16.03.2 AI-Powered Code Review

Suggested Reviewers

Description: AI recommends the most appropriate reviewers based on code changes, file history, and expertise.

Configuration:

# .gitlab/CODEOWNERS
# Define code ownership patterns

# Backend team
*.rb @backend-team
/app/models/ @database-experts

# Frontend team
*.vue @frontend-team
*.js @javascript-experts

# DevOps
.gitlab-ci.yml @devops-team
/config/ @infrastructure

# Embedded Systems
*.c @embedded-team
*.h @embedded-team
/firmware/ @firmware-experts

How to Enable:

  1. Navigate to Project Settings > Merge Requests
  2. Enable "Suggested reviewers" (Ultimate only)
  3. Ensure CODEOWNERS file is configured

Code Review Summary

Description: AI-generated summaries of merge request changes.

Example Output:

AI Summary:
This merge request introduces a new authentication middleware for API endpoints.
Key changes:
- Added JWT token validation in auth/middleware.py
- Updated user model to include token expiry
- Modified 5 API endpoints to require authentication
- Breaking change: Previously public endpoints now require auth tokens

Areas for review:
- Security: Verify token validation logic
- Backwards compatibility: Check impact on existing API clients
- Testing: Ensure adequate test coverage for auth flows

AI-Generated Merge Request Descriptions

How to Use:

  1. Create new merge request
  2. Click "Generate description with AI" button
  3. Review and edit generated content
  4. Save merge request

Smart Merge Request Template:

# .gitlab/merge_request_templates/feature.md

## AI-Generated Summary
<!-- AI will populate this section -->

## Type of Change
- [ ] New feature
- [ ] Bug fix
- [ ] Breaking change
- [ ] Documentation update

## Changes Made
<!-- AI-generated change list -->

## Testing
<!-- AI-suggested test scenarios -->

## Checklist
- [ ] Code follows style guidelines
- [ ] Tests added/updated
- [ ] Documentation updated
- [ ] Security considerations reviewed

16.03.3 Predictive Test Selection

Overview

Predictive Test Selection uses AI/ML to intelligently select which tests to run based on code changes, dramatically reducing pipeline execution time while maintaining code quality.

Benefits

  • Reduces pipeline time by 50-90%
  • Maintains code quality and test coverage
  • Faster feedback for developers
  • Reduced CI/CD costs

Configuration

Prerequisites:

  • GitLab Ultimate (15.2+)
  • Supported testing frameworks:
    • Ruby (RSpec)
    • Python (pytest)
    • JavaScript (Jest)
    • Go (go test)

Python (pytest) Example

test:predictive:
  stage: test
  image: python:3.11
  before_script:
    - pip install pytest pytest-cov
  script:
    - pytest --junitxml=junit.xml --cov=. --cov-report=xml
  variables:
    PREDICTIVE_TEST_SELECTION: "true"
  artifacts:
    reports:
      junit: junit.xml
      coverage_report:
        coverage_format: cobertura
        path: coverage.xml
  rules:
    - if: '$CI_MERGE_REQUEST_ID'

Ruby (RSpec) Example

test:predictive:
  stage: test
  image: ruby:3.2
  before_script:
    - bundle install
  script:
    - bundle exec rspec --format RspecJunitFormatter --out junit.xml
  variables:
    PREDICTIVE_TEST_SELECTION: "true"
  artifacts:
    reports:
      junit: junit.xml
  rules:
    - if: '$CI_MERGE_REQUEST_ID'

JavaScript (Jest) Example

test:predictive:
  stage: test
  image: node:20
  before_script:
    - npm ci
  script:
    - npm test -- --ci --coverage --reporters=default --reporters=jest-junit
  variables:
    PREDICTIVE_TEST_SELECTION: "true"
  artifacts:
    reports:
      junit: junit.xml
      coverage_report:
        coverage_format: cobertura
        path: coverage/cobertura-coverage.xml
  rules:
    - if: '$CI_MERGE_REQUEST_ID'

Advanced Configuration

variables:
  # Enable predictive test selection
  PREDICTIVE_TEST_SELECTION: "true"

  # Minimum confidence threshold (0-100)
  PTS_CONFIDENCE_THRESHOLD: "70"

  # Run full suite on main branch
  PTS_FULL_SUITE_ON_DEFAULT: "true"

test:predictive:
  stage: test
  rules:
    - if: '$CI_MERGE_REQUEST_ID'  # Only in MRs
      variables:
        PREDICTIVE_TEST_SELECTION: "true"
    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'  # Full suite on main
      variables:
        PREDICTIVE_TEST_SELECTION: "false"
  script:
    - |
      if [ "$PREDICTIVE_TEST_SELECTION" = "true" ]; then
        echo "Running predictive test selection..."
        gitlab-pts-runner
      else
        echo "Running full test suite..."
        pytest tests/
      fi
  artifacts:
    reports:
      junit: junit.xml
    paths:
      - coverage/

Best Practices

  1. Gradual Rollout: Start with non-critical branches
  2. Monitor Coverage: Ensure test coverage remains high
  3. Full Suite Schedule: Run complete tests periodically
  4. Confidence Threshold: Adjust based on risk tolerance
  5. Training Period: Allow 2-4 weeks for model training

Performance Benchmarks

Typical time savings:

  • Small projects (< 1000 tests): 40-60% reduction
  • Medium projects (1000-5000 tests): 60-80% reduction
  • Large projects (> 5000 tests): 70-90% reduction

16.03.4 Root Cause Analysis with AI

Pipeline Failure Analysis

Capability: AI analyzes failed pipeline jobs and explains the root cause.

How It Works:

  1. Pipeline job fails
  2. Click "Explain with AI" in job log
  3. AI analyzes error messages, logs, and context
  4. Provides explanation and suggested fixes

Enhanced Error Reporting

# Enhanced error reporting for AI analysis
variables:
  FF_USE_ENHANCED_ERROR_MESSAGES: "true"
  CI_DEBUG_TRACE: "false"  # Enable only when needed

# Job with AI-friendly error handling
build:
  stage: build
  script:
    - echo "Starting build..."
    - make build || handle_error "Build failed"
  after_script:
    - |
      if [ $CI_JOB_STATUS == "failed" ]; then
        echo "=== AI Analysis Context ==="
        echo "Job: $CI_JOB_NAME"
        echo "Stage: $CI_JOB_STAGE"
        echo "Commit: $CI_COMMIT_SHORT_SHA"
        env | grep -E '^CI_|^GITLAB_'
      fi
  artifacts:
    when: on_failure
    paths:
      - build.log
      - error.log
    expire_in: 1 week

Structured Error Reporting

# Provide structured error information for better AI analysis
test:unit:
  stage: test
  script:
    - |
      set -e
      echo "Running unit tests..."
      pytest tests/ \
        --junitxml=junit.xml \
        --cov=src \
        --cov-report=xml \
        --cov-report=term \
        -v || {
          echo "ERROR_TYPE: Test Failure"
          echo "ERROR_COMPONENT: Unit Tests"
          echo "ERROR_STAGE: Test Execution"
          exit 1
        }
  artifacts:
    when: always
    reports:
      junit: junit.xml
      coverage_report:
        coverage_format: cobertura
        path: coverage.xml

Example AI Analysis

Failed Job Log:

$ bundle install
Fetching gem metadata from https://rubygems.org/
Could not find compatible versions

Because rails >= 7.1.0 depends on activerecord = 7.1.0
  and Gemfile depends on rails ~> 7.1.0,
  activerecord = 7.1.0 is required.

So, because Gemfile depends on activerecord = 7.0.8,
  version solving has failed.

AI Analysis:

Root Cause: Dependency Version Conflict

The pipeline failed due to incompatible gem versions in your Gemfile.

Issue: You're requiring Rails 7.1.0 which includes activerecord 7.1.0,
but your Gemfile also explicitly specifies activerecord 7.0.8.

Solution:
1. Remove the explicit activerecord version from Gemfile:
   gem 'rails', '~> 7.1.0'  # Keep this
   # Remove: gem 'activerecord', '7.0.8'

2. Or, if you need Rails 7.0:
   gem 'rails', '~> 7.0.8'
   gem 'activerecord', '7.0.8'

3. Run: bundle update rails activerecord

16.03.5 GitLab CI/CD for Embedded Systems

Cross-Compilation Support

ARM Embedded Build

# .gitlab-ci.yml for embedded ARM project
variables:
  CROSS_COMPILE: "arm-none-eabi-"
  TARGET_ARCH: "cortex-m4"
  BUILD_TYPE: "release"

stages:
  - build
  - test
  - flash
  - release

# Build firmware for ARM Cortex-M4
build:firmware:
  stage: build
  image: arm/toolchain:latest
  script:
    - echo "Building for ${TARGET_ARCH}..."
    - mkdir -p build
    - cd build
    - cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE}
            -DCMAKE_TOOLCHAIN_FILE=../cmake/arm-toolchain.cmake
            ..
    - make -j$(nproc)
    - ${CROSS_COMPILE}size firmware.elf
    - ${CROSS_COMPILE}objcopy -O ihex firmware.elf firmware.hex
    - ${CROSS_COMPILE}objcopy -O binary firmware.elf firmware.bin
  artifacts:
    paths:
      - build/firmware.elf
      - build/firmware.hex
      - build/firmware.bin
    expire_in: 1 month
  tags:
    - embedded
    - arm

Multi-Platform Embedded Builds

# Build for multiple MCU targets
.build_template:
  stage: build
  image: platformio/platformio:latest
  script:
    - platformio run --environment ${PIO_ENV}
    - pio test --environment ${PIO_ENV}
  artifacts:
    paths:
      - .pio/build/${PIO_ENV}/firmware.*
    expire_in: 1 week

build:esp32:
  extends: .build_template
  variables:
    PIO_ENV: "esp32dev"
  tags:
    - embedded

build:stm32:
  extends: .build_template
  variables:
    PIO_ENV: "stm32f4"
  tags:
    - embedded

build:arduino:
  extends: .build_template
  variables:
    PIO_ENV: "uno"
  tags:
    - embedded

Hardware-in-the-Loop (HIL) Testing

# HIL testing with physical hardware
test:hardware:
  stage: test
  needs:
    - build:firmware
  script:
    - echo "Flashing device..."
    - openocd -f interface/stlink.cfg
              -f target/stm32f4x.cfg
              -c "program build/firmware.elf verify reset exit"
    - sleep 2
    - echo "Running hardware tests..."
    - python3 tests/hardware_test.py --port /dev/ttyUSB0
  artifacts:
    reports:
      junit: test-results.xml
    paths:
      - test-logs/
  tags:
    - embedded
    - hardware-attached
  only:
    - merge_requests
    - main

Firmware Flashing Pipeline

# Automated firmware deployment
flash:development:
  stage: flash
  needs:
    - build:firmware
    - test:hardware
  script:
    - |
      # Flash via J-Link
      JLinkExe -device STM32F407VG \
               -if SWD \
               -speed 4000 \
               -autoconnect 1 \
               -CommandFile flash_commands.jlink
  environment:
    name: development-board
    action: prepare
  tags:
    - embedded
    - flasher
  rules:
    - if: '$CI_COMMIT_BRANCH == "develop"'
      when: manual

flash:production:
  stage: flash
  needs:
    - build:firmware
  script:
    - |
      # Production flashing with verification
      st-flash --reset write build/firmware.bin 0x08000000
      st-flash --verify build/firmware.bin 0x08000000
  environment:
    name: production
    action: prepare
  tags:
    - embedded
    - production-flasher
  rules:
    - if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/'
      when: manual
  allow_failure: false

Static Analysis for Embedded Code

# MISRA C compliance checking
analyze:misra:
  stage: test
  image: cppcheck:latest
  script:
    - |
      cppcheck --enable=all \
               --addon=misra.json \
               --suppress=missingIncludeSystem \
               --xml --xml-version=2 \
               src/ 2> cppcheck-report.xml
    - python3 cppcheck-htmlreport.py \
               --file=cppcheck-report.xml \
               --report-dir=cppcheck-html \
               --source-dir=src
  artifacts:
    paths:
      - cppcheck-html/
      - cppcheck-report.xml
    reports:
      codequality: cppcheck-report.xml
  tags:
    - embedded

# Code coverage for embedded tests
coverage:embedded:
  stage: test
  image: gcc:latest
  script:
    - gcc -fprofile-arcs -ftest-coverage -o test_firmware test/*.c src/*.c
    - ./test_firmware
    - gcov src/*.c
    - lcov --capture --directory . --output-file coverage.info
    - lcov --remove coverage.info '/usr/*' --output-file coverage.info
    - genhtml coverage.info --output-directory coverage-html
  artifacts:
    paths:
      - coverage-html/
    reports:
      coverage_report:
        coverage_format: cobertura
        path: coverage.xml
  coverage: '/lines......: \d+\.\d+\%/'
  tags:
    - embedded

Complete Embedded CI/CD Pipeline

# Complete embedded CI/CD pipeline
workflow:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
    - if: '$CI_COMMIT_TAG'

variables:
  GIT_SUBMODULE_STRATEGY: recursive
  FIRMWARE_VERSION: "${CI_COMMIT_TAG:-dev-$CI_COMMIT_SHORT_SHA}"

stages:
  - lint
  - build
  - test
  - simulate
  - hardware_test
  - deploy
  - release

# Linting
lint:code:
  stage: lint
  image: embedded-tools:latest
  script:
    - clang-format --dry-run --Werror src/*.c include/*.h
    - cppcheck --enable=warning,style src/
  tags:
    - embedded

# Build for multiple targets
build:debug:
  stage: build
  image: arm/toolchain:latest
  script:
    - cmake -B build -DCMAKE_BUILD_TYPE=Debug
    - cmake --build build
    - size build/firmware.elf
  artifacts:
    paths:
      - build/
    expire_in: 1 day
  tags:
    - embedded

build:release:
  stage: build
  image: arm/toolchain:latest
  script:
    - cmake -B build -DCMAKE_BUILD_TYPE=Release
    - cmake --build build
    - arm-none-eabi-objcopy -O ihex build/firmware.elf build/firmware.hex
  artifacts:
    paths:
      - build/firmware.*
    expire_in: 1 month
  tags:
    - embedded
  only:
    - tags
    - main

# Unit tests (host machine)
test:unit:
  stage: test
  image: gcc:latest
  script:
    - cmake -B build_test -DBUILD_TESTS=ON
    - cmake --build build_test
    - cd build_test && ctest --output-on-failure
  artifacts:
    reports:
      junit: build_test/test-results.xml
  tags:
    - embedded

# QEMU simulation
simulate:qemu:
  stage: simulate
  image: qemu:latest
  needs:
    - build:debug
  script:
    - qemu-system-arm -M lm3s6965evb
                      -nographic
                      -kernel build/firmware.elf
                      -monitor null
                      -serial stdio | tee qemu-output.log
    - python3 tests/validate_qemu_output.py qemu-output.log
  artifacts:
    paths:
      - qemu-output.log
  tags:
    - embedded
    - qemu

# Hardware-in-the-loop testing
test:hardware:
  stage: hardware_test
  needs:
    - build:release
  script:
    - ./scripts/flash_device.sh build/firmware.hex
    - python3 tests/hardware_tests.py --device /dev/ttyUSB0
  artifacts:
    reports:
      junit: hardware-test-results.xml
  tags:
    - embedded
    - hardware
  only:
    - merge_requests
    - main

# OTA update deployment
deploy:ota:
  stage: deploy
  needs:
    - build:release
    - test:hardware
  script:
    - |
      # Generate OTA update package
      python3 tools/generate_ota_package.py \
        --firmware build/firmware.bin \
        --version ${FIRMWARE_VERSION} \
        --output ota-package.zip

      # Upload to OTA server
      curl -X POST \
        -H "Authorization: Bearer ${OTA_API_TOKEN}" \
        -F "file=@ota-package.zip" \
        -F "version=${FIRMWARE_VERSION}" \
        https://ota.example.com/api/upload
  environment:
    name: production-devices
    url: https://ota.example.com/releases/${FIRMWARE_VERSION}
  tags:
    - embedded
  only:
    - tags

# Create release artifacts
release:package:
  stage: release
  image: alpine:latest
  needs:
    - build:release
  script:
    - |
      mkdir -p release
      cp build/firmware.elf release/
      cp build/firmware.hex release/
      cp build/firmware.bin release/

      # Generate release notes
      echo "Firmware Version: ${FIRMWARE_VERSION}" > release/README.txt
      echo "Build Date: $(date)" >> release/README.txt
      echo "Git Commit: ${CI_COMMIT_SHA}" >> release/README.txt

      # Create archive
      tar -czf firmware-${FIRMWARE_VERSION}.tar.gz release/
  artifacts:
    paths:
      - firmware-*.tar.gz
    expire_in: never
  tags:
    - embedded
  only:
    - tags
  release:
    tag_name: '$CI_COMMIT_TAG'
    description: 'Firmware release $CI_COMMIT_TAG'
    assets:
      links:
        - name: 'Firmware Package'
          url: '$CI_PROJECT_URL/-/jobs/$CI_JOB_ID/artifacts/file/firmware-${FIRMWARE_VERSION}.tar.gz'

16.03.6 GitLab Runner Configuration for Embedded

Runner Configuration for Hardware Access

config.toml for Embedded Runner:

[[runners]]
  name = "embedded-runner-1"
  url = "https://gitlab.com/"
  token = "RUNNER_TOKEN"
  executor = "docker"

  [runners.docker]
    image = "arm/toolchain:latest"
    privileged = true  # Required for hardware access
    devices = ["/dev/ttyUSB0:/dev/ttyUSB0"]  # USB device passthrough
    volumes = ["/dev/bus/usb:/dev/bus/usb"]  # USB bus access

  [runners.custom_build_dir]
    enabled = true

  [[runners.docker.services]]
    name = "docker:dind"

[[runners]]
  name = "hardware-test-runner"
  url = "https://gitlab.com/"
  token = "RUNNER_TOKEN"
  executor = "shell"  # Shell executor for direct hardware access

  [runners.cache]
    Type = "s3"
    Shared = true

Hardware Requirements

Recommended Setup:

  1. GitLab Runner Host:

    • Linux machine with USB access
    • Docker support
    • Hardware debugger connection (J-Link, ST-Link, etc.)
  2. Connected Hardware:

    • Development boards for testing
    • Hardware debuggers
    • USB-to-Serial adapters
  3. Network Setup:

    • Access to GitLab instance
    • OTA update server access
    • Artifact storage

16.03.7 Best Practices for GitLab CI/CD

Cost Optimization

# Reduce CI/CD minutes
variables:
  PREDICTIVE_TEST_SELECTION: "true"

# Run expensive jobs only when needed
rules:
  - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
  - if: '$CI_MERGE_REQUEST_ID'
    changes:
      - src/**/*

# Use caching effectively
cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - .npm/
    - node_modules/
    - .pip-cache/

Security Best Practices

  1. Secrets Management:

    • Use GitLab CI/CD variables for secrets
    • Enable protected variables for sensitive data
    • Use masked variables to hide values in logs
  2. Dependency Scanning:

    • Include security scanning templates
    • Review vulnerability reports
    • Use AI-powered remediation suggestions
  3. Container Security:

    • Scan Docker images for vulnerabilities
    • Use minimal base images
    • Keep dependencies updated

Embedded Systems Best Practices

  1. Version Control:

    • Tag releases with semantic versioning
    • Track toolchain versions
    • Version hardware configurations
  2. Build Reproducibility:

    • Use Docker images with fixed toolchain versions
    • Lock dependency versions
    • Document build environment
  3. Testing Strategy:

    • Unit tests on host machine
    • Integration tests in QEMU/simulator
    • HIL tests on real hardware
    • Periodic full regression on hardware
  4. Artifact Management:

    • Store firmware binaries long-term
    • Include debug symbols separately
    • Generate checksums/signatures

16.03.8 Feature Availability Matrix

Feature Free Premium Ultimate Min Version
Basic CI/CD [OK] [OK] [OK] All
Code Suggestions [X] [X] [OK] 16.1+
Duo Chat [X] [X] [OK] 16.0+
Predictive Tests [X] [X] [OK] 15.2+
AI Code Review [X] [X] [OK] 16.0+
Root Cause Analysis [X] [X] [OK] 16.3+
Security Scanning [X] Basic Full All
Vulnerability AI [X] [X] [OK] 16.0+
Embedded Systems CI/CD [OK] [OK] [OK] All
Advanced Security Scanning [X] [OK] [OK] All

Self-Managed vs SaaS Differences

Feature SaaS (GitLab.com) Self-Managed
Code Suggestions Available (16.1+) Requires 16.1+, AI Gateway setup
Duo Chat Available (16.0+) Requires 16.0+, may need proxy config
Vulnerability Resolution Available Requires Ultimate + Security scanners
Setup Complexity Minimal Requires AI Gateway, network access
Data Privacy Processed by GitLab Can be kept on-premises with airgapped setup
Cost Included in Ultimate Ultimate + add-on seat license
Hardware Access Limited (cloud runners) Full (local runners)
Hardware Debuggers Not supported Fully supported

Summary

GitLab CI/CD provides a comprehensive platform for automating software development workflows, with powerful AI capabilities through GitLab Duo. From AI-powered code suggestions and intelligent code review to predictive test selection and root cause analysis, GitLab enables teams to build more efficiently and with higher quality. The platform's robust support for embedded systems development, including cross-compilation, hardware-in-the-loop testing, and firmware deployment, makes it an excellent choice for embedded systems projects. By leveraging GitLab's AI features and following best practices for security, cost optimization, and testing, development teams can significantly enhance productivity while maintaining high code quality standards.

References