diff --git a/.gitea/workflows/release-please.yaml b/.gitea/workflows/release-please.yaml deleted file mode 100644 index 25dbd79..0000000 --- a/.gitea/workflows/release-please.yaml +++ /dev/null @@ -1,133 +0,0 @@ -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 - with: - fetch-depth: 0 # Descarga todo el historial para evitar errores de Gitea - - - name: Release Please - id: release - uses: https://repo.eldiaservicios.com/dmolinari/gitea-release-please-action@main - env: - GITHUB_TOKEN: ${{ secrets.RELEASE_PLEASE_TOKEN }} - with: - token: ${{ secrets.RELEASE_PLEASE_TOKEN }} - release-type: simple - - # NUEVO PASO: Despierta a Gitea para que reconozca los cambios - - name: Forzar actualización de rama en Gitea - if: failure() - run: | - echo "Despertando a Gitea para que indexe los cambios..." - git config --global user.name "Gitea Actions" - git config --global user.email "actions@gitea.local" - git fetch origin release-please--branches--main - git checkout release-please--branches--main - git commit --allow-empty -m "chore: forzar indexacion visual en Gitea" - git remote set-url origin https://x-access-token:${{ secrets.RELEASE_PLEASE_TOKEN }}@repo.eldiaservicios.com/${{ github.repository }}.git - git push origin release-please--branches--main - - - 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 prRes = await fetch(`${giteaUrl}/repos/${process.env.REPO}/pulls`, { - method: "POST", - headers: { - "Authorization": `token ${process.env.GITEA_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!"); - } else { - console.log("❌ Falló el rescate:", await prRes.text()); - process.exit(1); - } - } - run().catch(err => { console.error(err); process.exit(1); }); - ' - - - 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); }); - ' \ No newline at end of file diff --git a/.gitea/workflows/semantic-release.yaml b/.gitea/workflows/semantic-release.yaml new file mode 100644 index 0000000..73de0f2 --- /dev/null +++ b/.gitea/workflows/semantic-release.yaml @@ -0,0 +1,125 @@ +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); }); + ' \ No newline at end of file