name: CI/CD Semantic Release on: push: branches: - main jobs: release: runs-on: ubuntu-latest steps: - name: Checkout del código uses: actions/checkout@v4 with: fetch-depth: 0 # Descarga todo el historial de Git (vital para semantic-release) persist-credentials: false - name: Preparar entorno Node.js uses: actions/setup-node@v4 with: node-version: '18' - name: Instalar Semantic Release y Plugins # Descargamos el motor core y los plugins específicos para Git, Changelog y Gitea run: | npm install -D semantic-release @saithodev/semantic-release-gitea @semantic-release/changelog @semantic-release/git @semantic-release/exec - name: Generar configuración de Release # Escribimos el archivo de configuración al vuelo run: | cat << 'EOF' > .releaserc.json { "branches": ["main"], "plugins":[ "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", "@semantic-release/changelog",[ "@semantic-release/git", { "assets": ["CHANGELOG.md"], "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}" } ],[ "@saithodev/semantic-release-gitea", { "giteaUrl": "https://repo.eldiaservicios.com" } ],[ "@semantic-release/exec", { "successCmd": "echo 'RELEASE_CREATED=true' >> $GITHUB_ENV && echo 'TAG_NAME=${nextRelease.gitTag}' >> $GITHUB_ENV" } ] ] } EOF - name: Ejecutar Semantic Release env: GITEA_TOKEN: ${{ secrets.RELEASE_PLEASE_TOKEN }} GITEA_URL: "https://repo.eldiaservicios.com" # Engañamos a Git para que use tu token y tenga permisos de hacer push del CHANGELOG REPOSITORY_URL: "https://gitea_actions:${{ secrets.RELEASE_PLEASE_TOKEN }}@repo.eldiaservicios.com/${{ github.repository }}.git" run: npx semantic-release - name: 🤖 Generar notas épicas con IA Local (Ollama) # Este paso SOLO se ejecuta si el plugin "exec" de arriba confirmó que hubo un release if: env.RELEASE_CREATED == 'true' env: GITEA_TOKEN: ${{ secrets.RELEASE_PLEASE_TOKEN }} REPO: ${{ github.repository }} TAG_NAME: ${{ env.TAG_NAME }} run: | node -e ' async function run() { const giteaUrl = "https://repo.eldiaservicios.com/api/v1"; const ollamaUrl = "http://192.168.10.78:11434/api/generate"; console.log(`Obteniendo la release ${process.env.TAG_NAME} de Gitea...`); 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(); const rawNotes = relData.body; 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: ${rawNotes}`; 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; console.log("Actualizando la Release en Gitea..."); 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); }); '