-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsend-email-success.js
173 lines (151 loc) · 8.08 KB
/
send-email-success.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
// send-email-success.js
const nodemailer = require('nodemailer');
const axios = require('axios');
const dotenv = require('dotenv');
dotenv.config(); // Cargar variables de entorno
// Configurar el transportador de Nodemailer
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: process.env.GMAIL_USER,
pass: process.env.GMAIL_PASS,
},
});
const repoOwner = "AdoDeveloper";
const repoName = "implantacion-app";
// Función para formatear la fecha y hora en el formato de El Salvador
function formatDateToElSalvador(dateString) {
return new Intl.DateTimeFormat('es-SV', {
dateStyle: 'full',
timeStyle: 'medium',
timeZone: 'America/El_Salvador',
}).format(new Date(dateString));
}
async function sendSuccessEmail() {
try {
// Configuración de la cabecera de autenticación
const headers = {
Authorization: `Bearer ${process.env.TOKEN_REPO}`, // Usar el token de acceso personal para autenticación
'Accept': 'application/vnd.github.v3+json',
};
// Obtener los últimos 5 commits
const commitResponse = await axios.get(`https://api.github.com/repos/${repoOwner}/${repoName}/commits?per_page=5`, { headers });
const commits = commitResponse.data;
const lastCommit = commits[0];
const commitAuthor = lastCommit.commit.author.name;
const commitEmail = lastCommit.commit.author.email;
const commitMessage = lastCommit.commit.message;
const commitDate = formatDateToElSalvador(lastCommit.commit.author.date);
const commitUrl = lastCommit.html_url;
// Obtener la URL del pipeline más reciente
const workflowResponse = await axios.get(`https://api.github.com/repos/${repoOwner}/${repoName}/actions/runs?per_page=1&branch=main&status=completed`, { headers });
const lastRun = workflowResponse.data.workflow_runs[0];
const pipelineUrl = lastRun.html_url;
const pipelineStatus = lastRun.conclusion;
const pipelineStartTime = formatDateToElSalvador(lastRun.created_at);
const pipelineEndTime = formatDateToElSalvador(lastRun.updated_at);
const pipelineDuration = ((new Date(lastRun.updated_at) - new Date(lastRun.created_at)) / 1000).toFixed(2);
// Obtener información del repositorio
const repoResponse = await axios.get(`https://api.github.com/repos/${repoOwner}/${repoName}`, { headers });
const repoDetails = repoResponse.data;
const repoDescription = repoDetails.description || 'Sin descripción';
const repoStars = repoDetails.stargazers_count;
const repoForks = repoDetails.forks_count;
const repoWatchers = repoDetails.watchers_count;
const repoUrl = repoDetails.html_url;
const repoCreatedAt = formatDateToElSalvador(repoDetails.created_at);
const repoUpdatedAt = formatDateToElSalvador(repoDetails.updated_at);
// Obtener los resultados de las pruebas (ejemplo básico)
const testSummaryResponse = await axios.get(`https://api.github.com/repos/${repoOwner}/${repoName}/actions/runs/${lastRun.id}/jobs`, { headers });
const tests = testSummaryResponse.data.jobs.reduce((acc, job) => {
acc.total += job.steps.length;
acc.passed += job.steps.filter(step => step.conclusion === 'success').length;
acc.failed += job.steps.filter(step => step.conclusion === 'failure').length;
return acc;
}, { total: 0, passed: 0, failed: 0 });
// Obtener la lista de colaboradores
const collaboratorsResponse = await axios.get(`https://api.github.com/repos/${repoOwner}/${repoName}/collaborators`, { headers });
const collaborators = collaboratorsResponse.data;
const collaboratorList = collaborators
.map(collaborator => `<li>${collaborator.login} - <a href="${collaborator.html_url}" style="color: #1e88e5;">Perfil de GitHub</a></li>`)
.join('');
// Crear la lista de los últimos commits para el historial detallado
const commitHistory = commits.map(commit => `
<li>
<strong>Mensaje del Commit:</strong> ${commit.commit.message}<br>
<strong>Autor:</strong> ${commit.commit.author.name} (${commit.commit.author.email})<br>
<strong>Fecha del Commit:</strong> ${formatDateToElSalvador(commit.commit.author.date)}<br>
<strong>Enlace al Commit:</strong> <a href="${commit.html_url}" style="color: #1e88e5;">${commit.sha}</a><br>
<strong>Detalle de Commit:</strong> ${commit.commit.message} <br>
</li>
`).join('');
// Opciones del correo electrónico con toda la información
const mailOptions = {
from: process.env.GMAIL_USER,
subject: '✅ CI/CD Pipeline Exitoso - Información Detallada ✅',
html: `
<div style="font-family: Arial, sans-serif; padding: 20px; border: 2px solid #4CAF50; border-radius: 10px;">
<h2 style="color: #4CAF50;">✅ Las pruebas han pasado exitosamente en el CI/CD Pipeline ✅</h2>
<p>🎉 Todas las pruebas automatizadas han pasado sin errores. ¡Buen trabajo!</p>
<h3>🔍 Información del Repositorio</h3>
<ul>
<li><strong>Nombre del Repositorio:</strong> ${repoName}</li>
<li><strong>Descripción:</strong> ${repoDescription}</li>
<li><strong>Estrellas:</strong> ⭐ ${repoStars}</li>
<li><strong>Bifurcaciones:</strong> 🍴 ${repoForks}</li>
<li><strong>Vigilantes:</strong> 👀 ${repoWatchers}</li>
<li><strong>Creado en:</strong> ${repoCreatedAt}</li>
<li><strong>Última actualización:</strong> ${repoUpdatedAt}</li>
<li><strong>Enlace al repositorio:</strong> <a href="${repoUrl}" style="color: #1e88e5; text-decoration: none;">Ver Repositorio</a></li>
</ul>
<h3>📝 Último Commit</h3>
<ul>
<li><strong>Autor:</strong> ${commitAuthor} (${commitEmail})</li>
<li><strong>Mensaje del Commit:</strong> ${commitMessage}</li>
<li><strong>Fecha:</strong> ${commitDate}</li>
<li><strong>Enlace al Commit:</strong> <a href="${commitUrl}" style="color: #1e88e5; text-decoration: none;">Ver Commit</a></li>
</ul>
<h3>🔍 Detalles del Pipeline:</h3>
<ul>
<li><strong>Estado:</strong> ${pipelineStatus}</li>
<li><strong>Inicio:</strong> ${pipelineStartTime}</li>
<li><strong>Fin:</strong> ${pipelineEndTime}</li>
<li><strong>Duración:</strong> ${pipelineDuration} segundos</li>
<li><strong>Ver Pipeline:</strong> <a href="${pipelineUrl}" style="color: #1e88e5; text-decoration: none;">Ver Detalles</a></li>
</ul>
<h3>🔍 Resultados de las Pruebas:</h3>
<ul>
<li>Total Pruebas: ${tests.total}</li>
<li>Aprobadas: ${tests.passed}</li>
<li>Fallidas: ${tests.failed}</li>
</ul>
<h3>👥 Colaboradores del Repositorio</h3>
<ul>${collaboratorList}</ul>
<h3>📜 Historial de Commits Recientes</h3>
<ul>${commitHistory}</ul>
<h3>🌐 Enlaces Importantes</h3>
<p>Puedes revisar los detalles del pipeline en el siguiente enlace:</p>
<a href="${pipelineUrl}" style="color: #1e88e5; text-decoration: none; font-weight: bold;">🔗 Ver detalles del pipeline</a>
<br><br>
<p>Accede a la aplicación desplegada:</p>
<a href="https://implantacion-app.onrender.com/products" style="color: #1e88e5; text-decoration: none; font-weight: bold;">🔗 Página desplegada</a>
<br><br>
<p style="color: #4CAF50; font-weight: bold;">¡Continúa con el excelente trabajo! 🚀</p>
</div>
`,
};
// Enviar el correo
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.error('Error al enviar correo de éxito:', error);
} else {
console.log('Correo de éxito enviado:', info.response);
}
});
} catch (error) {
console.error('Error al obtener información del repositorio o enviar correo:', error.response?.data || error.message);
}
}
// Ejecutar la función para enviar el correo
sendSuccessEmail();