La velocità di esecuzione è fondamentale, ma la qualità del codice resta il vero differenziatore. Molti di noi si trovano a dover gestire un delicato equilibrio: utilizzare la potenza dei modelli AI più recenti – come DeepSeek – mantenendo al contempo una struttura solida per il tracking delle attività su GitHub.
Spesso, il limite risiede nell’integrazione tra i portali di assistenza AI (come GitHub Copilot) e i modelli che preferiamo per le nostre architetture. Ma cosa succede se spostiamo il baricentro dell’automazione direttamente sul ciclo di vita del codice?
La soluzione: GitHub Actions come motore di orchestrazione
Invece di tentare di forzare modelli esterni in interfacce web rigide, la strategia più efficace è trasformare GitHub stesso nel motore di esecuzione, sfruttando le GitHub Actions.
Il workflow è lineare e potente:
- Definizione del task: Una Issue su GitHub diventa l’input strutturato.
- Trigger: Un evento di GitHub (es. l’apertura di una issue con un tag specifico) avvia automaticamente una GitHub Action dedicata.
- Elaborazione: L’Action invoca via API il modello scelto (in questo caso, DeepSeek), passando il contesto della issue e il codice pertinente del repository.
- Esecuzione: Il modello analizza il task, genera la soluzione e l’Action, tramite un bot o un commit automatico, prepara il terreno per la Pull Request.
I vantaggi di questo approccio:
- Indipendenza dai modelli: Non sei più vincolato ai modelli predefiniti del portale web. Puoi switchare tra DeepSeek, Claude o altre istanze locali (via Ollama) semplicemente aggiornando la configurazione della tua Action.
- Workflow “Docs-as-Code”: Il processo è tracciabile, riproducibile e versionato. Ogni automazione segue la logica del tuo repository.
- Focus sull’architettura: Questa soluzione ti permette di integrare l’AI non solo come un assistente alla scrittura, ma come un componente del tuo pipeline di CI/CD.
Per implementare l’automazione basata su GitHub Actions e DeepSeek, dobbiamo creare un sistema che “ascolti” le Issue e interagisca con le API. Ecco i passaggi tecnici e gli esempi di codice per costruire questo workflow.
1. Preparazione dell’ambiente
Assicurati di avere una API Key di DeepSeek valida. Aggiungila al tuo repository GitHub come Secret (vai in Settings > Secrets and variables > Actions > New repository secret):
- Nome:
DEEPSEEK_API_KEY - Valore:
sk-xxxxxxxxxxxxxxxx
2. Creazione della GitHub Action
Crea il file .github/workflows/deepseek-issue-bot.yml nel tuo repository. Questo workflow scatterà ogni volta che apri una Issue.
name: DeepSeek Issue Bot
on:
issues:
types: [opened]
jobs:
process-issue:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.10'
- name: Install dependencies
run: pip install requests
- name: Run DeepSeek Processor
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
ISSUE_TITLE: ${{ github.event.issue.title }}
ISSUE_BODY: ${{ github.event.issue.body }}
run: python scripts/process_issue.py
3. Script di elaborazione (scripts/process_issue.py)
Questo script interroga DeepSeek con il testo della tua issue e pubblica un commento con la soluzione.
import os
import requests
import json
def ask_deepseek(prompt):
url = "https://api.deepseek.com/v1/chat/completions" # URL endpoint DeepSeek
headers = {
"Authorization": f"Bearer {os.environ['DEEPSEEK_API_KEY']}",
"Content-Type": "application/json"
}
data = {
"model": "deepseek-chat",
"messages": [{"role": "user", "content": prompt}]
}
response = requests.post(url, headers=headers, json=data)
return response.json()['choices'][0]['message']['content']
def post_comment(comment):
issue_number = os.environ.get("GITHUB_EVENT_PATH") # O estrai via API context
# Semplificato: stampa il commento (o usa l'API di GitHub per postarlo sulla issue)
print(f"Soluzione generata: {comment}")
if __name__ == "__main__":
title = os.environ.get("ISSUE_TITLE")
body = os.environ.get("ISSUE_BODY")
prompt = f"Analizza questa richiesta di codice:\nTitolo: {title}\nContesto: {body}\nGenera una proposta di implementazione."
solution = ask_deepseek(prompt)
post_comment(solution)
4. Flusso logico visivo
Per comprendere come interagiscono i componenti:
Note importanti per il tuo workflow .NET:
- Contesto del Codice: Se vuoi che DeepSeek scriva codice reale, modifica lo script Python per includere una lettura dei file del repository (
open('progetto.cs', 'r').read()) prima di inviare il prompt. - Sicurezza: Non includere mai la chiave API direttamente nel file YAML; usa sempre il sistema dei Secrets di GitHub.
- Filtraggio: Ti consiglio di aggiungere una condizione al trigger del workflow nello YAML, ad esempio eseguendolo solo se l’Issue ha un label specifico (es:
label: 'ai-request'), per evitare di chiamare l’API per ogni tipo di segnalazione (come bug o domande generiche).
In un prossimo post vedremo l’implementazione di una soluzione piu’ “architetturale” che utilizzerà MCP server.