Skip to content

Commit 215fe90

Browse files
committed
Search for internal possible git issues
resolves: automation/issues/639 Signed-off-by: Lan Xia <[email protected]>
1 parent 8c3e966 commit 215fe90

File tree

3 files changed

+113
-33
lines changed

3 files changed

+113
-33
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
const got = require('got');
2+
const ArgParser = require('../ArgParser');
3+
4+
/**
5+
* getInternalGitIssues seraches text in the repos and return matched git issues
6+
* api/getInternalGitIssues?text=jdk_util
7+
* @param {string} text Required. Search text string. i.e., jdk_math
8+
* @return {object} matched git issues
9+
*/
10+
11+
module.exports = async (req, res) => {
12+
try {
13+
const { text } = req.query;
14+
if (text) {
15+
const url = 'https://api.github.ibm.com';
16+
const repos = 'repo:runtimes/backlog+repo:runtimes/infrastructure';
17+
const credentails = ArgParser.getConfig();
18+
if (credentails[url] && credentails[url].token) {
19+
const response = await got(
20+
`${url}/search/issues?q=${text}+${repos}`,
21+
{
22+
method: 'get',
23+
headers: {
24+
Authorization: `Bearer ${credentails[url].token}`,
25+
Accept: 'application/vnd.github+json',
26+
},
27+
responseType: 'json',
28+
}
29+
);
30+
if (response && response.body) {
31+
res.send(response.body.items);
32+
} else {
33+
res.send([]);
34+
}
35+
} else {
36+
res.send(`${url} and/or token not appear in trssConf.json`);
37+
}
38+
} else {
39+
res.send('expect text query parameter');
40+
}
41+
} catch (error) {
42+
console.error(
43+
'Error fetching repos:',
44+
error.response?.data || error.message
45+
);
46+
res.send(error.response?.data || error.message);
47+
}
48+
};

TestResultSummaryService/routes/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ app.get('/getChildBuilds', require('./getChildBuilds'));
2222
app.get('/getDashboardBuildInfo', require('./getDashboardBuildInfo'));
2323
app.get('/getData', require('./getData'));
2424
app.get('/getErrorInOutput', require('./getErrorInOutput'));
25+
app.get('/getInternalGitIssues', require('./getInternalGitIssues'));
2526
app.get('/getHistoryPerTest', require('./getHistoryPerTest'));
2627
app.get('/getJenkins', require('./getJenkins'));
2728
app.get('/getJenkinsBuildInfo', require('./test/getJenkinsBuildInfo'));

test-result-summary-client/src/Build/PossibleIssues.jsx

Lines changed: 64 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import React, { useState, useEffect } from 'react';
22
import { Table, Button } from 'antd';
33
import TestBreadcrumb from './TestBreadcrumb';
4-
import { getParams } from '../utils/query';
54
import { fetchData } from '../utils/Utils';
65
import { SmileOutlined, FrownOutlined } from '@ant-design/icons';
7-
import { useLocation } from 'react-router-dom';
86
import { notification } from 'antd';
97

108
import './table.css';
@@ -87,60 +85,85 @@ const PossibleIssues = ({
8785
const testOutput = result.output;
8886

8987
// fetch related issues with Github API
90-
let additionalRepo = '';
88+
let openj9Repo = '';
89+
let additionalResponse = [];
9190
if (buildName.includes('j9') || buildName.includes('ibm')) {
92-
additionalRepo = '+repo:eclipse-openj9/openj9';
93-
} else if (buildName.includes('hs')) {
91+
openj9Repo = '+repo:eclipse-openj9/openj9';
92+
93+
additionalResponse = await fetchData(
94+
`/api/getInternalGitIssues?url=&text=${generalTestName}`
95+
);
96+
} else {
9497
additionalRepo =
9598
'+repo:adoptium/infrastructure+repo:adoptium/aqa-build';
9699
}
97100
const response = await fetch(
98101
`https://api.github.com/search/issues?q=${generalTestName}+repo:adoptium/aqa-tests` +
99-
`+repo:adoptium/aqa-systemtest+repo:adoptium/TKG${additionalRepo}`,
102+
`+repo:adoptium/aqa-systemtest+repo:adoptium/TKG${openj9Repo}`,
100103
{
101104
method: 'get',
102105
}
103106
);
104-
var oldDate = new Date();
105-
oldDate.setMonth(oldDate.getMonth() - 6);
107+
108+
let relatedIssues = [];
106109
if (response.ok) {
107-
const relatedIssues = await response.json();
110+
relatedIssues = await response.json();
111+
relatedIssues = relatedIssues.items;
112+
}
113+
if (additionalResponse) {
114+
relatedIssues = [...relatedIssues, ...additionalResponse];
115+
}
116+
if (relatedIssues && relatedIssues.length > 0) {
117+
console.log('relatedIssues', relatedIssues);
108118
let dataSource = {};
109-
const repoUrlAPIPrefix = 'https://api.github.com/repos/';
110-
for (let index = 0; index < relatedIssues.items.length; index++) {
111-
const createdAt = new Date(
112-
relatedIssues.items[index].created_at
113-
);
114-
const is_opne = relatedIssues.items[index].state;
115-
if (createdAt < oldDate && is_opne === 'closed') {
116-
continue;
119+
const today = new Date();
120+
const closedIssueMinDate = new Date().setMonth(
121+
today.getMonth() - 6
122+
);
123+
124+
const openIssueMinDate = new Date().setMonth(today.getMonth() - 24);
125+
//for (let index = 0; index < relatedIssues.length; index++) {
126+
relatedIssues.forEach((issue) => {
127+
const createdAt = new Date(issue.created_at);
128+
const closedAt = issue.closed_at
129+
? new Date(issue.closed_at)
130+
: '';
131+
// For matched closed issue, only display if the issue was closed in the last 6 months
132+
// For matched open issue, only display if the issue has been opened within 24 months
133+
if (issue.state === 'closed') {
134+
if (closedAt && createdAt < closedIssueMinDate) {
135+
return;
136+
}
137+
} else {
138+
if (createdAt < openIssueMinDate) {
139+
return;
140+
}
117141
}
118142
const createdAtStr = createdAt.toLocaleString();
119-
const repoName = relatedIssues.items[
120-
index
121-
].repository_url.replace(repoUrlAPIPrefix, '');
122-
const issue = (
143+
const closedAtStr = closedAt.toLocaleString();
144+
const repoName = issue.repository_url;
145+
const issueTitle = (
123146
<a
124-
href={relatedIssues.items[index].html_url}
147+
href={issue.html_url}
125148
target="_blank"
126149
rel="noopener noreferrer"
127150
>
128-
{relatedIssues.items[index].title}
151+
{issue.number}: {issue.title}
129152
</a>
130153
);
131154
const issueCreator = (
132155
<a
133-
href={relatedIssues.items[index].user.html_url}
156+
href={issue.user.html_url}
134157
target="_blank"
135158
rel="noopener noreferrer"
136159
>
137-
{relatedIssues.items[index].user.login}
160+
{issue.user.login}
138161
</a>
139162
);
140-
const issueState = relatedIssues.items[index].state;
141-
const issueFullName = relatedIssues.items[index].title;
142-
const issueNumber = relatedIssues.items[index].number;
143-
const creatorName = relatedIssues.items[index].user.login;
163+
const issueState = issue.state;
164+
const issueFullName = issue.title;
165+
const issueNumber = issue.number;
166+
const creatorName = issue.user.login;
144167
const userFeedback = (
145168
<>
146169
<Button
@@ -186,14 +209,17 @@ const PossibleIssues = ({
186209
dataSource[repoName] = dataSource[repoName] || [];
187210
dataSource[repoName].push({
188211
key: dataSource[repoName].length,
189-
issue,
212+
issueTitle,
190213
issueCreator,
191214
createdAt,
192215
createdAtStr,
216+
closedAt,
217+
closedAtStr,
193218
issueState,
194219
userFeedback,
195220
});
196-
}
221+
});
222+
197223
setLoading(false);
198224
setDataSource(dataSource);
199225
} else {
@@ -207,8 +233,8 @@ const PossibleIssues = ({
207233
const columns = [
208234
{
209235
title: 'Possible Issues',
210-
dataIndex: 'issue',
211-
key: 'issue',
236+
dataIndex: 'issueTitle',
237+
key: 'issueTitle',
212238
},
213239
{
214240
title: 'Issue Creator',
@@ -223,6 +249,11 @@ const PossibleIssues = ({
223249
return a.createdAt - b.createdAt;
224250
},
225251
},
252+
{
253+
title: 'Closed At',
254+
dataIndex: 'closedAtStr',
255+
key: 'closedAtStr',
256+
},
226257
{
227258
title: 'State',
228259
dataIndex: 'issueState',

0 commit comments

Comments
 (0)