From 8bb5e63bfb798cf950ae95d88daa8e85d49ad05a Mon Sep 17 00:00:00 2001 From: SimonDevelop Date: Tue, 15 Jan 2019 11:13:34 +0100 Subject: [PATCH 01/23] test: test access to api github without api key --- server.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/server.js b/server.js index 8a32c91..a678eb2 100644 --- a/server.js +++ b/server.js @@ -1,2 +1,19 @@ -const config = require("./config.json"); +// const config = require("./config.json"); const request = require('request'); +const apiUrl = "https://api.github.com"; + +var options = { + url: apiUrl, + headers: { + 'User-Agent': 'releaser-bot' + } +}; + +function callback(error, response, body) { + if (!error && response.statusCode == 200) { + var info = JSON.parse(body); + console.log(info); + } +} + +request(options, callback); From b3443d79afa524e25844c4db07c1e6c03c1c4783 Mon Sep 17 00:00:00 2001 From: SimonDevelop Date: Tue, 15 Jan 2019 11:55:12 +0100 Subject: [PATCH 02/23] test: test access with api token --- config.example.json | 5 +++-- server.js | 7 ++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/config.example.json b/config.example.json index 515be52..321a58b 100644 --- a/config.example.json +++ b/config.example.json @@ -1,6 +1,7 @@ { - "key": "", + "username": "", + "token": "", "repositories": { - "/" + "": "/" } } diff --git a/server.js b/server.js index a678eb2..1fc4dcb 100644 --- a/server.js +++ b/server.js @@ -1,11 +1,12 @@ -// const config = require("./config.json"); +const config = require("./config.json"); const request = require('request'); const apiUrl = "https://api.github.com"; var options = { - url: apiUrl, + url: apiUrl+"/repos/SimonDevelop/releaser-bot-test", headers: { - 'User-Agent': 'releaser-bot' + 'User-Agent': 'releaser-bot', + 'Authorization': 'token '+config.token } }; From 281f74cf27258397bfd2e0a896971c4e68add8be Mon Sep 17 00:00:00 2001 From: SimonDevelop Date: Tue, 15 Jan 2019 11:59:33 +0100 Subject: [PATCH 03/23] test: test access repos in config.json --- config.example.json | 6 +++--- server.js | 28 ++++++++++++++-------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/config.example.json b/config.example.json index 321a58b..407575c 100644 --- a/config.example.json +++ b/config.example.json @@ -1,7 +1,7 @@ { "username": "", "token": "", - "repositories": { - "": "/" - } + "repositories": [ + "/" + ] } diff --git a/server.js b/server.js index 1fc4dcb..ccd1c17 100644 --- a/server.js +++ b/server.js @@ -2,19 +2,19 @@ const config = require("./config.json"); const request = require('request'); const apiUrl = "https://api.github.com"; -var options = { - url: apiUrl+"/repos/SimonDevelop/releaser-bot-test", - headers: { - 'User-Agent': 'releaser-bot', - 'Authorization': 'token '+config.token - } -}; - -function callback(error, response, body) { - if (!error && response.statusCode == 200) { - var info = JSON.parse(body); - console.log(info); +for (var i=0; i < config.repositories.length; i++) { + var options = { + url: apiUrl+"/repos/"+config.repositories[i], + headers: { + 'User-Agent': 'releaser-bot', + 'Authorization': 'token '+config.token + } + }; + function callback(error, response, body) { + if (!error && response.statusCode == 200) { + var info = JSON.parse(body); + console.log(info); + } } + request(options, callback); } - -request(options, callback); From eced239fd1e8bc6da30f56b7d847f5e5955f4f6e Mon Sep 17 00:00:00 2001 From: SimonDevelop Date: Tue, 15 Jan 2019 14:55:15 +0100 Subject: [PATCH 04/23] test: test steps request with events response --- config.example.json | 1 - server.js | 43 ++++++++++++++++++++++++++++++++++++------- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/config.example.json b/config.example.json index 407575c..516a251 100644 --- a/config.example.json +++ b/config.example.json @@ -1,5 +1,4 @@ { - "username": "", "token": "", "repositories": [ "/" diff --git a/server.js b/server.js index ccd1c17..fd39f72 100644 --- a/server.js +++ b/server.js @@ -1,20 +1,49 @@ const config = require("./config.json"); const request = require('request'); -const apiUrl = "https://api.github.com"; +var EventEmitter = require("events").EventEmitter; +var data = new EventEmitter(); +var apiUrl = "https://api.github.com"; for (var i=0; i < config.repositories.length; i++) { + // Default options var options = { url: apiUrl+"/repos/"+config.repositories[i], headers: { + 'Content-type': 'application/json', 'User-Agent': 'releaser-bot', 'Authorization': 'token '+config.token - } + }, json: true }; - function callback(error, response, body) { + + // Check repos + request(options, function (error, response, body) { if (!error && response.statusCode == 200) { - var info = JSON.parse(body); - console.log(info); + data.json = body; + data.emit('update'); } - } - request(options, callback); + }); } + +// Check last release +data.on('update', function () { + options.url = apiUrl+"/repos/"+data.json.full_name+"/releases" + + // Charge last release + request(options, function (error, response, body) { + if (!error && response.statusCode == 200) { + data.releases = body; + data.emit('release'); + } + }); +}); + +data.on('release', function () { + console.log(data.releases); + // if (releases.length > 0) { + // lastRelease.tag = releases[0].tag_name; + // lastRelease.name = releases[0].name; + // } else { + // lastRelease.tag = "0.0.1"; + // lastRelease.name = "Release 0.0.1"; + // } +}); From 2d1a0998154c3bb47116b4aefd8308bdbcc9aa1e Mon Sep 17 00:00:00 2001 From: SimonDevelop Date: Tue, 15 Jan 2019 15:26:16 +0100 Subject: [PATCH 05/23] test: prepare commit checker --- server.js | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/server.js b/server.js index fd39f72..f724f34 100644 --- a/server.js +++ b/server.js @@ -8,6 +8,7 @@ for (var i=0; i < config.repositories.length; i++) { // Default options var options = { url: apiUrl+"/repos/"+config.repositories[i], + method: "GET", headers: { 'Content-type': 'application/json', 'User-Agent': 'releaser-bot', @@ -19,14 +20,26 @@ for (var i=0; i < config.repositories.length; i++) { request(options, function (error, response, body) { if (!error && response.statusCode == 200) { data.json = body; - data.emit('update'); + data.emit('commit'); } }); } +// Check last commit +data.on('commit', function () { + options.url = apiUrl+"/repos/"+data.json.full_name+"/commits"; + + // Charge last commit + request(options, function (error, response, body) { + if (!error && response.statusCode == 200) { + console.log(body[0]); + } + }); +}); + // Check last release -data.on('update', function () { - options.url = apiUrl+"/repos/"+data.json.full_name+"/releases" +data.on('release', function () { + options.url = apiUrl+"/repos/"+data.json.full_name+"/releases"; // Charge last release request(options, function (error, response, body) { @@ -37,13 +50,13 @@ data.on('update', function () { }); }); -data.on('release', function () { +data.on('release2', function () { console.log(data.releases); - // if (releases.length > 0) { - // lastRelease.tag = releases[0].tag_name; - // lastRelease.name = releases[0].name; - // } else { - // lastRelease.tag = "0.0.1"; - // lastRelease.name = "Release 0.0.1"; - // } + if (data.releases.length > 0) { + // lastRelease.tag = releases[0].tag_name; + // lastRelease.name = releases[0].name; + } else { + // lastRelease.tag = "0.0.1"; + // lastRelease.name = "Release 0.0.1"; + } }); From 97a84474c4f867e54904f469c9ce4fb927c89784 Mon Sep 17 00:00:00 2001 From: SimonDevelop Date: Tue, 15 Jan 2019 16:34:55 +0100 Subject: [PATCH 06/23] test: test github webhook receive --- server.js | 134 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 80 insertions(+), 54 deletions(-) diff --git a/server.js b/server.js index f724f34..557c266 100644 --- a/server.js +++ b/server.js @@ -1,62 +1,88 @@ const config = require("./config.json"); +const http = require('http'); const request = require('request'); var EventEmitter = require("events").EventEmitter; var data = new EventEmitter(); var apiUrl = "https://api.github.com"; -for (var i=0; i < config.repositories.length; i++) { - // Default options - var options = { - url: apiUrl+"/repos/"+config.repositories[i], - method: "GET", - headers: { - 'Content-type': 'application/json', - 'User-Agent': 'releaser-bot', - 'Authorization': 'token '+config.token - }, json: true - }; - - // Check repos - request(options, function (error, response, body) { - if (!error && response.statusCode == 200) { - data.json = body; - data.emit('commit'); - } - }); -} - -// Check last commit -data.on('commit', function () { - options.url = apiUrl+"/repos/"+data.json.full_name+"/commits"; - - // Charge last commit - request(options, function (error, response, body) { - if (!error && response.statusCode == 200) { - console.log(body[0]); - } - }); -}); - -// Check last release -data.on('release', function () { - options.url = apiUrl+"/repos/"+data.json.full_name+"/releases"; - - // Charge last release - request(options, function (error, response, body) { - if (!error && response.statusCode == 200) { - data.releases = body; - data.emit('release'); - } - }); -}); - -data.on('release2', function () { - console.log(data.releases); - if (data.releases.length > 0) { - // lastRelease.tag = releases[0].tag_name; - // lastRelease.name = releases[0].name; +http.createServer(function (req, res) { + if (req.method == 'POST') { + var b = ''; + req.on('data', function (d) { + b += d; + }); + req.on('end', function () { + try { + var post = JSON.parse(b); + console.log(post); + res.writeHead(200, {"Content-Type": "text/plain"}); + res.end({"message": "Webhook received!"}); + return; + } catch (err) { + res.writeHead(500, {"Content-Type": "text/plain"}); + res.write("Bad Post Data."); + res.end(); + return; + } + }); } else { - // lastRelease.tag = "0.0.1"; - // lastRelease.name = "Release 0.0.1"; + res.end('not found'); } -}); +}).listen(8080); + +// for (var i=0; i < config.repositories.length; i++) { +// // Default options +// var options = { +// url: apiUrl+"/repos/"+config.repositories[i], +// method: "GET", +// headers: { +// 'Content-type': 'application/json', +// 'User-Agent': 'releaser-bot', +// 'Authorization': 'token '+config.token +// }, json: true +// }; +// +// // Check repos +// request(options, function (error, response, body) { +// if (!error && response.statusCode == 200) { +// data.json = body; +// data.emit('commit'); +// } +// }); +// } +// +// // Check last commit +// data.on('commit', function () { +// options.url = apiUrl+"/repos/"+data.json.full_name+"/commits"; +// +// // Charge last commit +// request(options, function (error, response, body) { +// if (!error && response.statusCode == 200) { +// console.log(body[0]); +// } +// }); +// }); +// +// // Check last release +// data.on('release', function () { +// options.url = apiUrl+"/repos/"+data.json.full_name+"/releases"; +// +// // Charge last release +// request(options, function (error, response, body) { +// if (!error && response.statusCode == 200) { +// data.releases = body; +// data.emit('release'); +// } +// }); +// }); +// +// data.on('release2', function () { +// console.log(data.releases); +// if (data.releases.length > 0) { +// // lastRelease.tag = releases[0].tag_name; +// // lastRelease.name = releases[0].name; +// } else { +// // lastRelease.tag = "0.0.1"; +// // lastRelease.name = "Release 0.0.1"; +// } +// }); From 24625eb278032373be2086125a66b4ef10665aac Mon Sep 17 00:00:00 2001 From: SimonDevelop Date: Tue, 15 Jan 2019 16:37:15 +0100 Subject: [PATCH 07/23] test: using random port --- server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.js b/server.js index 557c266..c5ea557 100644 --- a/server.js +++ b/server.js @@ -28,7 +28,7 @@ http.createServer(function (req, res) { } else { res.end('not found'); } -}).listen(8080); +}).listen(8989); // for (var i=0; i < config.repositories.length; i++) { // // Default options From 90dfc59e5cf4ac8d17d6b260dfc64985b0c2d963 Mon Sep 17 00:00:00 2001 From: SimonDevelop Date: Tue, 15 Jan 2019 17:21:00 +0100 Subject: [PATCH 08/23] test: change port --- server.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server.js b/server.js index c5ea557..97d4b26 100644 --- a/server.js +++ b/server.js @@ -15,11 +15,11 @@ http.createServer(function (req, res) { try { var post = JSON.parse(b); console.log(post); - res.writeHead(200, {"Content-Type": "text/plain"}); + res.writeHead(200, {"Content-Type": "application/json"}); res.end({"message": "Webhook received!"}); return; } catch (err) { - res.writeHead(500, {"Content-Type": "text/plain"}); + res.writeHead(500, {"Content-Type": "application/json"}); res.write("Bad Post Data."); res.end(); return; @@ -28,7 +28,7 @@ http.createServer(function (req, res) { } else { res.end('not found'); } -}).listen(8989); +}).listen(8989, "127.0.0.1"); // for (var i=0; i < config.repositories.length; i++) { // // Default options From 4246ebc6580ea163395d29ba42ed0cf5712d15f1 Mon Sep 17 00:00:00 2001 From: SimonDevelop Date: Tue, 15 Jan 2019 17:22:25 +0100 Subject: [PATCH 09/23] test: change port --- server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.js b/server.js index 97d4b26..ed5264c 100644 --- a/server.js +++ b/server.js @@ -28,7 +28,7 @@ http.createServer(function (req, res) { } else { res.end('not found'); } -}).listen(8989, "127.0.0.1"); +}).listen(9898, "127.0.0.1"); // for (var i=0; i < config.repositories.length; i++) { // // Default options From 207a8fd27cb2fa9943a911dcc5765b6a5e51435d Mon Sep 17 00:00:00 2001 From: SimonDevelop Date: Tue, 15 Jan 2019 17:32:08 +0100 Subject: [PATCH 10/23] test: test responses --- server.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/server.js b/server.js index ed5264c..5d953d1 100644 --- a/server.js +++ b/server.js @@ -14,13 +14,20 @@ http.createServer(function (req, res) { req.on('end', function () { try { var post = JSON.parse(b); + } catch (err) { + res.writeHead(500, {"Content-Type": "application/json"}); + res.write({"message": "Bad Post Data."}) + res.end(); + return; + } + if (typeof post != 'undefined') { console.log(post); res.writeHead(200, {"Content-Type": "application/json"}); res.end({"message": "Webhook received!"}); return; - } catch (err) { + } else { res.writeHead(500, {"Content-Type": "application/json"}); - res.write("Bad Post Data."); + res.write({"message": "Bad Post Data."}) res.end(); return; } From 68f35c5a0e5681d4453e325d641e4163e143942c Mon Sep 17 00:00:00 2001 From: SimonDevelop Date: Tue, 15 Jan 2019 17:35:40 +0100 Subject: [PATCH 11/23] test: test responses --- server.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/server.js b/server.js index 5d953d1..e0efb18 100644 --- a/server.js +++ b/server.js @@ -15,12 +15,9 @@ http.createServer(function (req, res) { try { var post = JSON.parse(b); } catch (err) { - res.writeHead(500, {"Content-Type": "application/json"}); - res.write({"message": "Bad Post Data."}) - res.end(); - return; + var post = 'undefined' } - if (typeof post != 'undefined') { + if (typeof post != 'undefined' && post != 'undefined') { console.log(post); res.writeHead(200, {"Content-Type": "application/json"}); res.end({"message": "Webhook received!"}); From 2e723b6e3d428768d510726d48a06535fe5333ed Mon Sep 17 00:00:00 2001 From: SimonDevelop Date: Tue, 15 Jan 2019 17:38:53 +0100 Subject: [PATCH 12/23] test: test responses and err --- server.js | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/server.js b/server.js index e0efb18..7a68b09 100644 --- a/server.js +++ b/server.js @@ -14,19 +14,14 @@ http.createServer(function (req, res) { req.on('end', function () { try { var post = JSON.parse(b); - } catch (err) { - var post = 'undefined' - } - if (typeof post != 'undefined' && post != 'undefined') { console.log(post); res.writeHead(200, {"Content-Type": "application/json"}); res.end({"message": "Webhook received!"}); - return; - } else { + } catch (err) { + console.log(err) res.writeHead(500, {"Content-Type": "application/json"}); - res.write({"message": "Bad Post Data."}) + res.write({"message": "Bad Post Data."}); res.end(); - return; } }); } else { From 543804a2bf97f41ce0fc62484172e73e01ac0cff Mon Sep 17 00:00:00 2001 From: SimonDevelop Date: Tue, 15 Jan 2019 17:41:37 +0100 Subject: [PATCH 13/23] fix: json string responses --- server.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/server.js b/server.js index 7a68b09..1f446c2 100644 --- a/server.js +++ b/server.js @@ -16,11 +16,12 @@ http.createServer(function (req, res) { var post = JSON.parse(b); console.log(post); res.writeHead(200, {"Content-Type": "application/json"}); - res.end({"message": "Webhook received!"}); + res.write('{"message": "Webhook received!"}'); + res.end(); } catch (err) { - console.log(err) + console.log(err); res.writeHead(500, {"Content-Type": "application/json"}); - res.write({"message": "Bad Post Data."}); + res.write('{"message": "Bad Post Data."}'); res.end(); } }); From e2599706b379cd9f88c941c8968e2afaf231a9e4 Mon Sep 17 00:00:00 2001 From: SimonDevelop Date: Tue, 15 Jan 2019 17:53:12 +0100 Subject: [PATCH 14/23] feat: system webhook --- server.js | 118 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 61 insertions(+), 57 deletions(-) diff --git a/server.js b/server.js index 1f446c2..1f4313a 100644 --- a/server.js +++ b/server.js @@ -14,7 +14,8 @@ http.createServer(function (req, res) { req.on('end', function () { try { var post = JSON.parse(b); - console.log(post); + console.log("webhook detected for "+post.repository.full_name); + checkRepos(post.repository.full_name); res.writeHead(200, {"Content-Type": "application/json"}); res.write('{"message": "Webhook received!"}'); res.end(); @@ -30,59 +31,62 @@ http.createServer(function (req, res) { } }).listen(9898, "127.0.0.1"); -// for (var i=0; i < config.repositories.length; i++) { -// // Default options -// var options = { -// url: apiUrl+"/repos/"+config.repositories[i], -// method: "GET", -// headers: { -// 'Content-type': 'application/json', -// 'User-Agent': 'releaser-bot', -// 'Authorization': 'token '+config.token -// }, json: true -// }; -// -// // Check repos -// request(options, function (error, response, body) { -// if (!error && response.statusCode == 200) { -// data.json = body; -// data.emit('commit'); -// } -// }); -// } -// -// // Check last commit -// data.on('commit', function () { -// options.url = apiUrl+"/repos/"+data.json.full_name+"/commits"; -// -// // Charge last commit -// request(options, function (error, response, body) { -// if (!error && response.statusCode == 200) { -// console.log(body[0]); -// } -// }); -// }); -// -// // Check last release -// data.on('release', function () { -// options.url = apiUrl+"/repos/"+data.json.full_name+"/releases"; -// -// // Charge last release -// request(options, function (error, response, body) { -// if (!error && response.statusCode == 200) { -// data.releases = body; -// data.emit('release'); -// } -// }); -// }); -// -// data.on('release2', function () { -// console.log(data.releases); -// if (data.releases.length > 0) { -// // lastRelease.tag = releases[0].tag_name; -// // lastRelease.name = releases[0].name; -// } else { -// // lastRelease.tag = "0.0.1"; -// // lastRelease.name = "Release 0.0.1"; -// } -// }); +function checkRepos(name) { + for (var i=0; i < config.repositories.length; i++) { + if (name == config.repositories[i]) { + // Default options + var options = { + url: apiUrl+"/repos/"+config.repositories[i], + method: "GET", + headers: { + 'Content-type': 'application/json', + 'User-Agent': 'releaser-bot', + 'Authorization': 'token '+config.token + }, json: true + }; + // Check repos + request(options, function (error, response, body) { + if (!error && response.statusCode == 200) { + data.json = body; + data.emit('commit'); + } + }); + } + } +} + +// Check last commit +data.on('commit', function () { + options.url = apiUrl+"/repos/"+data.json.full_name+"/commits"; + + // Charge last commit + request(options, function (error, response, body) { + if (!error && response.statusCode == 200) { + console.log(body[0]); + } + }); +}); + +// Check last release +data.on('release', function () { + options.url = apiUrl+"/repos/"+data.json.full_name+"/releases"; + + // Charge last release + request(options, function (error, response, body) { + if (!error && response.statusCode == 200) { + data.releases = body; + data.emit('release'); + } + }); +}); + +data.on('release2', function () { + console.log(data.releases); + if (data.releases.length > 0) { + // lastRelease.tag = releases[0].tag_name; + // lastRelease.name = releases[0].name; + } else { + // lastRelease.tag = "0.0.1"; + // lastRelease.name = "Release 0.0.1"; + } +}); From 1d62ec10e4164a9ca7153042864465d51f164f2b Mon Sep 17 00:00:00 2001 From: Simon Micheneau Date: Tue, 15 Jan 2019 21:25:12 +0100 Subject: [PATCH 15/23] fix: portability correction of query options --- server.js | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/server.js b/server.js index 1f4313a..6b172db 100644 --- a/server.js +++ b/server.js @@ -5,6 +5,16 @@ var EventEmitter = require("events").EventEmitter; var data = new EventEmitter(); var apiUrl = "https://api.github.com"; +// Default options +var options = { + method: "GET", + headers: { + 'Content-type': 'application/json', + 'User-Agent': 'releaser-bot', + 'Authorization': 'token '+config.token + }, json: true +}; + http.createServer(function (req, res) { if (req.method == 'POST') { var b = ''; @@ -34,16 +44,7 @@ http.createServer(function (req, res) { function checkRepos(name) { for (var i=0; i < config.repositories.length; i++) { if (name == config.repositories[i]) { - // Default options - var options = { - url: apiUrl+"/repos/"+config.repositories[i], - method: "GET", - headers: { - 'Content-type': 'application/json', - 'User-Agent': 'releaser-bot', - 'Authorization': 'token '+config.token - }, json: true - }; + options.url = apiUrl+"/repos/"+config.repositories[i]; // Check repos request(options, function (error, response, body) { if (!error && response.statusCode == 200) { From f15a746e95012525e2ac59f14f218708900de12c Mon Sep 17 00:00:00 2001 From: Simon Micheneau Date: Tue, 15 Jan 2019 22:09:24 +0100 Subject: [PATCH 16/23] feat: detection of the commit message --- README.md | 10 +++++++++- config.example.json | 1 + server.js | 19 ++++++++++++------- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 08b8d22..15e96f5 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,25 @@ [![Minimum Node Version](https://img.shields.io/badge/node-%3E%3D%206-brightgreen.svg)](https://nodejs.org/en/) [![GitHub license](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/SimonDevelop/releaser-bot/blob/master/LICENSE) # releaser-bot +Simple bot that handles release generation on github projects. + +## How it works +The bot will just listen to the webhooks of your projects github, is a push is detect and the message of the commit corresponds to the one configured in your config.json, it will create a new release on this commit. ## Install ```bash $ npm install $ cp config.example.json config.json ``` -Edit `config.json` for the github API key of bot account and your github repositories. +Edit `config.json` for your personal token github of bot account, trigger commit message and your github repositories. ## Run ```bash $ npm start ``` +## Webhooks +Add the address of your nodejs server to the webhooks of your github projects classified in your config.json file. +Specify the content type on application/json and check `Just the push event.`. + ### Work in progress... diff --git a/config.example.json b/config.example.json index 516a251..4973092 100644 --- a/config.example.json +++ b/config.example.json @@ -1,5 +1,6 @@ { "token": "", + "commitMessage": "", "repositories": [ "/" ] diff --git a/server.js b/server.js index 6b172db..3565bbd 100644 --- a/server.js +++ b/server.js @@ -5,7 +5,7 @@ var EventEmitter = require("events").EventEmitter; var data = new EventEmitter(); var apiUrl = "https://api.github.com"; -// Default options +// Default request options var options = { method: "GET", headers: { @@ -15,6 +15,7 @@ var options = { }, json: true }; +// Server for webhooks http.createServer(function (req, res) { if (req.method == 'POST') { var b = ''; @@ -41,11 +42,12 @@ http.createServer(function (req, res) { } }).listen(9898, "127.0.0.1"); +// Check repos function checkRepos(name) { for (var i=0; i < config.repositories.length; i++) { if (name == config.repositories[i]) { options.url = apiUrl+"/repos/"+config.repositories[i]; - // Check repos + // Charge repos request(options, function (error, response, body) { if (!error && response.statusCode == 200) { data.json = body; @@ -59,11 +61,15 @@ function checkRepos(name) { // Check last commit data.on('commit', function () { options.url = apiUrl+"/repos/"+data.json.full_name+"/commits"; - // Charge last commit request(options, function (error, response, body) { if (!error && response.statusCode == 200) { - console.log(body[0]); + if (body.commit.message == config.commitMessage) { + data.commit = body.sha.substr(0, 6); + data.emit('release'); + } else { + console.log("last commit is not new release"); + } } }); }); @@ -71,17 +77,16 @@ data.on('commit', function () { // Check last release data.on('release', function () { options.url = apiUrl+"/repos/"+data.json.full_name+"/releases"; - // Charge last release request(options, function (error, response, body) { if (!error && response.statusCode == 200) { data.releases = body; - data.emit('release'); + data.emit('create'); } }); }); -data.on('release2', function () { +data.on('create', function () { console.log(data.releases); if (data.releases.length > 0) { // lastRelease.tag = releases[0].tag_name; From 1ea83618de0262a20cbe61dd83f18b5e77752891 Mon Sep 17 00:00:00 2001 From: Simon Micheneau Date: Tue, 15 Jan 2019 22:12:55 +0100 Subject: [PATCH 17/23] fix: json reading --- server.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server.js b/server.js index 3565bbd..c0fb642 100644 --- a/server.js +++ b/server.js @@ -64,8 +64,8 @@ data.on('commit', function () { // Charge last commit request(options, function (error, response, body) { if (!error && response.statusCode == 200) { - if (body.commit.message == config.commitMessage) { - data.commit = body.sha.substr(0, 6); + if (body[0].commit.message == config.commitMessage) { + data.commit = body[0].sha.substr(0, 6); data.emit('release'); } else { console.log("last commit is not new release"); From 49f1025019be3a2109888e56905dd52ce1e08ce2 Mon Sep 17 00:00:00 2001 From: Simon Micheneau Date: Tue, 15 Jan 2019 22:54:26 +0100 Subject: [PATCH 18/23] feat: checking release type in the commit message --- server.js | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/server.js b/server.js index c0fb642..9fd9ab7 100644 --- a/server.js +++ b/server.js @@ -64,7 +64,8 @@ data.on('commit', function () { // Charge last commit request(options, function (error, response, body) { if (!error && response.statusCode == 200) { - if (body[0].commit.message == config.commitMessage) { + var regMessage = new RegExp(config.commitMessage, "gi"); + if (body[0].commit.message.match(regMessage) != null) { data.commit = body[0].sha.substr(0, 6); data.emit('release'); } else { @@ -86,13 +87,30 @@ data.on('release', function () { }); }); +// Create new release data.on('create', function () { - console.log(data.releases); + var newRelease = {}; + var lastRelease = ''; if (data.releases.length > 0) { - // lastRelease.tag = releases[0].tag_name; - // lastRelease.name = releases[0].name; + lastRelease = releases[0].tag_name; + var splited = lastRelease.split("."); + var major = parseInt(splited[0]); + var minor = parseInt(splited[1]); + var patch = parseInt(splited[2]); + + var regMessageMajor = new RegExp("major", "gi"); + var regMessageMinor = new RegExp("minor", "gi"); + if (releases[0].body.match(regMessageMajor) != null) { + major++; + } else if (releases[0].body.match(regMessageMinor) != null) { + minor++; + } else { + patch++; + } + newRelease.tag = major+"."+minor+"."+patch; + newRelease.name = "Release "+major+"."+minor+"."+patch; } else { - // lastRelease.tag = "0.0.1"; - // lastRelease.name = "Release 0.0.1"; + newRelease.tag = "0.0.1"; + newRelease.name = "Release 0.0.1"; } }); From 7550afe1987adea33c8fec473034e9815eee5a72 Mon Sep 17 00:00:00 2001 From: SimonDevelop Date: Wed, 16 Jan 2019 09:11:54 +0100 Subject: [PATCH 19/23] fix: releases storage variable --- server.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server.js b/server.js index 9fd9ab7..762ce53 100644 --- a/server.js +++ b/server.js @@ -92,7 +92,7 @@ data.on('create', function () { var newRelease = {}; var lastRelease = ''; if (data.releases.length > 0) { - lastRelease = releases[0].tag_name; + lastRelease = data.releases[0].tag_name; var splited = lastRelease.split("."); var major = parseInt(splited[0]); var minor = parseInt(splited[1]); @@ -100,9 +100,9 @@ data.on('create', function () { var regMessageMajor = new RegExp("major", "gi"); var regMessageMinor = new RegExp("minor", "gi"); - if (releases[0].body.match(regMessageMajor) != null) { + if (data.releases[0].body.match(regMessageMajor) != null) { major++; - } else if (releases[0].body.match(regMessageMinor) != null) { + } else if (data.releases[0].body.match(regMessageMinor) != null) { minor++; } else { patch++; From b67ee0f9c91a7a04077616c11d12061e78292d1f Mon Sep 17 00:00:00 2001 From: SimonDevelop Date: Wed, 16 Jan 2019 09:38:53 +0100 Subject: [PATCH 20/23] feat: Creating basic release without description --- server.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/server.js b/server.js index 762ce53..9c01a0d 100644 --- a/server.js +++ b/server.js @@ -113,4 +113,22 @@ data.on('create', function () { newRelease.tag = "0.0.1"; newRelease.name = "Release 0.0.1"; } + + // Request for create new release + options.url = apiUrl+"/repos/"+data.json.full_name+"/releases"; + options.json = { + "tag_name": newRelease.tag, + "target_commitish": "master", + "name": newRelease.name, + "body": "", + "draft": false, + "prerelease": false + }; + request(options, function (error, response, body) { + if (!error && response.statusCode == 200) { + console.log(newRelease.name+" for "+data.json.full_name+" is created!"); + } else { + console.log("Creating "+newRelease.name+" for "+data.json.full_name+" is failed!"); + } + }); }); From 31a45e0f519f928a48dd3aeb81a8200a96f8bde9 Mon Sep 17 00:00:00 2001 From: SimonDevelop Date: Wed, 16 Jan 2019 09:43:26 +0100 Subject: [PATCH 21/23] fix: method request --- server.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server.js b/server.js index 9c01a0d..b6aca1d 100644 --- a/server.js +++ b/server.js @@ -115,6 +115,7 @@ data.on('create', function () { } // Request for create new release + options.method = "POST"; options.url = apiUrl+"/repos/"+data.json.full_name+"/releases"; options.json = { "tag_name": newRelease.tag, @@ -131,4 +132,5 @@ data.on('create', function () { console.log("Creating "+newRelease.name+" for "+data.json.full_name+" is failed!"); } }); + options.method = "GET"; }); From ceee6c7de284546ed1369698e8d4322717f95418 Mon Sep 17 00:00:00 2001 From: SimonDevelop Date: Wed, 16 Jan 2019 09:50:57 +0100 Subject: [PATCH 22/23] fix: Checking last commit register and response status 201 --- server.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server.js b/server.js index b6aca1d..7d51a49 100644 --- a/server.js +++ b/server.js @@ -65,7 +65,8 @@ data.on('commit', function () { request(options, function (error, response, body) { if (!error && response.statusCode == 200) { var regMessage = new RegExp(config.commitMessage, "gi"); - if (body[0].commit.message.match(regMessage) != null) { + if (body[0].commit.message.match(regMessage) != null + && (typeof data.commit == "undefined" || data.commit != body[0].sha.substr(0, 6))) { data.commit = body[0].sha.substr(0, 6); data.emit('release'); } else { @@ -126,7 +127,7 @@ data.on('create', function () { "prerelease": false }; request(options, function (error, response, body) { - if (!error && response.statusCode == 200) { + if (!error && response.statusCode == 201) { console.log(newRelease.name+" for "+data.json.full_name+" is created!"); } else { console.log("Creating "+newRelease.name+" for "+data.json.full_name+" is failed!"); From ab27e18447d7e3044419078b9cc7f98f38e94804 Mon Sep 17 00:00:00 2001 From: SimonDevelop Date: Wed, 16 Jan 2019 09:59:36 +0100 Subject: [PATCH 23/23] First Release --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 15e96f5..f00ab87 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![version](https://img.shields.io/badge/Version-0.0.0-brightgreen.svg)](https://github.com/SimonDevelop/releaser-bot/releases/tag/0.0.0) +[![version](https://img.shields.io/badge/Version-0.1.0-brightgreen.svg)](https://github.com/SimonDevelop/releaser-bot/releases/tag/0.1.0) [![Minimum Node Version](https://img.shields.io/badge/node-%3E%3D%206-brightgreen.svg)](https://nodejs.org/en/) [![GitHub license](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/SimonDevelop/releaser-bot/blob/master/LICENSE) # releaser-bot @@ -7,6 +7,8 @@ Simple bot that handles release generation on github projects. ## How it works The bot will just listen to the webhooks of your projects github, is a push is detect and the message of the commit corresponds to the one configured in your config.json, it will create a new release on this commit. +With your type message commit in config.json, use `patch`, `minor` and `major` to specify the release. + ## Install ```bash $ npm install @@ -23,4 +25,6 @@ $ npm start Add the address of your nodejs server to the webhooks of your github projects classified in your config.json file. Specify the content type on application/json and check `Just the push event.`. -### Work in progress... +## TODO + - [x] Simple release creation + - [ ] Add description release