CI/CD Integration

CI/CD Integration

Continuous Integration

# .github/workflows/ci.yml
name: CI
on: [push, pull_request]

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.11'
          
      - name: Install Composabl
        run: pip install composabl
        
      - name: Validate Simulators
        run: |
          for sim in simulators/*/; do
            composabl sim validate "$sim"
          done
          
      - name: Run Tests
        run: pytest tests/

Continuous Deployment

# .github/workflows/deploy.yml
name: Deploy
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.11'
          
      - name: Install Composabl
        run: pip install composabl
        
      - name: Set Token
        run: echo "${{ secrets.COMPOSABL_TOKEN }}" > ~/.composabl/token
        
      - name: Publish Components
        run: |
          # Publish simulators
          composabl sim publish ./simulators/reactor-sim/
          
          # Publish skills
          composabl skill publish ./skills/temperature-control/
          
          # Publish perceptors
          composabl perceptor publish ./perceptors/derivative-calc/

Scripting with CLI

#!/usr/bin/env python3
import subprocess
import json
import sys

def run_command(cmd):
    """Run CLI command and return output"""
    result = subprocess.run(
        cmd, 
        shell=True, 
        capture_output=True, 
        text=True
    )
    if result.returncode != 0:
        print(f"Error: {result.stderr}")
        sys.exit(1)
    return result.stdout.strip()

# Get simulator mappings
mappings_json = run_command(
    "composabl sim mappings --address localhost:1337"
)
mappings = json.loads(mappings_json)

# Extract sensor names
sensors = [
    s["name"] 
    for s in mappings["sensor_space"]["mappings"]
]

print(f"Found sensors: {sensors}")

# Create agent dynamically
agent_code = f"""
from composabl import Agent, Sensor

agent = Agent()
agent.add_sensors([
    {', '.join(f'Sensor("{s}", "", lambda obs: obs[{i}])' 
               for i, s in enumerate(sensors))}
])
"""

with open("dynamic_agent.py", "w") as f:
    f.write(agent_code)

# Train agent
run_command("composabl agent train dynamic_agent.py")

Last updated