Skip to content

Commit a7424f6

Browse files
author
Vitalii Melnychuk
authored
feat: send code duplication metrics (#81)
1 parent 7cad528 commit a7424f6

9 files changed

Lines changed: 400 additions & 15 deletions

File tree

.github/workflows/ci.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,17 @@ jobs:
3939

4040
- name: Install dependencies
4141
run: yarn test
42+
43+
- name: Run test coverage
44+
run: yarn coverage
45+
46+
- name: Generate Code Coverage report
47+
id: code-coverage
48+
uses: barecheck/code-coverage-action@v1
49+
with:
50+
barecheck-github-app-token: ${{ secrets.BARECHECK_GITHUB_APP_TOKEN }}
51+
barecheck-api-key: ${{ secrets.BARECHECK_API_KEY }}
52+
lcov-file: "./coverage/lcov.info"
53+
minimum-ratio: 0
54+
send-summary-comment: true
55+
show-annotations: "warning"

.github/workflows/main.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,6 @@ jobs:
2020
uses: ./
2121
with:
2222
barecheck-github-app-token: ${{ secrets.BARECHECK_GITHUB_APP_TOKEN }}
23+
barecheck-api-key: ${{ secrets.BARECHECK_API_KEY }}
2324
lines-threshold: 10
2425
send-summary-comment: true

action.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ inputs:
77
barecheck-github-app-token:
88
description: Barecheck application token, received after application installation
99
required: true
10+
barecheck-api-key:
11+
description: Barecheck project API key
12+
required: false
1013
lines-threshold:
1114
description: "Minimum code duplications lines threshold percentage that would fail a build once it reached"
1215
default: "1"

dist/index.js

Lines changed: 141 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3694,7 +3694,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36943694
return (mod && mod.__esModule) ? mod : { "default": mod };
36953695
};
36963696
Object.defineProperty(exports, "__esModule", ({ value: true }));
3697-
exports.coverageMetrics = exports.createCoverageMetric = exports.authProject = exports.createGithubAccessToken = void 0;
3697+
exports.clonesMetrics = exports.createClonesMetric = exports.coverageMetrics = exports.createCoverageMetric = exports.authProject = exports.createGithubAccessToken = void 0;
36983698
const axios_1 = __importDefault(__nccwpck_require__(96545));
36993699
const config_1 = __nccwpck_require__(8919);
37003700
// TODO: define api request response interfaces
@@ -3778,6 +3778,55 @@ const coverageMetrics = (accessToken, variables) => __awaiter(void 0, void 0, vo
37783778
return response.data.coverageMetrics;
37793779
});
37803780
exports.coverageMetrics = coverageMetrics;
3781+
const createClonesMetric = (accessToken, variables) => __awaiter(void 0, void 0, void 0, function* () {
3782+
const query = `mutation createClonesMetric(
3783+
$projectId: Int!,
3784+
$totalLinesPercentage: Float!,
3785+
$totalBranchesPercentage: Float!,
3786+
$ref: String!,
3787+
$sha: String!) {
3788+
createClonesMetric(input: {
3789+
projectId: $projectId,
3790+
totalLinesPercentage: $totalLinesPercentage,
3791+
totalBranchesPercentage: $totalBranchesPercentage,
3792+
ref: $ref,
3793+
sha: $sha }) {
3794+
id
3795+
totalLinesPercentage
3796+
totalBranchesPercentage
3797+
ref
3798+
sha
3799+
createdAt
3800+
updatedAt
3801+
}
3802+
}
3803+
`;
3804+
const response = yield makeRequest(accessToken, query, variables);
3805+
if (!response.data) {
3806+
throw new Error("Couldn't send your project clones metric. Check if `accessToken` is valid or receive new one by using `authProject` mutation");
3807+
}
3808+
return response.data.createClonesMetric;
3809+
});
3810+
exports.createClonesMetric = createClonesMetric;
3811+
const clonesMetrics = (accessToken, variables) => __awaiter(void 0, void 0, void 0, function* () {
3812+
const query = `query clonesMetrics($projectId: Int!, $ref: String, $dateTo: DateTime, $take: Int ) {
3813+
clonesMetrics(projectId: $projectId, ref:$ref, dateTo: $dateTo, take: $take){
3814+
id
3815+
ref
3816+
sha
3817+
totalLinesPercentage
3818+
totalBranchesPercentage
3819+
createdAt
3820+
}
3821+
}
3822+
`;
3823+
const response = yield makeRequest(accessToken, query, variables);
3824+
if (!response.data) {
3825+
return null;
3826+
}
3827+
return response.data.clonesMetrics;
3828+
});
3829+
exports.clonesMetrics = clonesMetrics;
37813830
//# sourceMappingURL=endpoints.js.map
37823831

37833832
/***/ }),
@@ -3847,13 +3896,13 @@ const fetchCoverage = (apiKey, ref) => __awaiter(void 0, void 0, void 0, functio
38473896
exports.fetchCoverage = fetchCoverage;
38483897
const sendCoverage = (apiKey, totalCoverage, ref, sha) => __awaiter(void 0, void 0, void 0, function* () {
38493898
const { accessToken, project } = yield (0, endpoints_1.authProject)({ apiKey });
3850-
const [latestCoverage] = yield (0, endpoints_1.createCoverageMetric)(accessToken, {
3899+
const createdCoverage = yield (0, endpoints_1.createCoverageMetric)(accessToken, {
38513900
projectId: project.id,
38523901
ref,
38533902
sha,
38543903
totalCoverage
38553904
});
3856-
return latestCoverage ? latestCoverage.totalCoverage : 0;
3905+
return createdCoverage.totalCoverage;
38573906
});
38583907
exports.sendCoverage = sendCoverage;
38593908
//# sourceMappingURL=index.js.map
@@ -4072,8 +4121,8 @@ exports.getChangedFiles = getChangedFiles;
40724121
Object.defineProperty(exports, "__esModule", ({ value: true }));
40734122
exports.getClonesReportBody = void 0;
40744123
const getClonesReportBody = (title, statistic) => {
4075-
const totalLines = `Total Lines: <b>${statistic.total.lines}%</b>`;
4076-
const duplicatedLines = `Duplicated Lines: <b>${statistic.total.duplicatedLines}%</b>`;
4124+
const totalLines = `Total Lines: <b>${statistic.total.lines}</b>`;
4125+
const duplicatedLines = `Duplicated Lines: <b>${statistic.total.duplicatedLines}</b>`;
40774126
const description = `${totalLines}\n\n${duplicatedLines}`;
40784127
const body = `<h3>${title}</h3>${description}`;
40794128
return body;
@@ -50663,6 +50712,87 @@ module.exports = {
5066350712
};
5066450713

5066550714

50715+
/***/ }),
50716+
50717+
/***/ 12069:
50718+
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
50719+
50720+
const core = __nccwpck_require__(42186);
50721+
const { barecheckApi } = __nccwpck_require__(35396);
50722+
50723+
const { getBaseRefSha, getCurrentRefSha } = __nccwpck_require__(68383);
50724+
const { getBarecheckApiKey } = __nccwpck_require__(70006);
50725+
50726+
let projectAuthState = false;
50727+
50728+
const authProject = async () => {
50729+
if (!projectAuthState) {
50730+
const apiKey = getBarecheckApiKey();
50731+
50732+
const authProjectRes = await barecheckApi.authProject({
50733+
apiKey
50734+
});
50735+
50736+
projectAuthState = {
50737+
projectId: authProjectRes.project.id,
50738+
accessToken: authProjectRes.accessToken
50739+
};
50740+
}
50741+
50742+
return projectAuthState;
50743+
};
50744+
50745+
const cleanAuthProject = () => {
50746+
projectAuthState = false;
50747+
};
50748+
50749+
const getBaseBranchClones = async () => {
50750+
const { ref, sha } = getBaseRefSha();
50751+
50752+
core.info(`Getting metrics from Barecheck. ref=${ref}, sha=${sha}`);
50753+
50754+
const { projectId, accessToken } = await authProject();
50755+
50756+
const clonesMetrics = await barecheckApi.clonesMetrics(accessToken, {
50757+
projectId,
50758+
ref,
50759+
sha,
50760+
take: 1
50761+
});
50762+
50763+
return clonesMetrics[0] ? clonesMetrics[0].totalLinesPercentage : false;
50764+
};
50765+
50766+
const sendCurrentClones = async (
50767+
totalLinesPercentage,
50768+
totalBranchesPercentage
50769+
) => {
50770+
const { ref, sha } = getCurrentRefSha();
50771+
50772+
const metricsMessage = `totalLinesPercentage=${totalLinesPercentage}, totalBranchesPercentage=${totalBranchesPercentage}`;
50773+
core.info(
50774+
`Sending metrics to Barecheck. ref=${ref}, sha=${sha}, ${metricsMessage}`
50775+
);
50776+
50777+
const { projectId, accessToken } = await authProject();
50778+
50779+
await barecheckApi.createClonesMetric(accessToken, {
50780+
projectId,
50781+
ref,
50782+
sha,
50783+
totalLinesPercentage,
50784+
totalBranchesPercentage
50785+
});
50786+
};
50787+
50788+
module.exports = {
50789+
getBaseBranchClones,
50790+
sendCurrentClones,
50791+
authProject,
50792+
cleanAuthProject
50793+
};
50794+
50795+
5066650796
/***/ }),
5066750797

5066850798
/***/ 68383:
@@ -50965,6 +51095,7 @@ const { detectClones } = __nccwpck_require__(17572);
5096551095
const { getClonesReportBody, githubApi } = __nccwpck_require__(35396);
5096651096

5096751097
const { getPullRequestContext, getOctokit } = __nccwpck_require__(68383);
51098+
const { sendCurrentClones } = __nccwpck_require__(12069);
5096851099

5096951100
const { commentTitle } = __nccwpck_require__(34570);
5097051101

@@ -50985,6 +51116,11 @@ async function main() {
5098551116
searchBody: commentTitle,
5098651117
body
5098751118
});
51119+
51120+
await sendCurrentClones(
51121+
statistic.total.percentage,
51122+
statistic.total.percentageTokens
51123+
);
5098851124
} catch (err) {
5098951125
core.info(err);
5099051126
core.setFailed(err.message);

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
"description": "GitHub Action that posts generates code duplication reports",
55
"main": "src/index.js",
66
"dependencies": {
7-
"@barecheck/clones": "^0.3.0",
8-
"@barecheck/core": "^0.3.0",
7+
"@barecheck/clones": "^0.4.0",
8+
"@barecheck/core": "^0.4.0",
99
"@actions/core": "^1.6.0",
1010
"@actions/github": "^5.0.0"
1111
},

src/index.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const { detectClones } = require("@barecheck/clones");
33
const { getClonesReportBody, githubApi } = require("@barecheck/core");
44

55
const { getPullRequestContext, getOctokit } = require("./lib/github");
6+
const { sendCurrentClones } = require("./lib/api");
67

78
const { commentTitle } = require("./config");
89

@@ -23,6 +24,11 @@ async function main() {
2324
searchBody: commentTitle,
2425
body
2526
});
27+
28+
await sendCurrentClones(
29+
statistic.total.percentage,
30+
statistic.total.percentageTokens
31+
);
2632
} catch (err) {
2733
core.info(err);
2834
core.setFailed(err.message);

src/lib/api.js

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
const core = require("@actions/core");
2+
const { barecheckApi } = require("@barecheck/core");
3+
4+
const { getBaseRefSha, getCurrentRefSha } = require("./github");
5+
const { getBarecheckApiKey } = require("../input");
6+
7+
let projectAuthState = false;
8+
9+
const authProject = async () => {
10+
if (!projectAuthState) {
11+
const apiKey = getBarecheckApiKey();
12+
13+
const authProjectRes = await barecheckApi.authProject({
14+
apiKey
15+
});
16+
17+
projectAuthState = {
18+
projectId: authProjectRes.project.id,
19+
accessToken: authProjectRes.accessToken
20+
};
21+
}
22+
23+
return projectAuthState;
24+
};
25+
26+
const cleanAuthProject = () => {
27+
projectAuthState = false;
28+
};
29+
30+
const getBaseBranchClones = async () => {
31+
const { ref, sha } = getBaseRefSha();
32+
33+
core.info(`Getting metrics from Barecheck. ref=${ref}, sha=${sha}`);
34+
35+
const { projectId, accessToken } = await authProject();
36+
37+
const clonesMetrics = await barecheckApi.clonesMetrics(accessToken, {
38+
projectId,
39+
ref,
40+
sha,
41+
take: 1
42+
});
43+
44+
return clonesMetrics[0] ? clonesMetrics[0].totalLinesPercentage : false;
45+
};
46+
47+
const sendCurrentClones = async (
48+
totalLinesPercentage,
49+
totalBranchesPercentage
50+
) => {
51+
const { ref, sha } = getCurrentRefSha();
52+
53+
const metricsMessage = `totalLinesPercentage=${totalLinesPercentage}, totalBranchesPercentage=${totalBranchesPercentage}`;
54+
core.info(
55+
`Sending metrics to Barecheck. ref=${ref}, sha=${sha}, ${metricsMessage}`
56+
);
57+
58+
const { projectId, accessToken } = await authProject();
59+
60+
await barecheckApi.createClonesMetric(accessToken, {
61+
projectId,
62+
ref,
63+
sha,
64+
totalLinesPercentage,
65+
totalBranchesPercentage
66+
});
67+
};
68+
69+
module.exports = {
70+
getBaseBranchClones,
71+
sendCurrentClones,
72+
authProject,
73+
cleanAuthProject
74+
};

0 commit comments

Comments
 (0)