feat: migrar pipeline a semantic release con IA
This commit is contained in:
@@ -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); });
|
||||
'
|
||||
125
.gitea/workflows/semantic-release.yaml
Normal file
125
.gitea/workflows/semantic-release.yaml
Normal file
@@ -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); });
|
||||
'
|
||||
Reference in New Issue
Block a user