gitlab-radiator 3.4.1 → 3.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +29 -29
- package/public/client.js +1 -1
- package/src/app.js +1 -41
- package/src/auth.js +4 -8
- package/src/config.js +0 -12
- package/src/gitlab/client.js +0 -11
- package/src/gitlab/index.js +0 -30
- package/src/gitlab/pipelines.js +4 -80
- package/src/gitlab/projects.js +2 -28
- package/src/gitlab/runners.js +0 -13
package/src/app.js
CHANGED
|
@@ -1,55 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
6
|
-
|
|
7
5
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
8
|
-
|
|
9
6
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
10
|
-
|
|
11
7
|
var _auth = require("./auth");
|
|
12
|
-
|
|
13
8
|
var _compression = _interopRequireDefault(require("compression"));
|
|
14
|
-
|
|
15
9
|
var _config = require("./config");
|
|
16
|
-
|
|
17
10
|
var _express = _interopRequireDefault(require("express"));
|
|
18
|
-
|
|
19
11
|
var _runners = require("./gitlab/runners");
|
|
20
|
-
|
|
21
12
|
var _http = _interopRequireDefault(require("http"));
|
|
22
|
-
|
|
23
13
|
var _lessMiddleware = _interopRequireDefault(require("less-middleware"));
|
|
24
|
-
|
|
25
14
|
var _os = _interopRequireDefault(require("os"));
|
|
26
|
-
|
|
27
15
|
var _path = _interopRequireDefault(require("path"));
|
|
28
|
-
|
|
29
16
|
var _socket = _interopRequireDefault(require("socket.io"));
|
|
30
|
-
|
|
31
17
|
var _gitlab = require("./gitlab");
|
|
32
|
-
|
|
33
18
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
34
|
-
|
|
35
19
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
36
|
-
|
|
37
20
|
var cacheDir = _path.default.join(_os.default.tmpdir(), 'gitlab-radiator-css-cache');
|
|
38
|
-
|
|
39
21
|
var app = (0, _express.default)();
|
|
40
|
-
|
|
41
22
|
var httpServer = _http.default.Server(app);
|
|
42
|
-
|
|
43
23
|
var socketIoServer = (0, _socket.default)(httpServer);
|
|
44
|
-
|
|
45
24
|
if (process.env.NODE_ENV !== 'production') {
|
|
46
25
|
// eslint-disable-next-line global-require
|
|
47
26
|
var _require = require('./dev-assets'),
|
|
48
|
-
|
|
49
|
-
|
|
27
|
+
bindDevAssets = _require.bindDevAssets;
|
|
50
28
|
bindDevAssets(app);
|
|
51
29
|
}
|
|
52
|
-
|
|
53
30
|
app.disable('x-powered-by');
|
|
54
31
|
app.use((0, _lessMiddleware.default)("".concat(__dirname, "/../public"), {
|
|
55
32
|
dest: cacheDir,
|
|
@@ -82,11 +59,9 @@ var globalState = {
|
|
|
82
59
|
socketIoServer.on('connection', socket => {
|
|
83
60
|
socket.emit('state', withDate(globalState));
|
|
84
61
|
});
|
|
85
|
-
|
|
86
62
|
function runUpdate() {
|
|
87
63
|
return _runUpdate.apply(this, arguments);
|
|
88
64
|
}
|
|
89
|
-
|
|
90
65
|
function _runUpdate() {
|
|
91
66
|
_runUpdate = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
|
|
92
67
|
return _regenerator.default.wrap(function _callee$(_context) {
|
|
@@ -96,18 +71,15 @@ function _runUpdate() {
|
|
|
96
71
|
_context.prev = 0;
|
|
97
72
|
_context.next = 3;
|
|
98
73
|
return (0, _gitlab.update)(_config.config);
|
|
99
|
-
|
|
100
74
|
case 3:
|
|
101
75
|
globalState.projects = _context.sent;
|
|
102
76
|
_context.next = 6;
|
|
103
77
|
return errorIfRunnerOffline();
|
|
104
|
-
|
|
105
78
|
case 6:
|
|
106
79
|
globalState.error = _context.sent;
|
|
107
80
|
socketIoServer.emit('state', withDate(globalState));
|
|
108
81
|
_context.next = 15;
|
|
109
82
|
break;
|
|
110
|
-
|
|
111
83
|
case 10:
|
|
112
84
|
_context.prev = 10;
|
|
113
85
|
_context.t0 = _context["catch"](0);
|
|
@@ -115,10 +87,8 @@ function _runUpdate() {
|
|
|
115
87
|
console.error(_context.t0.message);
|
|
116
88
|
globalState.error = "Failed to communicate with GitLab API: ".concat(_context.t0.message);
|
|
117
89
|
socketIoServer.emit('state', withDate(globalState));
|
|
118
|
-
|
|
119
90
|
case 15:
|
|
120
91
|
setTimeout(runUpdate, _config.config.interval);
|
|
121
|
-
|
|
122
92
|
case 16:
|
|
123
93
|
case "end":
|
|
124
94
|
return _context.stop();
|
|
@@ -128,22 +98,18 @@ function _runUpdate() {
|
|
|
128
98
|
}));
|
|
129
99
|
return _runUpdate.apply(this, arguments);
|
|
130
100
|
}
|
|
131
|
-
|
|
132
101
|
function errorIfRunnerOffline() {
|
|
133
102
|
return _errorIfRunnerOffline.apply(this, arguments);
|
|
134
103
|
}
|
|
135
|
-
|
|
136
104
|
function _errorIfRunnerOffline() {
|
|
137
105
|
_errorIfRunnerOffline = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
|
|
138
106
|
var offlineRunnersPerGitlab, _offlineRunnersPerGit, offline, totalCount, names, counts;
|
|
139
|
-
|
|
140
107
|
return _regenerator.default.wrap(function _callee2$(_context2) {
|
|
141
108
|
while (1) {
|
|
142
109
|
switch (_context2.prev = _context2.next) {
|
|
143
110
|
case 0:
|
|
144
111
|
_context2.next = 2;
|
|
145
112
|
return Promise.all(_config.config.gitlabs.map(_runners.fetchOfflineRunners));
|
|
146
|
-
|
|
147
113
|
case 2:
|
|
148
114
|
offlineRunnersPerGitlab = _context2.sent;
|
|
149
115
|
_offlineRunnersPerGit = offlineRunnersPerGitlab.reduce((acc, runner) => {
|
|
@@ -155,19 +121,15 @@ function _errorIfRunnerOffline() {
|
|
|
155
121
|
offline: [],
|
|
156
122
|
totalCount: 0
|
|
157
123
|
}), offline = _offlineRunnersPerGit.offline, totalCount = _offlineRunnersPerGit.totalCount;
|
|
158
|
-
|
|
159
124
|
if (!(offline.length > 0)) {
|
|
160
125
|
_context2.next = 8;
|
|
161
126
|
break;
|
|
162
127
|
}
|
|
163
|
-
|
|
164
128
|
names = offline.map(r => r.name).sort().join(', ');
|
|
165
129
|
counts = offline.length === totalCount ? 'All' : "".concat(offline.length, "/").concat(totalCount);
|
|
166
130
|
return _context2.abrupt("return", "".concat(counts, " runners offline: ").concat(names));
|
|
167
|
-
|
|
168
131
|
case 8:
|
|
169
132
|
return _context2.abrupt("return", null);
|
|
170
|
-
|
|
171
133
|
case 9:
|
|
172
134
|
case "end":
|
|
173
135
|
return _context2.stop();
|
|
@@ -177,9 +139,7 @@ function _errorIfRunnerOffline() {
|
|
|
177
139
|
}));
|
|
178
140
|
return _errorIfRunnerOffline.apply(this, arguments);
|
|
179
141
|
}
|
|
180
|
-
|
|
181
142
|
runUpdate();
|
|
182
|
-
|
|
183
143
|
function withDate(state) {
|
|
184
144
|
return _objectSpread(_objectSpread({}, state), {}, {
|
|
185
145
|
now: Date.now()
|
package/src/auth.js
CHANGED
|
@@ -1,28 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.basicAuth = basicAuth;
|
|
9
|
-
|
|
10
8
|
var _basicAuth = _interopRequireDefault(require("basic-auth"));
|
|
11
|
-
|
|
12
9
|
function basicAuth(auth) {
|
|
13
10
|
if (!auth || !auth.username || !auth.password) {
|
|
14
11
|
// eslint-disable-next-line no-console
|
|
15
12
|
console.log('No authentication configured');
|
|
16
13
|
return (req, res, next) => next();
|
|
17
|
-
}
|
|
18
|
-
|
|
14
|
+
}
|
|
19
15
|
|
|
16
|
+
// eslint-disable-next-line no-console
|
|
20
17
|
console.log('HTTP basic auth enabled');
|
|
21
18
|
return (req, res, next) => {
|
|
22
19
|
var _ref = (0, _basicAuth.default)(req) || {},
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
name = _ref.name,
|
|
21
|
+
pass = _ref.pass;
|
|
26
22
|
if (auth.username === name && auth.password === pass) {
|
|
27
23
|
next();
|
|
28
24
|
} else {
|
package/src/config.js
CHANGED
|
@@ -1,24 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.config = void 0;
|
|
9
|
-
|
|
10
8
|
var _assert = _interopRequireDefault(require("assert"));
|
|
11
|
-
|
|
12
9
|
var _fs = _interopRequireDefault(require("fs"));
|
|
13
|
-
|
|
14
10
|
var _os = _interopRequireDefault(require("os"));
|
|
15
|
-
|
|
16
11
|
var _jsYaml = _interopRequireDefault(require("js-yaml"));
|
|
17
|
-
|
|
18
12
|
var configFile = expandTilde(process.env.GITLAB_RADIATOR_CONFIG || '~/.gitlab-radiator.yml');
|
|
19
|
-
|
|
20
13
|
var yamlContent = _fs.default.readFileSync(configFile, 'utf8');
|
|
21
|
-
|
|
22
14
|
var config = validate(_jsYaml.default.load(yamlContent));
|
|
23
15
|
exports.config = config;
|
|
24
16
|
config.interval = Number(config.interval || 10) * 1000;
|
|
@@ -42,17 +34,13 @@ config.gitlabs = config.gitlabs.map(gitlab => {
|
|
|
42
34
|
};
|
|
43
35
|
});
|
|
44
36
|
config.colors = config.colors || {};
|
|
45
|
-
|
|
46
37
|
function expandTilde(path) {
|
|
47
38
|
return path.replace(/^~($|\/|\\)/, "".concat(_os.default.homedir(), "$1"));
|
|
48
39
|
}
|
|
49
|
-
|
|
50
40
|
function validate(cfg) {
|
|
51
41
|
_assert.default.ok(cfg.gitlabs, 'Mandatory gitlab properties missing from configuration file');
|
|
52
|
-
|
|
53
42
|
cfg.gitlabs.forEach(gitlab => {
|
|
54
43
|
_assert.default.ok(gitlab.url, 'Mandatory gitlab url missing from configuration file');
|
|
55
|
-
|
|
56
44
|
_assert.default.ok(gitlab['access-token'] || process.env.GITLAB_ACCESS_TOKEN, 'Mandatory gitlab access token missing from configuration (and none present at GITLAB_ACCESS_TOKEN env variable)');
|
|
57
45
|
});
|
|
58
46
|
return cfg;
|
package/src/gitlab/client.js
CHANGED
|
@@ -1,34 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.gitlabRequest = gitlabRequest;
|
|
9
|
-
|
|
10
8
|
var _axios = _interopRequireDefault(require("axios"));
|
|
11
|
-
|
|
12
9
|
var _https = _interopRequireDefault(require("https"));
|
|
13
|
-
|
|
14
10
|
var _url = _interopRequireDefault(require("url"));
|
|
15
|
-
|
|
16
11
|
function gitlabRequest(path, params, gitlab) {
|
|
17
12
|
return lazyClient(gitlab).get(path, {
|
|
18
13
|
params
|
|
19
14
|
});
|
|
20
15
|
}
|
|
21
|
-
|
|
22
16
|
var clients = new Map();
|
|
23
|
-
|
|
24
17
|
function lazyClient(gitlab) {
|
|
25
18
|
var gitlabUrl = gitlab.url;
|
|
26
|
-
|
|
27
19
|
if (gitlabUrl === undefined) {
|
|
28
20
|
// eslint-disable-next-line no-console
|
|
29
21
|
console.log('Got undefined url for ' + JSON.stringify(gitlab));
|
|
30
22
|
}
|
|
31
|
-
|
|
32
23
|
if (!clients.get(gitlabUrl)) {
|
|
33
24
|
var client = _axios.default.create({
|
|
34
25
|
baseURL: _url.default.resolve(gitlabUrl, '/api/v4/'),
|
|
@@ -41,9 +32,7 @@ function lazyClient(gitlab) {
|
|
|
41
32
|
}),
|
|
42
33
|
timeout: 30 * 1000
|
|
43
34
|
});
|
|
44
|
-
|
|
45
35
|
clients.set(gitlabUrl, client);
|
|
46
36
|
}
|
|
47
|
-
|
|
48
37
|
return clients.get(gitlabUrl);
|
|
49
38
|
}
|
package/src/gitlab/index.js
CHANGED
|
@@ -1,34 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.update = update;
|
|
9
|
-
|
|
10
8
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
11
|
-
|
|
12
9
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
13
|
-
|
|
14
10
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
15
|
-
|
|
16
11
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
17
|
-
|
|
18
12
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
19
|
-
|
|
20
13
|
var _pipelines = require("./pipelines");
|
|
21
|
-
|
|
22
14
|
var _projects = require("./projects");
|
|
23
|
-
|
|
24
15
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
25
|
-
|
|
26
16
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
27
|
-
|
|
28
17
|
function update(_x) {
|
|
29
18
|
return _update.apply(this, arguments);
|
|
30
19
|
}
|
|
31
|
-
|
|
32
20
|
function _update() {
|
|
33
21
|
_update = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(config) {
|
|
34
22
|
var projectsWithPipelines;
|
|
@@ -38,11 +26,9 @@ function _update() {
|
|
|
38
26
|
case 0:
|
|
39
27
|
_context.next = 2;
|
|
40
28
|
return loadProjectsWithPipelines(config);
|
|
41
|
-
|
|
42
29
|
case 2:
|
|
43
30
|
projectsWithPipelines = _context.sent;
|
|
44
31
|
return _context.abrupt("return", projectsWithPipelines.filter(project => project.pipelines.length > 0));
|
|
45
|
-
|
|
46
32
|
case 4:
|
|
47
33
|
case "end":
|
|
48
34
|
return _context.stop();
|
|
@@ -52,11 +38,9 @@ function _update() {
|
|
|
52
38
|
}));
|
|
53
39
|
return _update.apply(this, arguments);
|
|
54
40
|
}
|
|
55
|
-
|
|
56
41
|
function loadProjectsWithPipelines(_x2) {
|
|
57
42
|
return _loadProjectsWithPipelines.apply(this, arguments);
|
|
58
43
|
}
|
|
59
|
-
|
|
60
44
|
function _loadProjectsWithPipelines() {
|
|
61
45
|
_loadProjectsWithPipelines = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(config) {
|
|
62
46
|
var allProjectsWithPipelines;
|
|
@@ -75,7 +59,6 @@ function _loadProjectsWithPipelines() {
|
|
|
75
59
|
case 0:
|
|
76
60
|
_context2.next = 2;
|
|
77
61
|
return (0, _projects.fetchProjects)(gitlab);
|
|
78
|
-
|
|
79
62
|
case 2:
|
|
80
63
|
projects = _context2.sent;
|
|
81
64
|
projects.forEach(project => {
|
|
@@ -83,11 +66,9 @@ function _loadProjectsWithPipelines() {
|
|
|
83
66
|
});
|
|
84
67
|
_context2.next = 6;
|
|
85
68
|
return Promise.all(projects.map(project => projectWithPipelines(project, gitlab)));
|
|
86
|
-
|
|
87
69
|
case 6:
|
|
88
70
|
projectsWithPipelines = _context2.sent;
|
|
89
71
|
allProjectsWithPipelines.push.apply(allProjectsWithPipelines, (0, _toConsumableArray2.default)(projectsWithPipelines));
|
|
90
|
-
|
|
91
72
|
case 8:
|
|
92
73
|
case "end":
|
|
93
74
|
return _context2.stop();
|
|
@@ -95,15 +76,12 @@ function _loadProjectsWithPipelines() {
|
|
|
95
76
|
}
|
|
96
77
|
}, _callee2);
|
|
97
78
|
}));
|
|
98
|
-
|
|
99
79
|
return function (_x5) {
|
|
100
80
|
return _ref.apply(this, arguments);
|
|
101
81
|
};
|
|
102
82
|
}()));
|
|
103
|
-
|
|
104
83
|
case 3:
|
|
105
84
|
return _context3.abrupt("return", allProjectsWithPipelines);
|
|
106
|
-
|
|
107
85
|
case 4:
|
|
108
86
|
case "end":
|
|
109
87
|
return _context3.stop();
|
|
@@ -113,11 +91,9 @@ function _loadProjectsWithPipelines() {
|
|
|
113
91
|
}));
|
|
114
92
|
return _loadProjectsWithPipelines.apply(this, arguments);
|
|
115
93
|
}
|
|
116
|
-
|
|
117
94
|
function projectWithPipelines(_x3, _x4) {
|
|
118
95
|
return _projectWithPipelines.apply(this, arguments);
|
|
119
96
|
}
|
|
120
|
-
|
|
121
97
|
function _projectWithPipelines() {
|
|
122
98
|
_projectWithPipelines = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(project, config) {
|
|
123
99
|
var pipelines, status;
|
|
@@ -128,7 +104,6 @@ function _projectWithPipelines() {
|
|
|
128
104
|
_context4.t0 = filterOutEmpty;
|
|
129
105
|
_context4.next = 3;
|
|
130
106
|
return (0, _pipelines.fetchLatestPipelines)(project.id, config);
|
|
131
|
-
|
|
132
107
|
case 3:
|
|
133
108
|
_context4.t1 = _context4.sent;
|
|
134
109
|
pipelines = (0, _context4.t0)(_context4.t1).filter(excludePipelineStatusFilter(config));
|
|
@@ -137,7 +112,6 @@ function _projectWithPipelines() {
|
|
|
137
112
|
pipelines,
|
|
138
113
|
status
|
|
139
114
|
}));
|
|
140
|
-
|
|
141
115
|
case 7:
|
|
142
116
|
case "end":
|
|
143
117
|
return _context4.stop();
|
|
@@ -147,23 +121,19 @@ function _projectWithPipelines() {
|
|
|
147
121
|
}));
|
|
148
122
|
return _projectWithPipelines.apply(this, arguments);
|
|
149
123
|
}
|
|
150
|
-
|
|
151
124
|
function defaultBranchStatus(project, pipelines) {
|
|
152
125
|
return (0, _lodash.default)(pipelines).filter({
|
|
153
126
|
ref: project.default_branch
|
|
154
127
|
}).map('status').head();
|
|
155
128
|
}
|
|
156
|
-
|
|
157
129
|
function filterOutEmpty(pipelines) {
|
|
158
130
|
return pipelines.filter(pipeline => pipeline.stages);
|
|
159
131
|
}
|
|
160
|
-
|
|
161
132
|
function excludePipelineStatusFilter(config) {
|
|
162
133
|
return pipeline => {
|
|
163
134
|
if (config.projects && config.projects.excludePipelineStatus) {
|
|
164
135
|
return !config.projects.excludePipelineStatus.includes(pipeline.status);
|
|
165
136
|
}
|
|
166
|
-
|
|
167
137
|
return true;
|
|
168
138
|
};
|
|
169
139
|
}
|