name: Release con IA Local on: push: branches: - main permissions: contents: write pull-requests: write jobs: release-please: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 # 1. Ejecutar Release Please (Con inyección de entorno) - name: Release Please id: release uses: https://repo.eldiaservicios.com/dmolinari/gitea-release-please-action@main # Le pasamos el token por entorno para evitar el 401 de Octokit env: GITHUB_TOKEN: ${{ secrets.RELEASE_PLEASE_TOKEN }} with: token: ${{ secrets.RELEASE_PLEASE_TOKEN }} release-type: simple # 2. Si Release Please falla al hacer el PR (Error 401), lo hacemos nosotros nativamente - name: Rescate - Crear Pull Request Manualmente if: failure() env: GITEA_TOKEN: ${{ secrets.RELEASE_PLEASE_TOKEN }} REPO: ${{ github.repository }} run: | node -e ' async function run() { const giteaUrl = "https://repo.eldiaservicios.com/api/v1"; const repo = process.env.REPO; const token = process.env.GITEA_TOKEN; console.log("Intentando rescatar el proceso y crear el PR nativamente..."); const prRes = await fetch(`${giteaUrl}/repos/${repo}/pulls`, { method: "POST", headers: { "Authorization": `token ${token}`, "Content-Type": "application/json" }, body: JSON.stringify({ head: "release-please--branches--main", base: "main", title: "chore(main): release", body: "🤖 Pull Request generado automáticamente por el sistema de CI/CD. (Rescatado por script)" }) }); if (prRes.ok) { console.log("✅ ¡Pull Request creado exitosamente por el script de rescate!"); } else { console.log("❌ Falló el rescate:", await prRes.text()); process.exit(1); } } run().catch(err => { console.error(err); process.exit(1); }); ' # 3. Generar notas con IA Local - name: Generar notas con IA Local if: ${{ steps.release.outputs.release_created }} env: GITEA_TOKEN: ${{ secrets.RELEASE_PLEASE_TOKEN }} REPO: ${{ github.repository }} TAG_NAME: ${{ steps.release.outputs.tag_name }} RAW_NOTES: ${{ steps.release.outputs.body }} run: | node -e ' async function run() { const giteaUrl = "https://repo.eldiaservicios.com/api/v1"; const ollamaUrl = "http://192.168.10.78:11434/api/generate"; const prompt = `Eres un redactor experto de notas de lanzamiento (release notes). Tu misión es transformar una lista técnica de commits en un anuncio acotado, profesional y descriptivo. Instrucciones: - Usa Markdown elegante. - Usa emojis que tengan sentido. - Agrupa por secciones (Ej: 🚀 Novedades, 🛠️ Mejoras Técnicas). - El tono debe ser entusiasta pero profesional. - Escribe exclusivamente en español. Lista de cambios original: ${process.env.RAW_NOTES}`; console.log("Conectando con Ollama en tu PC para generar notas..."); const aiRes = await fetch(ollamaUrl, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ model: "llama3.1", prompt: prompt, stream: false }) }); const aiData = await aiRes.json(); const aiNotes = aiData.response; const relRes = await fetch(`${giteaUrl}/repos/${process.env.REPO}/releases/tags/${process.env.TAG_NAME}`, { headers: { "Authorization": `token ${process.env.GITEA_TOKEN}` } }); const relData = await relRes.json(); await fetch(`${giteaUrl}/repos/${process.env.REPO}/releases/${relData.id}`, { method: "PATCH", headers: { "Authorization": `token ${process.env.GITEA_TOKEN}`, "Content-Type": "application/json" }, body: JSON.stringify({ body: aiNotes }) }); console.log("¡Release Notes actualizadas por la IA!"); } run().catch(err => { console.error(err); process.exit(1); }); '