Skip to main content

NoETL Development Guide

This guide provides information about setting up a development environment for NoETL and contributing to the project.

Prerequisites

  • Python 3.11+ (3.12 recommended)
  • Git
  • Podman (for containerized local Kubernetes workflows)
  • kind and kubectl
  • noetl CLI

Setting Up a Development Environment

Use NoETL automation playbooks for a streamlined Kubernetes development workflow:

Prerequisites:

  • Podman
  • Kind
  • kubectl
  • NoETL CLI (noetl binary)
# Clone repository
git clone https://github.com/noetl/noetl.git
cd noetl

# Bootstrap complete environment (first time setup)
noetl run automation/setup/bootstrap.yaml

# Or use the shortcut
noetl run boot

Development Cycle:

# Make code changes...

# Rebuild and deploy in one command
noetl run automation/development/noetl.yaml --set action=redeploy

# Check status
noetl run automation/development/noetl.yaml --set action=status

# View logs
kubectl logs -f -n noetl -l app=noetl-server
kubectl logs -f -n noetl -l app=noetl-worker

Available Actions:

ActionDescription
buildBuild NoETL container image
loadLoad image into kind cluster
deployDeploy to Kubernetes
redeployFull cycle: build → load → deploy
statusShow pod/service status

For detailed playbook documentation, see Automation Playbooks.

Option 2: Local Python Development

1. Clone the Repository

git clone https://github.com/noetl/noetl.git
cd noetl

2. Create a Virtual Environment

Manually

# Create a virtual environment
python -m venv .venv

# Activate the virtual environment
# On Linux/macOS
source .venv/bin/activate
# On Windows
.venv\Scripts\activate

# Install uv package manager
pip install uv

# Install dependencies
uv pip install -e ".[dev]"

3. Install Dependencies

uv pip install -e ".[dev]"

Project Structure

The NoETL project has the following structure:

noetl/
├── bin/ # Scripts for development and deployment
├── catalog/ # Default catalog for playbooks
├── data/ # Data files for examples and tests
├── docs/ # Documentation
├── noetl/ # Main package
│ ├── agent/ # Agent for executing playbooks
│ ├── api/ # API for interacting with NoETL
│ ├── catalog/ # Catalog for managing playbooks
│ ├── cli/ # Command-line interface
│ ├── core/ # Core functionality
│ ├── tasks/ # Task implementations
│ ├── utils/ # Utility functions
│ └── workflow/ # Workflow engine
├── playbook/ # Example playbooks
├── tools/ # Developer tools and scripts (build, versioning); PyPI helpers under tools/pypi
├── tests/ # Tests
└── ui/ # Web UI

Development Workflow

The fastest way to iterate during development:

# After making code changes, rebuild and deploy
noetl run automation/development/noetl.yaml --set action=redeploy

# Check deployment status
noetl run automation/development/noetl.yaml --set action=status

# View logs
kubectl logs -f -n noetl -l app=noetl-server
kubectl logs -f -n noetl -l app=noetl-worker

# Access services
# NoETL API: http://localhost:30082/api/health

What redeploy does:

  1. Builds container image with timestamp tag using docker/noetl/dev/Dockerfile
  2. Loads image into kind cluster using kind load docker-image
  3. Applies Kubernetes manifests from ci/manifests/noetl/
  4. Restarts deployments and waits for pods to be ready

Local Python Development

Running Tests

# Run all tests
pytest

# Run tests with coverage
pytest --cov=noetl

# Run specific tests
pytest tests/test_agent.py

Running the Server Locally

# Run the server in development mode
noetl server --reload

Building the Package

# Build the package
python -m build

Code Style

NoETL follows the PEP 8 style guide. You can check your code style using:

# Check code style
flake8 noetl tests

Contributing

Submitting Changes

  1. Fork the repository
  2. Create a new branch for your changes
  3. Make your changes
  4. Run tests to ensure your changes don't break existing functionality
  5. Submit a pull request

Pull Request Process

  1. Ensure your code follows the project's style guide
  2. Update the documentation to reflect any changes
  3. Include tests for new functionality
  4. Ensure all tests pass
  5. Submit a pull request with a clear description of the changes

Building and Publishing to PyPI

Building the Package

# Build the package
python -m build

This will create distribution files in the dist/ directory.

Testing the Package

You can test the package locally before publishing:

# Install the package locally
pip install dist/noetl-*.whl

# Test the package
noetl --version

Publishing to PyPI

NoETL provides scripts for publishing to PyPI:

# Publish to TestPyPI
./tools/pypi/pypi_publish.sh --test <version>

# Publish to PyPI
./tools/pypi/pypi_publish.sh <version>

# Interactive publishing wizard
./tools/pypi/interactive_publish.sh

For more detailed instructions, see the PyPI Publishing Guide.

Container Build (Optional)

For local image debugging outside playbooks:

podman build --platform linux/arm64 -t local/noetl:dev -f docker/noetl/dev/Dockerfile .
kind load docker-image local/noetl:dev --name noetl

Debugging

Using the Debug Mode

You can run NoETL in debug mode to get more detailed logs:

# Run the agent in debug mode
noetl agent -f playbooks.yaml --debug

# Run the server in debug mode
noetl server --reload --debug

Using a Debugger

You can use a debugger like pdb or an IDE debugger to debug NoETL:

# Using pdb
python -m pdb -c continue noetl/agent.py -f playbooks.yaml

Next Steps