feat: add more

This commit is contained in:
xrkffgg
2020-12-22 18:14:54 +08:00
parent d70e5ec168
commit 5a0b58c5e3
7 changed files with 302 additions and 41 deletions

2
.gitignore vendored
View File

@@ -1,7 +1,7 @@
# @source: https://github.com/xrkffgg/gitignore/blob/master/.gitignore
# production
/dist
# /dist
/docs-dist
# Log file

197
README.md
View File

@@ -17,17 +17,23 @@ English | [简体中文](./README.zh-CN.md)
- ⭐ 基 础
- [`add-assignees`](#add-assignees)
- [`add-labels`](#add-labels)
- [`close-issue`](#close-issue)
- [`create-comment`](#create-comment)
- [`create-issue`](#create-issue)
- [`delete-comment`](#delete-comment)
- [`lock-issue`](#lock-issue)
- [`open-issue`](#open-issue)
- [`remove-assignees`](#remove-assignees)
- [`set-labels`](#set-labels)
- [`unlock-issue`](#unlock-issue)
- [`update-comment`](#update-comment)
- [`update-issue`](#update-issue)
- ⭐ 进 阶
- [`find-comment`](#find-comments)
- ⭐ 高 级
- 222
- 🌰 例 子
- [`find-comments + create-comment + update-comment`](#find-comments--create-comment--update-comment)
## 🚀 使 用
@@ -37,14 +43,14 @@ English | [简体中文](./README.zh-CN.md)
#### `add-assignees`
当一个 issue 新增时,将这个 issue 指定某人或多人。
当一个 issue 新增或修改时,将这个 issue 指定某人或多人。
```yml
name: Add Assigness
on:
issues:
types: [opened]
types: [opened, edited]
jobs:
add-assigness:
@@ -67,8 +73,8 @@ jobs:
| assignees | 指定人。当不填或者为空字符、空数组时,不指定 | string \| string\[] | ✖ | v1 |
- 其中的 `name` 可根据自行根据实际情况修改
- [on 参考](#触发机制)
- `${{ github.event.issue.number }}` 表示当前 issue[更多参考](https://docs.github.com/en/free-pro-team@latest/developers/webhooks-and-events)。
- [on 参考](#github-docs)
- `${{ github.event.issue.number }}` 表示当前 issue[更多参考](https://docs.github.com/en/free-pro-team@latest/developers/webhooks-and-events)。
⏫ [返回列表](#列-表)
@@ -106,6 +112,29 @@ jobs:
⏫ [返回列表](#列-表)
#### `close-issue`
关闭指定 issue。当输入 `body` 时,会同时进行评论。
```yml
- name: Close issue
uses: actions-cool/issue-helper@v1
with:
actions: 'close-issue'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: xxx
body: 'This is auto closed.'
```
| 参数 | 描述 | 类型 | 必填 | 版本 |
| -- | -- | -- | -- | -- |
| actions | actions 类型,当为数组时,会进行多个操作 | string \| string\[] | ✔ | v1 |
| token | [token 说明](#token) | string | ✖ | v1 |
| issue-number | 指定的 issue | number | ✔ | v1 |
| body | 关闭 issue 时,可进行评论 | string | ✖ | v1 |
⏫ [返回列表](#列-表)
#### `create-comment`
当新增一个指定 label 时,对该 issue 进行评论。
@@ -145,8 +174,8 @@ jobs:
- `body` 默认为:`Currently at ${owner}/${repo}. And this is default comment.`
- 其中 `${owner}/${repo}` 表示当前仓库
- 返回 `comment-id`,可用于之后操作。用法参考
- `${{ github.event.issue.user.login }}` 表示该 issue 的创建者
- 返回 `comment-id`,可用于之后操作。[用法参考](#输出使用)
- `${{ github.event.issue.user.login }}` 表示该 issue 的创建者
⏫ [返回列表](#列-表)
@@ -188,14 +217,14 @@ jobs:
| contents | 为新增 issue 增加 [reaction](#reactions-types) | string \| string\[] | ✖ | v1 |
- `title` 默认为:`Default Title`
- `body` 默认同上
- 返回 `issue_number`用法同上
- `body` 默认同上
- 返回 `issue-number`[用法参考](#输出使用)
⏫ [返回列表](#列-表)
#### `delete-comment`
根据 [`comment_id`](#comment_id-获取) 删除指定评论。单个应用场景不多,可参考高级用法。
根据 [`comment_id`](#comment_id-获取) 删除指定评论。
```yml
- name: Delete comment
@@ -246,6 +275,28 @@ jobs:
⏫ [返回列表](#列-表)
#### `open-issue`
打开指定 issue。
```yml
- name: Open issue
uses: actions-cool/issue-helper@v1
with:
actions: 'open-issue'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: xxx
```
| 参数 | 描述 | 类型 | 必填 | 版本 |
| -- | -- | -- | -- | -- |
| actions | actions 类型,当为数组时,会进行多个操作 | string \| string\[] | ✔ | v1 |
| token | [token 说明](#token) | string | ✖ | v1 |
| issue-number | 指定的 issue | number | ✔ | v1 |
| body | 打开 issue 时,可进行评论 | string | ✖ | v1 |
⏫ [返回列表](#列-表)
#### `remove-assignees`
移除 issue 指定人员。
@@ -315,18 +366,28 @@ jobs:
#### `update-comment`
根据 [`comment_id`](#comment_id-获取) 更新指定评论。单个应用场景不多,可参考高级用法。
根据 [`comment_id`](#comment_id-获取) 更新指定评论。
下面的例子展示的是,为每个新增的 comment 增加 👀 。
```yml
- name: Update comment
name: Add eyes to each comment
on:
issue_comment:
types: [created]
jobs:
update-comment:
runs-on: ubuntu-latest
steps:
- name: Update comment
uses: actions-cool/issue-helper@v1
with:
actions: 'update-comment'
token: ${{ secrets.GITHUB_TOKEN }}
comment-id: xxx
body: 'xxxx'
update-mode: 'replace'
contents: '+1'
comment-id: ${{ github.event.comment.id }}
contents: 'eyes'
```
| 参数 | 描述 | 类型 | 必填 | 版本 |
@@ -338,7 +399,7 @@ jobs:
| update-mode | 更新模式。`replace` 替换,`append` 附加 | string | ✖ | v1 |
| contents | 为 comment 增加 [reaction](#reactions-types) | string \| string\[] | ✖ | v1 |
- `body` 默认同上
- `body` 不输入时,会保持原有
- `update-mode``append` 时,会进行附加操作。非 `append` 都会进行替换。仅对 `body` 生效。
⏫ [返回列表](#列-表)
@@ -382,8 +443,93 @@ jobs:
### ⭐ 进 阶
#### `find-comments`
查找当前仓库 1 号 issue 中,创建者是 k ,内容包含 `this` 的评论列表。
```yml
- name: Find comments
uses: actions-cool/issue-helper@v1
with:
actions: 'find-comments'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: 1
comment-auth: k
body-includes: 'this'
```
| 参数 | 描述 | 类型 | 必填 | 版本 |
| -- | -- | -- | -- | -- |
| actions | actions 类型,当为数组时,会进行多个操作 | string \| string\[] | ✔ | v1 |
| token | [token 说明](#token) | string | ✖ | v1 |
| issue-number | 指定的 issue | number | ✔ | v1 |
| comment-auth | 评论创建者,不填时会查询所有 | string | ✖ | v1 |
| body-includes | 评论内容包含过滤,不填时无校验 | string | ✖ | v1 |
- 返回 `comments`, 格式如下:
```js
[
{id: 1, body: 'xxx'},
{id: 2, body: 'xxxx'}
]
```
⏫ [返回列表](#列-表)
### ⭐ 高 级
## 🌰 例 子
以下列举一些例子,请灵活参考。
### `find-comments + create-comment + update-comment`
假设场景:当 issue 修改时,查找是否有 k 创建的包含 `error` 的评论,如果只有一个,则更新该 comment如果没有则新增一个 comment。
```yml
name: Test
on:
isssue:
types: [edited]
jobs:
do-test:
runs-on: ubuntu-latest
steps:
- name: find comments
uses: actions-cool/issue-helper@v1
id: fcid
with:
actions: 'find-comments'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
comment-auth: k
body-includes: 'error'
- name: create comment
if: ${{ steps.fcid.outputs.comments.length == 0 }}
uses: actions-cool/issue-helper@v1
with:
actions: 'create-comment'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
body: 'Some error!'
- name: update comment
if: ${{ steps.fcid.outputs.comments.length == 1 }}
uses: actions-cool/issue-helper@v1
with:
actions: 'update-comment'
token: ${{ secrets.GITHUB_TOKEN }}
comment-id: ${{ steps.fcid.outputs.comments[0].id }}
body: 'Some error again!'
update-mode: 'append'
```
⏫ [返回列表](#列-表)
## 🎁 参 考
### token
@@ -401,12 +547,21 @@ jobs:
⏫ [返回列表](#列-表)
### 条件判断
### 输出使用
```yml
- name: Create issue
uses: actions-cool/issue-helper@v1
id: createissue
with:
actions: 'create-issue'
token: ${{ secrets.GITHUB_TOKEN }}
- name: Check outputs
run: echo "Outputs issue_number is ${{ steps.createissue.outputs.issue-number }}"
```
### GitHub Docs
### 触发机制
- [Workflow syntax for GitHub Actions](https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions#on)
- [Events that trigger workflows](https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows)
- [GitHub Actions 语法](https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions#on)
- [工作流触发机制](https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows)
⏫ [返回列表](#列-表)

View File

@@ -9,7 +9,7 @@ inputs:
description: 'github_token'
default: ${{ github.token }}
outputs:
issue_number:
issue-number:
description: 'Create Issue Number'
comment-id:
description: 'Create comment ID'

33
src/advanced.js Normal file
View File

@@ -0,0 +1,33 @@
require('dotenv').config();
const core = require("@actions/core");
const { Octokit } = require('@octokit/rest');
const token = core.getInput('token') || process.env.GH_TOKEN;
const octokit = new Octokit({ auth: `token ${token}` });
const commentAuth = core.getInput("comment-auth") || 'xrkffgg';
const bodyIncludes = core.getInput('body-includes') || 'is';
async function doFindComments (owner, repo, issueNumber) {
const res = await octokit.issues.listComments({
owner,
repo,
issue_number: issueNumber
});
core.info(`Actions: [find-comments][${issueNumber}] success!`);
let comments = [];
res.data.forEach(item => {
if ((commentAuth ? item.user.login === commentAuth : true) && (bodyIncludes ? item.body.includes(bodyIncludes) : true)) {
comments.push({
id: item.id,
body: item.body
})
}
})
core.setOutput("comments", comments);
};
module.exports = {
doFindComments,
};

View File

@@ -38,6 +38,20 @@ async function doAddLabels (owner, repo, issueNumber, labels) {
core.info(`Actions: [add-labels][${labels}] success!`);
};
async function doCloseIssue (owner, repo, issueNumber) {
if (core.getInput("body")) {
await doCreateComment(owner, repo, issueNumber, core.getInput("body"))
}
await octokit.issues.update({
owner,
repo,
issue_number: issueNumber,
state: 'closed'
});
core.info(`Actions: [close-issue][${issueNumber}] success!`);
};
async function doCreateComment (owner, repo, issueNumber, body) {
const { data } = await octokit.issues.createComment({
owner,
@@ -92,7 +106,7 @@ async function doCreateIssue (owner, repo, title, body, labels, assignees) {
}
const { data } = await octokit.issues.create(params);
core.info(`Actions: [create-issue][${title}] success!`);
core.setOutput("issue_number", data.number);
core.setOutput("issue-number", data.number);
if (contents) {
await doCreateIssueContent(owner, repo, data.number, contents);
@@ -141,6 +155,20 @@ async function doLockIssue (owner, repo, issueNumber) {
core.info(`Actions: [lock-issue][${issueNumber}] success!`);
};
async function doOpenIssue (owner, repo, issueNumber) {
if (core.getInput("body")) {
await doCreateComment(owner, repo, issueNumber, core.getInput("body"))
}
await octokit.issues.update({
owner,
repo,
issue_number: issueNumber,
state: 'open'
});
core.info(`Actions: [open-issue][${issueNumber}] success!`);
};
async function doRemoveAssignees (owner, repo, issueNumber, assignees) {
await octokit.issues.removeAssignees({
owner,
@@ -190,6 +218,7 @@ async function doUpdateComment (
comment_id: commentId
};
if (core.getInput("body")) {
if (updateMode === 'append') {
params.body = `${comment_body}\n${body}`;
} else {
@@ -198,6 +227,7 @@ async function doUpdateComment (
await octokit.issues.updateComment(params);
core.info(`Actions: [update-comment][${commentId}] success!`);
}
if (contents) {
await doCreateCommentContent(owner, repo, commentId, contents);
@@ -280,15 +310,17 @@ function testContent(con) {
module.exports = {
doAddAssignees,
doAddLabels,
doCloseIssue,
doCreateComment,
doCreateCommentContent,
doCreateIssue,
doCreateIssueContent,
doDeleteComment,
doLockIssue,
doOpenIssue,
doRemoveAssignees,
doSetLabels,
doUnlockIssue,
doUpdateComment,
doUpdateIssue,
doUpdateComment
};

View File

@@ -4,38 +4,53 @@ const github = require("@actions/github");
const {
doAddAssignees,
doAddLabels,
doCloseIssue,
doCreateComment,
doCreateCommentContent,
doCreateIssue,
doCreateIssueContent,
doDeleteComment,
doLockIssue,
doOpenIssue,
doRemoveAssignees,
doSetLabels,
doUnlockIssue,
doUpdateComment,
doUpdateIssue,
doUpdateComment
} = require('./base.js');
const {
doFindComments,
} = require('./advanced.js');
const ALLACTIONS = [
// base
'add-assignees',
'add-labels',
'close-issue',
'create-comment',
'create-issue',
'delete-comment',
'lock-issue',
'open-issue',
'remove-assignees',
'set-labels',
'unlock-issue',
'update-comment',
'update-issue',
// advanced
'find-comments',
];
async function main() {
try {
const owner = github.context.repo.owner;
const repo = github.context.repo.repo;
const issueNumber = core.getInput('issue-number');
// const owner = github.context.repo.owner;
// const repo = github.context.repo.repo;
const owner = 'actions-cool';
const repo = 'issue-helper';
const issueNumber = core.getInput('issue-number') || 1;
const commentId = core.getInput('comment-id');
const defaultBody = `Currently at ${owner}/${repo}. And this is default comment.`
@@ -54,7 +69,8 @@ async function main() {
updateMode = 'replace';
}
const actions = core.getInput("actions", { required: true });
// const actions = core.getInput("actions", { required: true });
const actions = 'find-comments';
if (typeof(actions) === 'object') {
actions.forEach(item => {
@@ -74,12 +90,16 @@ async function main() {
async function choseActions(action) {
switch (action) {
// base
case 'add-assignees':
await doAddAssignees(owner, repo, issueNumber, assignees);
break;
case 'add-labels':
await doAddLabels(owner, repo, issueNumber, labels);
break;
case 'close-issue':
await doCloseIssue(owner, repo, issueNumber);
break;
case 'create-comment':
await doCreateComment(owner, repo, issueNumber, body);
break;
@@ -92,6 +112,9 @@ async function main() {
case 'lock-issue':
await doLockIssue(owner, repo, issueNumber);
break;
case 'open-issue':
await doOpenIssue(owner, repo, issueNumber);
break;
case 'remove-assignees':
await doRemoveAssignees(owner, repo, issueNumber, assignees);
break;
@@ -123,6 +146,18 @@ async function main() {
labels
);
break;
// advanced
case 'find-comments':
await doFindComments(
owner,
repo,
issueNumber
);
break;
// ultimate
// default
default:
break;
}

6
src/ultimate.js Normal file
View File

@@ -0,0 +1,6 @@
require('dotenv').config();
const core = require("@actions/core");
const { Octokit } = require('@octokit/rest');
const token = core.getInput('token') || process.env.GH_TOKEN;
const octokit = new Octokit({ auth: `token ${token}` });