-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
130 lines (105 loc) · 4.01 KB
/
index.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
const fs = require('fs');
const runGitChecks = require('@wolox/git-metrics');
const axios = require('axios');
const shell = require('shelljs');
const rimraf = require('rimraf');
require('dotenv').config();
const PWD = process.cwd();
const OAUTH_TOKEN = process.env.GITHUB_OAUTH_TOKEN;
const oneMillion = 1000000;
const hundread = 100;
const api = axios.create({
baseURL: process.env.API_BASE_URL,
timeout: 10000,
headers: { Authorization: process.env.API_KEY }
});
// eslint-disable-next-line no-magic-numbers, no-mixed-operators
const calculatePercentage = (points) => 224.888 - 25.564 * Math.log(201.242 * points - 130.662);
const pointsToPercentage = (points) => {
const result = calculatePercentage(points / oneMillion);
if (isNaN(result) || result > hundread) {
return hundread;
}
if (result < 0) {
return 0;
}
return result;
};
const groupIssuesInFiles = (acc, { location, remediation_points: remediationPoints }) => {
if (!remediationPoints) {
return acc;
}
const { path } = location;
const points = (acc[path] || 0) + remediationPoints;
return { ...acc, [path]: points };
};
const runCodeclimate = (repoName) =>
`docker run \
--env CODECLIMATE_CODE="${process.env.HOST_PATH}/projects/${repoName}" \
--volume "${process.env.HOST_PATH}/projects/${repoName}":/code \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume /tmp/cc:/tmp/cc wolox/codeclimate \
> "./projects/${repoName}/code_quality.json"`
function executeCodeClimate(repoName) {
shell.exec(`${runCodeclimate(repoName)}`)
try {
const data = JSON.parse(fs.readFileSync(`./projects/${repoName}/code_quality.json`));
const reducedByPaths = data.reduce(groupIssuesInFiles, {});
const percentages = Object.values(reducedByPaths).map((points) => pointsToPercentage(points));
const resultForFilesWithIssues = percentages.reduce((acc, elem) => acc + elem, 0) / percentages.length;
return { name: 'code-quality', value: resultForFilesWithIssues, version: '1.0' };
} catch (e) {
console.error(e);
return { name: 'code-quality', value: NaN, version: '1.0' };
}
}
function getCoveragePercentage(repoName) {
try {
const data = JSON.parse(fs.readFileSync(`./projects/${repoName}/code_coverage.json`));
return { name: 'code-coverage', value: data.lines, version: '1.0' };
} catch (e) {
console.error(e);
return { name: 'code-coverage', value: NaN, version: '1.0' };
}
}
async function getAllMetrics({ repoName, org = 'wolox', provider = 'github', tech, id }) {
const codeQuality = executeCodeClimate(repoName);
const codeCoverage = getCoveragePercentage(repoName);
const gitMetrics = await runGitChecks(provider, OAUTH_TOKEN)(repoName, org);
const pullRequestBody = { pull_requests: gitMetrics.filter((pr) => pr.review_time && pr.pick_up_time) };
api
.post(`/repositories/${id}/pull_requests`, pullRequestBody, { headers: { Authorization: apiKey } })
.catch(error => console.log(`Error: ${error}`));
const metrics = [codeQuality, codeCoverage].filter(({ value }) => !isNaN(value));
const body = {
env: 'development',
tech,
repo_name: repoName,
metrics
};
console.log('Metricas a persistir', body);
api
.post('/metrics', body, { headers: { Authorization: apiKey } })
.catch(error => console.log(`Error: ${error}`));
}
const httpsIndex = 8;
api
.get('/repositories')
.catch((e) => {
console.error(e);
process.exitCode = 1;
})
.then(async (response) => {
const repositories = response.data.filter((e) => e.download_url);
for (const repository of repositories) {
try {
const downloadUrl = repository.download_url;
const authUrl = `${downloadUrl.slice(0, httpsIndex)}${OAUTH_TOKEN}@${downloadUrl.slice(httpsIndex)}`;
shell.exec(`git clone ${authUrl} projects/${repository.name}`);
await getAllMetrics({ repoName: repository.name, tech: repository.tech, , id: repository.id });
rimraf.sync(`./projects/${repository.name}`);
} catch (e) {
console.error(e);
}
}
});