Commit e2b001cd authored by 智勇's avatar 智勇

邮件

parent 0a535560
......@@ -93,15 +93,15 @@ const webhooks = async function (ctx) {
return
}
let projects = await ProConfig.findByQuery({ is_active: true, deploy_to_testenv: true }, { project_name: 1 })
let projects = await ProConfig.findByQuery({ is_active: true, deploy_to_testenv: true, type: 'java' }, { project_name: 1 })
projects = projects.map(i => i.project_name)
if (!projects.includes(projectName)) {
logger.info(`${projectName} 不是激活且部署到容器的服务,不执行jenkins`)
ctx.body = ctx.ok(`${projectName} 不是激活且部署到容器的服务`)
logger.info(`${projectName} 不是激活且部署到容器的java服务,不执行jenkins`)
ctx.body = ctx.ok(`${projectName} 不是激活且部署到容器的java服务`)
return
}
const gitUser = req.user_name
const gitUser = req.user_username
const commitMes = req.commits[0].message
const timestamp = req.commits[0].timestamp
......@@ -187,6 +187,7 @@ const save = async function (ctx) {
}
pipelineJenkinsBuild(buildData)
logger.info('保存订阅 触发 pipeline jenkins build', data.application_name, buildData)
await sleep(2 * 1000)
}
ctx.body = ctx.ok('ok')
}
......
......@@ -4,7 +4,7 @@ const _ = require('lodash')
const { ProConfig } = require('../service/mongoService')
const getProjectByType = async function (ctx) {
let item = await ProConfig.findByQuery({ des: { $ne: '海外' } }, {}, { is_active: -1, project_name: 1 })
let item = await ProConfig.findByQuery({ des: { $ne: '海外' } }, {}, { project_name: 1 })
item = _.groupBy(item, 'type')
const arr = []
......@@ -32,7 +32,10 @@ const getProject = async function (ctx) {
const getProjectForJenkins = async function (ctx) {
const data = ctx.request.query
const query = data.type ? { is_active: true, type: data.type, deploy_to_testenv: true } : { is_active: true, deploy_to_testenv: true }
const query = { is_active: true, deploy_to_testenv: true }
if (data.type) {
Object.assign(query, { type: data.type })
}
let item = await ProConfig.findByQuery(query, { project_name: 1 }, { project_name: 1 })
item = item.map(i => i.project_name)
ctx.body = item.join('\n')
......@@ -100,9 +103,6 @@ const getInfo = async function (ctx) {
ctx.body = ctx.fail(ctx.Code.ERROR_INPUT)
return
}
if (data.system_name === 'xjd-ui') {
data.system_name = 'xjfq-ui'
}
const item = await ProConfig.getOneProject({ project_name: data.system_name })
if (data.key && item[data.key]) {
......
......@@ -2,49 +2,45 @@ const Router = require('koa-router')
const bodyParser = require('koa-bodyparser')
const logger = require('koa-log4').getLogger('sonar')
const awaitRequest = require('../utils/awaitRequest')
const dingTalk = require('../utils/dingTalk')
const sleep = require('../utils/sleep')
const sendMail = require('../utils/sendMail')
const { SonarJob } = require('../service/mongoService')
const config = require(global.configPath)
const title = '扫描结果如下'
const title = 'sonar 扫描结果'
const sendFailDing = async (data, item, executionTimeMs) => {
const sendFailMail = async (data, item, executionTimeMs) => {
const duration = data.duration / 1000
const executionTime = executionTimeMs / 1000
const text = `> <font color=#FF7F50> 扫描结果 : ${item.status.qualityGateStatus}\n\n`
+ `> <font color=#000000> 项目名称 : ${data.project}\n\n`
+ `> 分支名称 : ${data.branch}\n\n`
+ `> 扫描时间 : ${duration}s\n\n`
+ `> 分析时间 : ${executionTime}s\n\n`
+ `> 扫描日期 : ${item.analysisDate}\n\n`
// + `[查看详情](${config.sonarHost}/dashboard?id=${data.project})`
+ `[查看详情](${config.sonarHost}/project/activity?id=${data.project}&&selected_date=${item.analysisDate})`
const address = data.dingRobotAddr
await dingTalk(`${data.project}${title}`, text, address)
const text = `<font color=#FF7F50> 扫描结果 : ${item.status.qualityGateStatus}<br/>`
+ `<font color=#000000> 项目名称 : ${data.project}<br/>`
+ `分支名称 : ${data.branch}<br/>`
+ `扫描时间 : ${duration}s<br/>`
+ `分析时间 : ${executionTime}s<br/>`
+ `扫描日期 : ${item.analysisDate}<br/>`
+ `查看详情 : ${config.sonarHost}/project/activity?id=${data.project}&&selected_date=${item.analysisDate}`
sendMail(`${data.gitUser}@quantgroup.cn`, `${data.project} ${title}`, text)
}
const sendExceptionDing = async (data) => {
const text = '> <font color=#FF0000> 扫描结果 : 扫描任务执行失败 \n\n'
+ `> <font color=#000000> 结果信息 : ${data.error} \n\n`
+ `> 项目名称 : ${data.project}\n\n`
+ `> 分支名称 : ${data.branch}\n\n`
+ `[查看详情](${data.absoluteUrl}console)`
const address = data.dingRobotAddr || config.snorDingRobotAddr
await dingTalk(`${data.project}${title}`, text, address)
const sendExceptionMail = async (data) => {
const text = '<font color=#FF0000> 扫描结果 : 扫描任务执行失败 <br/>'
+ `<font color=#000000> 结果信息 : ${data.error} <br/>`
+ `项目名称 : ${data.project}<br/>`
+ `分支名称 : ${data.branch}<br/>`
+ `查看详情 : ${data.absoluteUrl}console`
sendMail(`${data.gitUser}@quantgroup.cn`, `${data.project} ${title}`, text)
}
const sendExistDing = async (data, dingRobotAddr) => {
const text = '> <font color=#FF7F50> 本次执行的GITHASH曾经扫描过\n\n'
+ `> 扫描结果 : ${data.sonarResult}\n\n`
+ `> <font color=#000000> 项目名称 : ${data.projectName}\n\n`
+ `> 分支名称 : ${data.branchName}\n\n`
+ `> GITHASH:${data.branchHash}\n\n`
+ `> 扫描分析日期 : ${data.analysisDate}\n\n`
+ `[查看详情](${config.sonarHost}/project/activity?id=${data.projectName}&&selected_date=${data.analysisDate})`
const address = dingRobotAddr || config.snorDingRobotAddr
await dingTalk(`${data.projectName}${title}`, text, address)
const sendExistMail = async (data) => {
const text = '<font color=#FF7F50> 本次执行的GITHASH曾经扫描过<br/>'
+ `扫描结果 : ${data.sonarResult}<br/>`
+ `<font color=#000000> 项目名称 : ${data.projectName}<br/>`
+ `分支名称 : ${data.branchName}<br/>`
+ `GITHASH : ${data.branchHash}<br/>`
+ `扫描分析日期 : ${data.analysisDate}<br/>`
+ `查看详情 : ${config.sonarHost}/project/activity?id=${data.projectName}&&selected_date=${data.analysisDate}`
sendMail(`${data.gitUser}@quantgroup.cn`, `${data.project} ${title}`, text)
}
const callback = async (ctx) => {
......@@ -55,7 +51,7 @@ const callback = async (ctx) => {
logger.info(data.sonarJob.projectName, data.sonarJob.branchName, data.sonarJob.branchHash,
'GITHASH 曾经 扫描过,扫描结果:', data.sonarJob)
if (data.sonarJob.sonarResult !== 'OK' && data.dingRobotAddr) {
sendExistDing(data.sonarJob, data.dingRobotAddr)
sendExistMail(data.sonarJob)
}
ctx.body = ctx.ok()
return
......@@ -70,7 +66,7 @@ const callback = async (ctx) => {
if (data.error) {
saveData.buildResult = 'error'
saveData.projectName = data.project
sendExceptionDing(data)
sendExceptionMail(data)
// await SonarJob.saveSonarJob(saveData)
ctx.body = ctx.ok()
return
......@@ -97,7 +93,7 @@ const callback = async (ctx) => {
for (const i of res.branches) {
if (i.name === 'master' && i.status.qualityGateStatus !== 'OK' && data.dingRobotAddr) {
logger.info(data.project, '触发质量阀,发送ding消息')
sendFailDing(data, i, executionTimeMs)
sendFailMail(data, i, executionTimeMs)
}
saveData.projectName = data.project
saveData.buildResult = 'success'
......
const nodemailer = require('nodemailer')
const logger = require('koa-log4')
.getLogger('sendMial')
const config = require('../../src')
const transporter = nodemailer.createTransport({
host: config.email.service,
port: 587,
secure: false, // true for 465, false for other ports
auth: {
user: config.email.user,
pass: config.email.pass,
},
tls: {
// do not fail on invalid certs
rejectUnauthorized: false,
},
})
/**
* @param {String} recipient 收件人
* @param {String} subject 发送的主题
* @param {String} html 发送的html内容
*/
module.exports = async function (recipient, subject, html) {
const info = await transporter.sendMail({
from: config.email.user,
to: recipient,
bcc: 'yong.zhi@quantgroup.cn',
subject,
html,
})
logger.info('邮件发送成功', info.envelope, html)
}
......@@ -36,11 +36,12 @@
"mongoose": "^5.3.4",
"node-etcd": "^7.0.0",
"node-schedule": "^1.3.0",
"nodemailer": "^6.3.1",
"request": "^2.88.0",
"request-proxy": "^2.0.8",
"require-all": "^3.0.0",
"uuid": "^3.3.2",
"sleep": "^5.2.3"
"sleep": "^5.2.3",
"uuid": "^3.3.2"
},
"devDependencies": {
"eslint": "^5.15.2",
......
......@@ -39,11 +39,18 @@ module.exports = {
user: 'eos',
password: '!QAZ2wsx',
},
harborImageCache: {
name: 'HARBOR',
size: 30,
cacheTime: '',
},
email: {
service: 'mail.quantgroup.cn',
user: 'qahome@quantgroup.cn',
pass: 'Quantgroup123',
},
prometheus: 'http://172.17.5.17:30002',
dingdingCpu: 'https://oapi.dingtalk.com/robot/send?access_token'
+ '=08fc72710502b4fec2aeab456ae1ff87e1d75d07f111b067bd1fa85bbedd5473',
......
......@@ -2,4 +2,6 @@
source /etc/profile
# NODE_ENV=production
pm2 start ./bin/server.js --node-args="--harmony" -n qa-api
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment