diff --git a/webhook-listener/listener.js b/webhook-listener/listener.js index 6d30316..ffb7100 100644 --- a/webhook-listener/listener.js +++ b/webhook-listener/listener.js @@ -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'); });