Skip to main content

Pydantic models for parsing and validating GitLab CI/CD YAML configuration files

Project description

Pydantic GitLab

PyPI version Python Test License: MIT

A modern Python library for parsing and validating GitLab CI YAML files using Pydantic dataclasses.

Features

  • ✅ Full support for GitLab CI YAML syntax
  • 🔍 Comprehensive validation with helpful error messages
  • 📦 Type-safe dataclasses for all GitLab CI structures
  • 🐍 Python 3.9+ support
  • 📝 Excellent IDE support with autocompletion

Installation

pip install pydantic-gitlab

Quick Start

import yaml
from pydantic_gitlab import GitLabCI

# Load your .gitlab-ci.yml file
with open(".gitlab-ci.yml", "r") as f:
    yaml_content = yaml.safe_load(f)

# Parse and validate
try:
    ci_config = GitLabCI(**yaml_content)
    print("✅ Valid GitLab CI configuration!")
    
    # Access configuration
    for job_name, job in ci_config.jobs.items():
        print(f"Job: {job_name}")
        print(f"  Stage: {job.stage}")
        print(f"  Script: {job.script}")
        
except Exception as e:
    print(f"❌ Invalid configuration: {e}")

Supported GitLab CI Features

  • ✅ Jobs with all keywords (script, image, services, artifacts, etc.)
  • ✅ Stages and dependencies
  • ✅ Rules and conditions
  • ✅ Variables (global and job-level)
  • ✅ Include configurations
  • ✅ Workflow rules
  • ✅ Caching
  • ✅ Artifacts and reports
  • ✅ Environments and deployments
  • ✅ Parallel jobs and matrix builds
  • ✅ Trigger jobs
  • ✅ Pages job

Example

from pydantic_gitlab import GitLabCI, GitLabCIJob, WhenType

# Create a job programmatically
build_job = GitLabCIJob(
    stage="build",
    script=["echo 'Building...'", "make build"],
    artifacts={
        "paths": ["dist/"],
        "expire_in": "1 week"
    }
)

# Create CI configuration
ci = GitLabCI(
    stages=["build", "test", "deploy"],
    variables={"DOCKER_DRIVER": "overlay2"}
)

# Add job to configuration
ci.add_job("build", build_job)

# Validate dependencies
errors = ci.validate_job_dependencies()
if errors:
    for error in errors:
        print(f"Error: {error}")

Why Pydantic GitLab?

Comparison with Plain YAML Parsing

Using plain YAML parsing:

import yaml

# Plain YAML - no validation, no type hints
with open(".gitlab-ci.yml") as f:
    config = yaml.safe_load(f)
    
# Risky - might fail at runtime
job_script = config["build"]["script"]  # KeyError?
job_image = config["build"]["image"]    # KeyError?

Using Pydantic GitLab:

from pydantic_gitlab import GitLabCI

# Type-safe with validation
with open(".gitlab-ci.yml") as f:
    data = yaml.safe_load(f)
ci = GitLabCI(**data)

# IDE autocompletion, type checking
if build_job := ci.get_job("build"):
    print(build_job.script)  # Guaranteed to exist
    print(build_job.image)   # Optional[str] - might be None

Benefits

  • 🛡️ Validation: Catch configuration errors before running pipelines
  • 🔍 Type Safety: Full type hints for better IDE support and fewer runtime errors
  • 📝 Documentation: Each field is documented with GitLab CI reference
  • 🚀 Productivity: Autocomplete for all GitLab CI keywords
  • 🧪 Testing: Easily create and validate CI configurations in tests

Development

Setup

# Clone the repository
git clone https://github.com/johnlepikhin/pydantic-gitlab.git
cd pydantic-gitlab

# Install in development mode
pip install -e ".[dev]"

# Install pre-commit hooks
pre-commit install

Running Tests

pytest

Code Quality

# Run linting
ruff check .

# Run type checking
mypy src

# Format code
ruff format .

License

MIT

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pydantic_gitlab-0.2.5.tar.gz (22.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pydantic_gitlab-0.2.5-py3-none-any.whl (30.8 kB view details)

Uploaded Python 3

File details

Details for the file pydantic_gitlab-0.2.5.tar.gz.

File metadata

  • Download URL: pydantic_gitlab-0.2.5.tar.gz
  • Upload date:
  • Size: 22.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.13

File hashes

Hashes for pydantic_gitlab-0.2.5.tar.gz
Algorithm Hash digest
SHA256 514a484a9026da4646ee552c6703ab3173cd38cf9cd75760feee32dfac2c201e
MD5 f56d772b2fab975d69c9294df01279a9
BLAKE2b-256 c1ba280586fed650a3d54c671374ec9a5297754074492e81a786f7fe1a37794e

See more details on using hashes here.

File details

Details for the file pydantic_gitlab-0.2.5-py3-none-any.whl.

File metadata

File hashes

Hashes for pydantic_gitlab-0.2.5-py3-none-any.whl
Algorithm Hash digest
SHA256 71b8370f6607743cfcb402ec82d9cf5565e1ac4e4c53ece252a0398598a64ba3
MD5 f875ab63a83b21a3ecabf71a5f6f4825
BLAKE2b-256 da2531143d069e5499fd1e8377ff907e364fe757998fffd9072844abe5343697

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page