mirror of
https://github.com/xuexb/github-bot.git
synced 2026-01-18 13:56:38 +00:00
391 lines
8.4 KiB
JavaScript
Executable File
391 lines
8.4 KiB
JavaScript
Executable File
/**
|
|
* @file github 操作库
|
|
* @author xuexb <fe.xiaowu@gmail.com>
|
|
*/
|
|
|
|
const GitHub = require('github')
|
|
const { toArray } = require('./utils')
|
|
|
|
const github = new GitHub({
|
|
debug: process.env.NODE_ENV === 'development'
|
|
})
|
|
|
|
github.authenticate({
|
|
type: 'token',
|
|
token: process.env.GITHUB_TOKEN
|
|
})
|
|
|
|
module.exports = {
|
|
/**
|
|
* issue 是否包含某 label
|
|
*
|
|
* @param {Object} payload data
|
|
* @param {string} body 评论内容
|
|
* @return {boolean}
|
|
*/
|
|
async issueHasLabel (payload, label) {
|
|
const owner = payload.repository.owner.login
|
|
const repo = payload.repository.name
|
|
const number = payload.issue.number
|
|
|
|
try {
|
|
const res = await github.issues.getIssueLabels({
|
|
owner,
|
|
repo,
|
|
number
|
|
})
|
|
return res.data.map(v => v.name).indexOf(label) > -1
|
|
} catch (e) {
|
|
return false
|
|
}
|
|
},
|
|
|
|
/**
|
|
* PR 是否包含某 label
|
|
*
|
|
* @param {Object} payload data
|
|
* @param {string} body 评论内容
|
|
* @return {boolean}
|
|
*/
|
|
async pullRequestHasLabel (payload, label) {
|
|
const owner = payload.repository.owner.login
|
|
const repo = payload.repository.name
|
|
const number = payload.pull_request.number
|
|
|
|
try {
|
|
const res = await github.issues.getIssueLabels({
|
|
owner,
|
|
repo,
|
|
number
|
|
})
|
|
return res.data.map(v => v.name).indexOf(label) > -1
|
|
} catch (e) {
|
|
return false
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 评论 issue
|
|
*
|
|
* @param {Object} payload data
|
|
* @param {string} body 评论内容
|
|
* @return {boolean} 是否成功
|
|
*/
|
|
async commentIssue (payload, body) {
|
|
const owner = payload.repository.owner.login
|
|
const repo = payload.repository.name
|
|
const number = payload.issue.number
|
|
|
|
try {
|
|
await github.issues.createComment({
|
|
owner,
|
|
repo,
|
|
number,
|
|
body
|
|
})
|
|
return true
|
|
} catch (e) {
|
|
return false
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 评论 PR
|
|
*
|
|
* @param {Object} payload data
|
|
* @param {string} body 评论内容
|
|
* @return {boolean} 是否成功
|
|
*/
|
|
async commentPullRequest (payload, body) {
|
|
const owner = payload.repository.owner.login
|
|
const repo = payload.repository.name
|
|
const number = payload.pull_request.number
|
|
|
|
try {
|
|
await github.issues.createComment({
|
|
owner,
|
|
repo,
|
|
number,
|
|
body
|
|
})
|
|
return true
|
|
} catch (e) {
|
|
return false
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 关闭 issue
|
|
*
|
|
* @param {Object} payload data
|
|
* @return {boolean} 是否成功
|
|
*/
|
|
async closeIssue (payload) {
|
|
const owner = payload.repository.owner.login
|
|
const repo = payload.repository.name
|
|
const number = payload.issue.number
|
|
|
|
try {
|
|
await github.issues.edit({
|
|
owner,
|
|
repo,
|
|
number,
|
|
state: 'closed'
|
|
})
|
|
return true
|
|
} catch (e) {
|
|
return false
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 分派作者到 issues
|
|
*
|
|
* @param {Object} payload data
|
|
* @param {string | Array} assign 用户id
|
|
* @return {boolean} 是否成功
|
|
*/
|
|
async addAssigneesToIssue (payload, assign) {
|
|
const owner = payload.repository.owner.login
|
|
const repo = payload.repository.name
|
|
const number = payload.issue.number
|
|
|
|
try {
|
|
await github.issues.edit({
|
|
owner,
|
|
repo,
|
|
number,
|
|
assignees: toArray(assign)
|
|
})
|
|
return true
|
|
} catch (e) {
|
|
return false
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 添加标签到 issue
|
|
*
|
|
* @param {Object} payload data
|
|
* @param {string | Array} labels 标签
|
|
* @return {boolean} 是否成功
|
|
*/
|
|
async addLabelsToIssue (payload, labels) {
|
|
const owner = payload.repository.owner.login
|
|
const repo = payload.repository.name
|
|
const number = payload.issue.number
|
|
|
|
try {
|
|
await github.issues.addLabels({
|
|
owner,
|
|
repo,
|
|
number,
|
|
labels: toArray(labels)
|
|
})
|
|
return true
|
|
} catch (e) {
|
|
return false
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 添加标签到 PR
|
|
*
|
|
* @param {Object} payload data
|
|
* @param {string | Array} labels 标签
|
|
* @return {boolean} 是否成功
|
|
*/
|
|
async addLabelsToPullRequest (payload, labels) {
|
|
const owner = payload.repository.owner.login
|
|
const repo = payload.repository.name
|
|
const number = payload.pull_request.number
|
|
|
|
try {
|
|
await github.issues.addLabels({
|
|
owner,
|
|
repo,
|
|
number,
|
|
labels: toArray(labels)
|
|
})
|
|
return true
|
|
} catch (e) {
|
|
return false
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 删除 PR 标签
|
|
*
|
|
* @param {Object} payload data
|
|
* @param {string} name 标签名
|
|
* @return {boolean} 是否成功
|
|
*/
|
|
async removeLabelsToPullRequest (payload, name) {
|
|
const owner = payload.repository.owner.login
|
|
const repo = payload.repository.name
|
|
const number = payload.pull_request.number
|
|
|
|
try {
|
|
await github.issues.removeLabel({
|
|
owner,
|
|
repo,
|
|
number,
|
|
name
|
|
})
|
|
return true
|
|
} catch (e) {
|
|
return false
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 删除 issue 标签
|
|
*
|
|
* @param {Object} payload data
|
|
* @param {string} name 标签名
|
|
* @return {boolean} 是否成功
|
|
*/
|
|
async removeLabelsToIssue (payload, name) {
|
|
const owner = payload.repository.owner.login
|
|
const repo = payload.repository.name
|
|
const number = payload.issues.number
|
|
try {
|
|
await github.issues.removeLabel({
|
|
owner,
|
|
repo,
|
|
number,
|
|
name
|
|
})
|
|
return true
|
|
} catch (e) {
|
|
return false
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 创建发布
|
|
*
|
|
* @param {Object} payload data
|
|
* @param {string} options.tag_name tag名
|
|
* @param {string} options.target_commitish tag hash
|
|
* @param {string} options.name 标题
|
|
* @param {string} options.body 内容
|
|
* @param {boolean} options.draft 是否为草稿
|
|
* @param {boolean} options.prerelease 是否预发布
|
|
* @return {boolean} 是否成功
|
|
*/
|
|
async createRelease (payload, { tag_name, target_commitish, name, body, draft, prerelease }) {
|
|
const owner = payload.repository.owner.login
|
|
const repo = payload.repository.name
|
|
try {
|
|
await github.repos.createRelease({
|
|
owner,
|
|
repo,
|
|
tag_name,
|
|
target_commitish,
|
|
name,
|
|
body,
|
|
draft,
|
|
prerelease
|
|
})
|
|
return true
|
|
} catch (e) {
|
|
return false
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 根据tag获取发布信息
|
|
*
|
|
* @param {Object} payload data
|
|
* @param {string} options.tag_name tag名
|
|
*
|
|
* @return {Object | null}
|
|
*/
|
|
async getReleaseByTag (payload, { tag_name }) {
|
|
const owner = payload.repository.owner.login
|
|
const repo = payload.repository.name
|
|
try {
|
|
const res = await github.repos.getReleaseByTag({
|
|
owner,
|
|
repo,
|
|
tag: tag_name
|
|
})
|
|
return res.data
|
|
} catch (e) {
|
|
return null
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 创建 review 请求
|
|
*
|
|
* @param {Object} payload data
|
|
* @param {Array | string} options.reviewers reviewer
|
|
* @param {Array | string} options.team_reviewers team_reviewers
|
|
*
|
|
* @return {boolean} 是否成功
|
|
*/
|
|
async createReviewRequest (payload, { reviewers, team_reviewers }) {
|
|
const owner = payload.repository.owner.login
|
|
const repo = payload.repository.name
|
|
const number = payload.pull_request.number
|
|
try {
|
|
await github.pullRequests.createReviewRequest({
|
|
owner,
|
|
repo,
|
|
number,
|
|
reviewers: toArray(reviewers),
|
|
team_reviewers: toArray(team_reviewers)
|
|
})
|
|
return true
|
|
} catch (e) {
|
|
return false
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 获得 repo 所有的tag
|
|
*
|
|
* @param {any} payload data
|
|
* @return {Array}
|
|
*/
|
|
async getTags (payload) {
|
|
const owner = payload.repository.owner.login
|
|
const repo = payload.repository.name
|
|
try {
|
|
const res = await github.repos.getTags({
|
|
owner,
|
|
repo
|
|
})
|
|
return res.data
|
|
} catch (e) {
|
|
return []
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 对比2个提交
|
|
*
|
|
* @param {Object} payload data
|
|
* @param {string} options.base 基点
|
|
* @param {string} options.head diff
|
|
* @return {Array | null}
|
|
*/
|
|
async compareCommits (payload, { base, head }) {
|
|
const owner = payload.repository.owner.login
|
|
const repo = payload.repository.name
|
|
try {
|
|
const res = await github.repos.compareCommits({
|
|
owner,
|
|
repo,
|
|
base,
|
|
head
|
|
})
|
|
return res.data
|
|
} catch (e) {
|
|
return null
|
|
}
|
|
}
|
|
}
|