Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Q
qa-api
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
QA
qa-api
Commits
93611fc2
Commit
93611fc2
authored
Dec 05, 2019
by
智勇
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
git user
parent
32f6075a
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
123 additions
and
27 deletions
+123
-27
pipeline.js
app/controller/pipeline.js
+2
-0
sonar.js
app/controller/sonar.js
+93
-27
SonarJob.js
app/model/mongo/qa_api/SonarJob.js
+28
-0
No files found.
app/controller/pipeline.js
View file @
93611fc2
...
@@ -66,6 +66,8 @@ const sonarJenkinsBuild = async (data) => {
...
@@ -66,6 +66,8 @@ const sonarJenkinsBuild = async (data) => {
projectName
,
projectName
,
branchName
,
branchName
,
branchHash
,
branchHash
,
gitUser
,
commitMes
,
}
}
SonarJob
.
saveSonarJob
(
saveData
)
SonarJob
.
saveSonarJob
(
saveData
)
}
}
...
...
app/controller/sonar.js
View file @
93611fc2
...
@@ -11,6 +11,7 @@ const config = require(global.configPath)
...
@@ -11,6 +11,7 @@ const config = require(global.configPath)
const
title
=
'
sonar 扫描结果
'
const
title
=
'
sonar 扫描结果
'
const
sendFailMail
=
async
(
data
,
item
,
executionTimeMs
)
=>
{
const
sendFailMail
=
async
(
data
,
item
,
executionTimeMs
)
=>
{
const
address
=
data
.
gitUser
?
`
${
data
.
gitUser
}
@quantgroup.cn`
:
data
.
gitUserMail
const
duration
=
data
.
duration
/
1000
const
duration
=
data
.
duration
/
1000
const
executionTime
=
executionTimeMs
/
1000
const
executionTime
=
executionTimeMs
/
1000
const
text
=
`<font color=#FF7F50> 扫描结果 :
${
item
.
status
.
qualityGateStatus
}
<br/>`
const
text
=
`<font color=#FF7F50> 扫描结果 :
${
item
.
status
.
qualityGateStatus
}
<br/>`
...
@@ -20,20 +21,22 @@ const sendFailMail = async (data, item, executionTimeMs) => {
...
@@ -20,20 +21,22 @@ const sendFailMail = async (data, item, executionTimeMs) => {
+
`分析时间 :
${
executionTime
}
s<br/>`
+
`分析时间 :
${
executionTime
}
s<br/>`
+
`扫描日期 :
${
item
.
analysisDate
}
<br/>`
+
`扫描日期 :
${
item
.
analysisDate
}
<br/>`
+
`查看详情 :
${
config
.
sonarHost
}
/project/activity?id=
${
data
.
project
}
&&selected_date=
${
item
.
analysisDate
}
`
+
`查看详情 :
${
config
.
sonarHost
}
/project/activity?id=
${
data
.
project
}
&&selected_date=
${
item
.
analysisDate
}
`
sendMail
(
data
.
gitUserMail
,
`
${
data
.
project
}
${
title
}
`
,
text
)
sendMail
(
address
,
`
${
data
.
project
}
${
title
}
`
,
text
)
}
}
const
sendExceptionMail
=
async
(
data
)
=>
{
const
sendExceptionMail
=
async
(
data
)
=>
{
const
address
=
data
.
gitUser
?
`
${
data
.
gitUser
}
@quantgroup.cn`
:
data
.
gitUserMail
const
text
=
'
<font color=#FF0000> 扫描结果 : 扫描任务执行失败 <br/>
'
const
text
=
'
<font color=#FF0000> 扫描结果 : 扫描任务执行失败 <br/>
'
+
`<font color=#000000> 结果信息 :
${
data
.
error
}
<br/>`
+
`<font color=#000000> 结果信息 :
${
data
.
error
}
<br/>`
+
`项目名称 :
${
data
.
project
}
<br/>`
+
`项目名称 :
${
data
.
project
}
<br/>`
+
`分支名称 :
${
data
.
branch
}
<br/>`
+
`分支名称 :
${
data
.
branch
}
<br/>`
+
`Sonar详情 :
${
config
.
sonarHost
}
/dashboard?id=
${
data
.
project
}
<br/>`
+
`Sonar详情 :
${
config
.
sonarHost
}
/dashboard?id=
${
data
.
project
}
<br/>`
+
`Jenskins详情 :
${
data
.
absoluteUrl
}
console <br/>`
+
`Jenskins详情 :
${
data
.
absoluteUrl
}
console <br/>`
sendMail
(
`
${
data
.
gitUser
}
@quantgroup.cn`
,
`
${
data
.
project
}
${
title
}
`
,
text
)
sendMail
(
address
,
`
${
data
.
project
}
${
title
}
`
,
text
)
}
}
const
sendExistMail
=
async
(
data
)
=>
{
const
sendExistMail
=
async
(
data
,
gitUser
)
=>
{
const
address
=
data
.
gitUser
?
`
${
data
.
gitUser
}
@quantgroup.cn`
:
`
${
gitUser
}
@quantgroup.cn`
const
text
=
'
<font color=#FF7F50> 本次执行的GITHASH曾经扫描过<br/>
'
const
text
=
'
<font color=#FF7F50> 本次执行的GITHASH曾经扫描过<br/>
'
+
`扫描结果 :
${
data
.
sonarResult
}
<br/>`
+
`扫描结果 :
${
data
.
sonarResult
}
<br/>`
+
`<font color=#000000> 项目名称 :
${
data
.
projectName
}
<br/>`
+
`<font color=#000000> 项目名称 :
${
data
.
projectName
}
<br/>`
...
@@ -41,7 +44,16 @@ const sendExistMail = async (data) => {
...
@@ -41,7 +44,16 @@ const sendExistMail = async (data) => {
+
`GITHASH :
${
data
.
branchHash
}
<br/>`
+
`GITHASH :
${
data
.
branchHash
}
<br/>`
+
`扫描分析日期 :
${
data
.
analysisDate
}
<br/>`
+
`扫描分析日期 :
${
data
.
analysisDate
}
<br/>`
+
`查看详情 :
${
config
.
sonarHost
}
/project/activity?id=
${
data
.
projectName
}
&&selected_date=
${
data
.
analysisDate
}
`
+
`查看详情 :
${
config
.
sonarHost
}
/project/activity?id=
${
data
.
projectName
}
&&selected_date=
${
data
.
analysisDate
}
`
sendMail
(
data
.
gitUserMail
,
`
${
data
.
projectName
}
${
title
}
`
,
text
)
sendMail
(
address
,
`
${
data
.
projectName
}
${
title
}
`
,
text
)
}
const
saveData
=
async
(
data
)
=>
{
const
sonarJob
=
await
SonarJob
.
getOneSonarJob
({
branchHash
:
data
.
branchHash
})
if
(
sonarJob
)
{
await
SonarJob
.
updateSonarJob
(
data
)
}
else
{
await
SonarJob
.
saveSonarJob
(
data
)
}
}
}
const
callback
=
async
(
ctx
)
=>
{
const
callback
=
async
(
ctx
)
=>
{
...
@@ -52,25 +64,25 @@ const callback = async (ctx) => {
...
@@ -52,25 +64,25 @@ const callback = async (ctx) => {
logger
.
info
(
data
.
sonarJob
.
projectName
,
data
.
sonarJob
.
branchName
,
data
.
sonarJob
.
branchHash
,
logger
.
info
(
data
.
sonarJob
.
projectName
,
data
.
sonarJob
.
branchName
,
data
.
sonarJob
.
branchHash
,
'
GITHASH 曾经 扫描过,扫描结果:
'
,
data
.
sonarJob
)
'
GITHASH 曾经 扫描过,扫描结果:
'
,
data
.
sonarJob
)
if
(
data
.
sonarJob
.
sonarResult
!==
'
OK
'
&&
data
.
mail
!==
'
noMail
'
)
{
if
(
data
.
sonarJob
.
sonarResult
!==
'
OK
'
&&
data
.
mail
!==
'
noMail
'
)
{
sendExistMail
(
data
.
sonarJob
)
sendExistMail
(
data
.
sonarJob
,
data
.
gitUser
)
}
}
ctx
.
body
=
ctx
.
ok
()
ctx
.
body
=
ctx
.
ok
()
return
return
}
}
const
saveData
=
{
// const saveData = {
buildId
:
data
.
buildId
,
// buildId: data.buildId,
buildJob
:
data
.
buildJob
,
// buildJob: data.buildJob,
branchName
:
data
.
branch
,
// branchName: data.branch,
}
// projectName: data.project,
// }
if
(
data
.
error
)
{
if
(
data
.
error
)
{
saveData
.
buildResult
=
'
error
'
data
.
buildResult
=
'
error
'
saveData
.
projectName
=
data
.
project
if
(
data
.
mail
!==
'
noMail
'
)
{
if
(
data
.
mail
!==
'
noMail
'
)
{
sendExceptionMail
(
data
)
sendExceptionMail
(
data
)
}
}
// await SonarJob.saveSonarJob(saveD
ata)
await
saveData
(
d
ata
)
ctx
.
body
=
ctx
.
ok
()
ctx
.
body
=
ctx
.
ok
()
return
return
}
}
...
@@ -98,30 +110,84 @@ const callback = async (ctx) => {
...
@@ -98,30 +110,84 @@ const callback = async (ctx) => {
logger
.
info
(
data
.
project
,
'
触发质量阀,发送邮件通知
'
)
logger
.
info
(
data
.
project
,
'
触发质量阀,发送邮件通知
'
)
sendFailMail
(
data
,
i
,
executionTimeMs
)
sendFailMail
(
data
,
i
,
executionTimeMs
)
}
}
saveData
.
projectName
=
data
.
project
data
.
buildResult
=
'
success
'
saveData
.
buildResult
=
'
success
'
data
.
sonarResult
=
i
.
status
.
qualityGateStatus
saveData
.
sonarResult
=
i
.
status
.
qualityGateStatus
data
.
analysisDate
=
i
.
analysisDate
saveData
.
analysisDate
=
i
.
analysisDate
// const sonarJob = await SonarJob.getOneSonarJob({ branchHash: data.branchHash })
saveData
.
branchHash
=
data
.
branchHash
// if (sonarJob) {
const
sonarJob
=
await
SonarJob
.
getOneSonarJob
({
branchHash
:
data
.
branchHash
})
// await SonarJob.updateSonarJob(data)
if
(
sonarJob
)
{
// } else {
await
SonarJob
.
updateSonarJob
(
saveData
)
// await SonarJob.saveSonarJob(data)
}
else
{
// }
await
SonarJob
.
saveSonarJob
(
saveData
)
await
saveData
(
data
)
}
}
}
ctx
.
body
=
ctx
.
ok
(
saveD
ata
)
ctx
.
body
=
ctx
.
ok
(
d
ata
)
}
}
const
getSonarJob
=
async
(
ctx
)
=>
{
const
get
One
SonarJob
=
async
(
ctx
)
=>
{
const
sonarJob
=
await
SonarJob
.
getOneSonarJob
(
ctx
.
request
.
query
)
const
sonarJob
=
await
SonarJob
.
getOneSonarJob
(
ctx
.
request
.
query
)
ctx
.
body
=
ctx
.
ok
(
sonarJob
)
ctx
.
body
=
ctx
.
ok
(
sonarJob
)
}
}
const
queryHandle
=
function
(
query
)
{
if
(
query
.
projectName
&&
query
.
projectName
.
trim
())
{
query
.
projectName
=
new
RegExp
(
query
.
projectName
)
}
else
{
delete
query
.
projectName
}
if
(
query
.
branchName
&&
query
.
branchName
.
trim
())
{
query
.
branchName
=
new
RegExp
(
query
.
branchName
)
}
else
{
delete
query
.
branchName
}
if
(
query
.
gitUser
&&
query
.
gitUser
.
trim
())
{
query
.
gitUser
=
new
RegExp
(
query
.
gitUser
)
}
else
{
delete
query
.
gitUser
}
}
const
getSonarJob
=
async
(
ctx
)
=>
{
const
query
=
ctx
.
request
.
body
.
query
const
page
=
ctx
.
request
.
body
.
page
queryHandle
(
query
)
const
curDate
=
new
Date
()
const
date
=
new
Date
(
curDate
.
getTime
()
-
3
*
24
*
60
*
60
*
1000
)
Object
.
assign
(
query
,
{
updatedAt
:
{
$gte
:
date
}
})
console
.
log
(
1
,
query
)
const
data
=
await
SonarJob
.
getSonarJob
(
query
,
{
_id
:
0
},
{
updatedAt
:
-
1
},
page
)
const
count
=
await
SonarJob
.
getSonarJobCount
(
query
)
ctx
.
body
=
ctx
.
ok
({
data
,
count
})
}
const
fetchQuality
=
async
(
ctx
)
=>
{
const
req
=
ctx
.
request
.
body
const
query
=
{
updatedAt
:
{
$gte
:
req
.
startDate
,
$lte
:
req
.
endDate
},
}
if
(
req
.
repository
)
{
query
.
projectName
=
req
.
repository
}
// const data = await SonarJob.getSonarJobGroup(query);
const
data
=
await
SonarJob
.
getSonarJob
(
query
,
{
_id
:
0
,
projectName
:
1
,
buildResult
:
1
,
sonarResult
:
1
,
},
{},
{});
// console.log(1, data)
ctx
.
body
=
ctx
.
ok
(
data
)
}
const
router
=
new
Router
()
const
router
=
new
Router
()
router
router
.
use
(
bodyParser
())
.
use
(
bodyParser
())
.
post
(
'
/callback
'
,
callback
)
.
post
(
'
/callback
'
,
callback
)
.
get
(
'
/getSonarJob
'
,
getSonarJob
)
.
get
(
'
/getSonarJob
'
,
getOneSonarJob
)
.
post
(
'
/getSonarJobs
'
,
getSonarJob
)
.
post
(
'
/fetchQuality
'
,
fetchQuality
)
module
.
exports
=
router
;
module
.
exports
=
router
;
app/model/mongo/qa_api/SonarJob.js
View file @
93611fc2
...
@@ -6,6 +6,8 @@ const schema = new Schema({
...
@@ -6,6 +6,8 @@ const schema = new Schema({
buildJob
:
{
type
:
String
},
buildJob
:
{
type
:
String
},
projectName
:
{
type
:
String
},
projectName
:
{
type
:
String
},
branchName
:
{
type
:
String
},
branchName
:
{
type
:
String
},
gitUser
:
{
type
:
String
},
commitMes
:
{
type
:
String
},
branchHash
:
{
branchHash
:
{
type
:
String
,
unique
:
true
,
required
:
true
,
index
:
true
,
type
:
String
,
unique
:
true
,
required
:
true
,
index
:
true
,
},
},
...
@@ -17,6 +19,7 @@ const schema = new Schema({
...
@@ -17,6 +19,7 @@ const schema = new Schema({
collection
:
'
sonarJob
'
,
// 表名
collection
:
'
sonarJob
'
,
// 表名
timestamps
:
true
,
timestamps
:
true
,
})
})
schema
.
statics
.
saveSonarJob
=
function
(
doc
)
{
schema
.
statics
.
saveSonarJob
=
function
(
doc
)
{
return
this
.
create
(
doc
)
return
this
.
create
(
doc
)
}
}
...
@@ -31,4 +34,29 @@ schema.statics.getOneSonarJob = function (query) {
...
@@ -31,4 +34,29 @@ schema.statics.getOneSonarJob = function (query) {
return
this
.
findOne
(
query
,
{
_id
:
0
})
return
this
.
findOne
(
query
,
{
_id
:
0
})
}
}
schema
.
statics
.
getSonarJob
=
function
(
query
,
column
,
sort
,
page
)
{
return
this
.
find
(
query
,
column
).
sort
(
sort
).
skip
(
page
.
num
*
page
.
count
).
limit
(
page
.
count
)
.
lean
()
}
schema
.
statics
.
getSonarJobCount
=
function
(
query
)
{
return
this
.
find
(
query
).
countDocuments
()
}
schema
.
statics
.
getSonarJobGroup
=
function
(
query
)
{
console
.
log
(
2
,
{
$match
:
query
})
return
this
.
aggregate
([
{
$match
:
{
updatedAt
:
{
$gte
:
'
2019-12-03T16:00:00.000Z
'
,
$lte
:
'
2019-12-04T16:00:00.000Z
'
,
},
},
},
{
$group
:
{
_id
:
'
$projectName
'
,
result
:
{
$push
:
{
sonarResult
:
'
$sonarResult
'
,
buildResult
:
'
$buildResult
'
}
}
}
},
])
}
module
.
exports
=
schema
module
.
exports
=
schema
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment