feat(webhook): integra listener com a API de Status do Gitea

This commit is contained in:
2026-05-11 22:50:00 +02:00
parent f570a2f208
commit bd6801a563
+57 -2
View File
@@ -1,4 +1,5 @@
const http = require('http');
const https = require('https'); // Adicionado caso precise de HTTPS, mas usaremos HTTP para a VPN
const { exec } = require('child_process');
const fs = require('fs');
@@ -7,6 +8,8 @@ const HOST = '10.99.0.4';
const SECRET_TOKEN = 'gitea_webhook_secret_clube67_58e4a92c3d18';
const SCRIPT_PATH = '/home/deploy/stack/clube67/deploy-prod-builder.sh';
const LOG_FILE = '/home/deploy/stack/webhook-listener/deploy.log';
const GITEA_API_URL = 'http://10.99.0.3:3000/api/v1';
const GITEA_TOKEN = process.env.GITEA_TOKEN || 'ada47ca2fb196319dd10245cc216a327dac857ec';
function log(message) {
const timestamp = new Date().toISOString();
@@ -15,6 +18,45 @@ function log(message) {
fs.appendFileSync(LOG_FILE, logMessage, 'utf8');
}
// Funcao para atualizar o status do commit no Gitea usando a API
function updateCommitStatus(owner, repo, sha, state, description) {
if (!owner || !repo || !sha) return;
const postData = JSON.stringify({
state: state,
target_url: 'http://' + HOST + ':' + PORT,
description: description,
context: 'continuous-integration/webhook'
});
const url = new URL(`${GITEA_API_URL}/repos/${owner}/${repo}/statuses/${sha}`);
const options = {
hostname: url.hostname,
port: url.port,
path: url.pathname,
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'token ' + GITEA_TOKEN,
'Content-Length': Buffer.byteLength(postData)
}
};
const req = http.request(options, (res) => {
let responseBody = '';
res.on('data', chunk => responseBody += chunk);
res.on('end', () => {
log(`Gitea Status API (${state}): HTTP ${res.statusCode}`);
});
});
req.on('error', (e) => {
log(`Erro ao chamar API do Gitea: ${e.message}`);
});
req.write(postData);
req.end();
}
// Garante que o arquivo de log exista
try {
if (!fs.existsSync(LOG_FILE)) {
@@ -70,7 +112,6 @@ const server = http.createServer((req, res) => {
let body = '';
req.on('data', function(chunk) { body += chunk.toString(); });
req.on('end', function() {
// Verificar se todos os commits sao bumps de versao automaticos (evita loop infinito)
var payload = {};
try { payload = JSON.parse(body); } catch (e) {}
@@ -78,8 +119,15 @@ const server = http.createServer((req, res) => {
var headMsg = (payload.head_commit || {}).message || '';
var allMessages = commits.map(function(c) { return c.message || ''; }).concat(headMsg).filter(function(m) { return m.trim() !== ''; });
var VERSION_BUMP_RE = /^chore\(deploy\):\s*bump version/i;
// Extrai dados do repositorio para a API do Gitea
const repoOwner = payload.repository && payload.repository.owner ? payload.repository.owner.login : null;
const repoName = payload.repository ? payload.repository.name : null;
const commitSha = payload.after || (payload.head_commit ? payload.head_commit.id : null);
if (allMessages.length > 0 && allMessages.every(function(msg) { return VERSION_BUMP_RE.test(msg); })) {
log('Commit de bump de versao detectado -- deploy ignorado para evitar loop de CI.');
updateCommitStatus(repoOwner, repoName, commitSha, 'success', 'Ignorado: bump version');
res.writeHead(200, { 'Content-Type': 'application/json' });
return res.end(JSON.stringify({ status: 'skipped', reason: 'version-bump commit' }));
}
@@ -91,18 +139,25 @@ const server = http.createServer((req, res) => {
// Inicia o processo de deploy
isBuilding = true;
log('Iniciando deploy-prod-builder.sh...');
// Atualiza Gitea dizendo que o build comecou
updateCommitStatus(repoOwner, repoName, commitSha, 'pending', 'Deploy em andamento na VPS 4');
exec(SCRIPT_PATH, function(error, stdout, stderr) {
isBuilding = false;
if (error) {
log('Erro no processo de deploy: ' + error.message);
// Atualiza Gitea dizendo que o build falhou
updateCommitStatus(repoOwner, repoName, commitSha, 'failure', 'Falha no deploy (VPS 4)');
return;
}
log('Processo de deploy finalizado.');
// Atualiza Gitea dizendo que o build foi concluido com sucesso
updateCommitStatus(repoOwner, repoName, commitSha, 'success', 'Deploy concluido com sucesso (VPS 4)');
});
});
});
server.listen(PORT, HOST, function() {
log('Webhook listener ativo em http://' + HOST + ':' + PORT + '/webhook');
log('Webhook listener ativo em http://' + HOST + ':' + PORT + '/webhook com integracao a API do Gitea');
});