Retour

17. OpenClaw en pratique : Construire un assistant de programmation IA

Cet article montre comment utiliser OpenClaw pour construire un assistant de programmation IA, intégrant des outils comme Claude Code et Codex pour la revue de code, les tests automatisés, l'intégration CI/CD et bien plus, afin d'améliorer l'efficacité de développement.

Pour OpenClaw v2026.2 | Nécessite l’installation des skills coding-agent, git-workflows, test-runner et un accès au dépôt de code du projet.

TL;DR: Revue de code : l’Agent analyse les changements de PR et génère un rapport de revue. Tests automatisés : "test-runner": {"frameworks": ["jest", "vitest"]}. Intégration CI/CD : Webhook recevant les événements GitHub/GitLab. Gestion multi-projets : "projects": {"frontend": {...}, "backend": {...}}. Commande principale : openclaw agent --message "Reviewer cette PR".

Objectifs pratiques

Construire un assistant de programmation IA capable de :

  1. Automatiser la revue de code
  2. Exécuter des tests et rapporter les résultats
  3. Générer la documentation du code
  4. S’intégrer au pipeline CI/CD
  5. Basculer entre les contextes de plusieurs projets

Installer les skills nécessaires

# Skills liés à la programmation
openclaw skill install coding-agent
openclaw skill install debug-pro
openclaw skill install git-workflows
openclaw skill install docker-essentials

# Skill de test
openclaw skill install test-runner

Automatisation de la revue de code

Configurer la revue de code

---
name: code-review-assistant
version: 1.0.0
description: Automated code review with OpenClaw
triggers:
  - code review
  - revue de code
  - review
  - PR review
---

# Code Review Assistant

Automate code review for pull requests.

## Features

- Review code changes
- Check for common issues
- Suggest improvements
- Generate review comments

## Review Checklist

1. **Code Quality**
   - Naming conventions
   - Code structure
   - Error handling

2. **Security**
   - SQL injection
   - XSS vulnerabilities
   - Secret exposure

3. **Performance**
   - N+1 queries
   - Memory leaks
   - Inefficient algorithms

4. **Best Practices**
   - DRY principle
   - SOLID principles
   - Design patterns

Scénario de revue de code

Utilisateur : Reviewer cette PR

Agent : D'accord, je review la PR #123...

[Récupération des informations de la PR]
[Analyse des changements de code]
[Vérification des problèmes potentiels]

## Rapport de revue PR #123

### Vue d'ensemble
- Branche : feature/user-search
- Changements : +156 -23
- Fichiers : 8

### Problèmes détectés

**Critique** (1) :
- 🚨 `auth.js:45` - Risque de stockage de mot de passe en clair

**Avertissements** (3) :
- ⚠️ `search.js:23` - Injection SQL potentielle
- ⚠️ `user.js:78` - Promise non gérée
- ⚠️ `utils.js:12` - API obsolète

**Suggestions** (5) :
- 💡 Envisager l'ajout de tests unitaires
- 💡 Utiliser des constantes au lieu de nombres magiques
- 💡 Suggérer l'ajout de limites d'erreur
- 💡 Envisager d'extraire des méthodes communes
- 💡 Suggérer l'ajout d'annotations de type

### Points positifs
- ✅ Bon nommage des fonctions
- ✅ Découpage modulaire approprié
- ✅ Commentaires pertinents

Voulez-vous que je génère les commentaires de revue ?

Tests automatisés

Configuration de l’exécution des tests

{
  "skills": {
    "test-runner": {
      "frameworks": ["jest", "vitest", "pytest"],
      "coverage": {
        "enabled": true,
        "threshold": 80
      },
      "reporting": {
        "format": "markdown",
        "output": "test-report.md"
      }
    }
  }
}

Scénario de test

Utilisateur : Exécuter les tests et rapporter les résultats

Agent : Exécution des tests en cours...

[Exécution des commandes de test]
[Collecte des résultats]
[Analyse de la couverture]

## Rapport de test

### Résultats des tests
- Total : 45 tests
- Réussis : 42 ✅
- Échoués : 2 ❌
- Ignorés : 1 ⏭️

### Tests échoués

**1. UserSearch.test.js**

AssertionError: expected [] to equal [{id: 1, name: ’test’}]

Suggestion : vérifier la connexion à la base de données ou les données mockées

**2. Auth.test.js**

Timeout: Async callback not invoked within 5000ms

Suggestion : augmenter le délai d'expiration ou vérifier la logique asynchrone

### Couverture

| Fichier | Instructions | Branches | Fonctions | Lignes |
|---------|-------------|----------|-----------|--------|
| auth.js | 85% | 78% | 90% | 85% |
| search.js | 72% | 65% | 80% | 70% |
| user.js | 90% | 85% | 95% | 90% |
| **Total** | **82%** | **76%** | **88%** | **82%** |

Voulez-vous que je corrige les tests échoués ?

Intégration CI/CD

Intégration GitHub Actions

# .github/workflows/openclaw-review.yml
name: OpenClaw Review

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Setup OpenClaw
        run: npm install -g openclaw@latest
        
      - name: Run Review
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          openclaw agent --message "Review PR #${{ github.event.pull_request.number }}" \
            --output review-comment.md
            
      - name: Post Comment
        uses: actions/github-script@v6
        with:
          script: |
            const fs = require('fs');
            const comment = fs.readFileSync('review-comment.md', 'utf8');
            await github.rest.issues.createComment({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.issue.number,
              body: comment
            });

Déploiement automatique

Utilisateur : Déployer sur staging

Agent : Déploiement en cours sur l'environnement de staging...

[Récupération du dernier code]
[Exécution des tests]
[Build du projet]
[Déploiement sur le serveur]

## Rapport de déploiement

### Informations de déploiement
- Environnement : staging
- Branche : main
- Commit : abc1234
- Heure : 2026-02-26 15:30

### Étapes de déploiement
1. ✅ Récupération du code
2. ✅ Installation des dépendances
3. ✅ Exécution des tests (45/45 réussis)
4. ✅ Build du projet
5. ✅ Déploiement sur le serveur

### Vérification de santé
- API : ✅ Normal
- Base de données : ✅ Connexion normale
- Redis : ✅ Connexion normale

### Adresses d'accès
- URL : https://staging.example.com
- API : https://api-staging.example.com

Déploiement réussi !

Gestion multi-projets

Configuration des projets

{
  "projects": {
    "frontend": {
      "path": "~/projects/frontend",
      "skills": ["coding-agent", "test-runner"],
      "context": "AGENTS.md"
    },
    "backend": {
      "path": "~/projects/backend",
      "skills": ["coding-agent", "docker-essentials"],
      "context": "AGENTS.md"
    },
    "mobile": {
      "path": "~/projects/mobile",
      "skills": ["coding-agent"],
      "context": "AGENTS.md"
    }
  }
}

Changement de projet

Utilisateur : Basculer sur le projet backend

Agent : Basculé sur le projet backend.

Informations du projet actuel :
- Nom : backend
- Chemin : ~/projects/backend
- Technologie : Python/FastAPI
- Dernier commit : Ajout de l'authentification utilisateur

Que puis-je faire pour vous ?

Génération de code

Générer du code standard

Utilisateur : Créer une API CRUD pour le modèle User

Agent : D'accord, je crée l'API CRUD pour le modèle User...

[Analyse de la structure de code existante]
[Génération des fichiers de code]

Fichiers générés :

**1. models/user.py**
```python
from pydantic import BaseModel
from datetime import datetime

class User(BaseModel):
    id: int
    name: str
    email: str
    created_at: datetime
    updated_at: datetime

class UserCreate(BaseModel):
    name: str
    email: str

class UserUpdate(BaseModel):
    name: str | None = None
    email: str | None = None

2. routers/users.py

from fastapi import APIRouter, HTTPException
from models.user import User, UserCreate, UserUpdate

router = APIRouter(prefix="/users", tags=["users"])

@router.get("/", response_model=list[User])
async def list_users(): ...

@router.get("/{user_id}", response_model=User)
async def get_user(user_id: int): ...

@router.post("/", response_model=User)
async def create_user(user: UserCreate): ...

@router.put("/{user_id}", response_model=User)
async def update_user(user_id: int, user: UserUpdate): ...

@router.delete("/{user_id}")
async def delete_user(user_id: int): ...

3. tests/test_users.py

from fastapi.testclient import TestClient

def test_list_users(): ...
def test_create_user(): ...
def test_update_user(): ...
def test_delete_user(): ...

Voulez-vous que j’exécute les tests pour vérifier ?


## Génération de documentation

### Documentation API

Utilisateur : Générer la documentation pour cette API

Agent : Analyse des endpoints API en cours…

[Scan des fichiers de routes] [Extraction des informations API] [Génération de la documentation]

Documentation API

Module Utilisateurs

GET /users

Obtenir la liste des utilisateurs

Paramètres

Nom Type Requis Description
page int Non Numéro de page
limit int Non Nombre par page

Réponse

{
  "data": [User],
  "total": int,
  "page": int,
  "limit": int
}

POST /users

Créer un utilisateur

Corps de la requête

{
  "name": "string",
  "email": "string"
}

Réponse

{
  "id": 1,
  "name": "string",
  "email": "string",
  "created_at": "2026-02-26T00:00:00Z",
  "updated_at": "2026-02-26T00:00:00Z"
}

Enregistrer dans docs/api.md ?


## Dépannage

### Problèmes CI/CD

```bash
# Vérifier l'état CI/CD
openclaw ci status

# Voir les logs CI/CD
openclaw ci logs --last

# Relancer la tâche échouée
openclaw ci retry

Problèmes de code

# Analyser les problèmes de code
openclaw analyze --project backend

# Générer des suggestions de correction
openclaw suggest --file auth.js

Résumé

En construisant un assistant de programmation avec OpenClaw :

  • Revue de code : automatisation de la revue des PR
  • Exécution des tests : tests automatisés et rapports
  • Intégration CI/CD : automatisation du processus de déploiement
  • Gestion multi-projets : changement rapide de contexte
  • Génération de code : code standard généré
  • Génération de documentation : documentation API automatique

Historique des mises à jour :

  • 2026-02-26 : Publication initiale

Navigation de la série :