Compare commits

...

79 Commits

Author SHA1 Message Date
xrkffgg
5c1fab1ef7 feat: default number support issue-comment (#90)
* feat: default number support issue-comment

* add log
2021-09-13 17:11:13 +08:00
元凛
2751b8e755 chore: fix build warn
close https://github.com/actions-cool/issues-helper/issues/89
2021-09-07 09:24:57 +08:00
元凛
3b3e72d628 docs: unity version 2021-09-06 19:36:15 +08:00
xrkffgg
ec5a128e11 fix: RemoveLabels when has no label (#88)
* fix: RemoveLabels when has no label

* doc
2021-09-06 19:17:30 +08:00
xrkffgg
8482b73885 Create CONTRIBUTING.md 2021-09-06 13:37:01 +08:00
元凛
23e8a42c18 docs: add 2.4.1 changelog 2021-09-05 19:41:57 +08:00
xrkffgg
f83978e0ed fix: remove labels define error (#86)
* fix: remove labels define error

* chore: up dumi version

* chore: adjust app
2021-09-05 19:39:49 +08:00
xrkffgg
207593c17b docs: up issue temp 2021-08-27 10:06:39 +08:00
元凛
47079090b4 docs: update logo url 2021-08-16 11:19:04 +08:00
元凛
33f5c9a41b docs: add user naive-ui 2021-08-16 10:32:57 +08:00
xrkffgg
3f73e5f3b7 chore: up 2.4.0 (#84)
* chore: up 2.4.0

* fix: add miss
2021-08-15 20:24:47 +08:00
xrkffgg
dc4a7a3ca8 feat: support custom repo (#83) 2021-08-15 19:55:45 +08:00
xrkffgg
f76bae5b37 feat: support default issueNumber get from context (#81) 2021-08-13 14:46:48 +08:00
xrkffgg
b395ad434f fix: action run async (#79)
* fix: for await

* style: perf mess

Co-authored-by: meteorlxy <meteor.lxy@foxmail.com>
2021-08-13 12:58:11 +08:00
xrkffgg
b5d3740262 docs: remove error mess (#80) 2021-08-12 20:56:13 +08:00
元凛
c7e172c679 docs: up nutui logo 2021-08-10 20:18:38 +08:00
元凛
7198ab8542 docs: add user vuepress 2021-08-10 19:59:00 +08:00
元凛
eb91a70ccc docs: up 2.3.1 2021-08-09 23:48:37 +08:00
meteorlxy
db8ab69114 refactor: extract exclude-labels array to outer scope (#75) 2021-08-09 23:41:33 +08:00
元凛
86102bcaef docs: add changelog emoji 2021-08-09 19:35:19 +08:00
元凛
c585c79a2a docs: up v2.3.0 2021-08-09 19:26:36 +08:00
xrkffgg
b64d6e451f feat: add exclude-labels for query issues (#74)
* feat: add exclude-labels for query issues

* add formay

* Update ci.yml

* docs: add readme
2021-08-09 19:18:55 +08:00
xrkffgg
d443509c47 Create ci-notice.yml 2021-06-17 23:54:56 +08:00
元凛
4b5824425d style: perf show 2021-05-24 23:59:15 +08:00
ajuner
b483519646 docs: add user (#72)
* docs: add user

* fix(users): add params

* feat(users): add imgStyle

* Update README.md

* Update USERS.js

* Update README.md

* Update README.en-US.md

* Update update-users.js

Co-authored-by: xrkffgg <xrkffgg@gmail.com>
2021-05-24 23:46:01 +08:00
xrkffgg
4a12f7e54a ci: add auto gh pages 2021-05-08 20:06:39 +08:00
元凛
1b100be0d7 docs: add note 2021-05-08 20:04:39 +08:00
xrkffgg
afb2d0f2e5 chore: move less out src (#71)
* chore: move less out src

* remove
2021-04-12 15:14:13 +08:00
xrkffgg
86d9dd7f1a chore: update dumi version 2021-03-29 11:40:08 +08:00
xrkffgg
5891ef3922 ci: update preview (#69)
* Create preview-start.yml

* Create preview-build.yml

* Create preview-deploy.yml

* Delete surge-preview.yml
2021-03-29 11:30:05 +08:00
xrkffgg
7a119339df docs: simple pr temp 2021-03-29 11:06:49 +08:00
ajuner
958f1760a2 docs: add user (#68)
* docs: add user

* chore: code format

* fix: update users script
2021-03-29 11:05:52 +08:00
xrkffgg
d82909b31d fix: list comment page lost in [find-comments] (#66)
* fix: list comment page lost in [find-comments]

* add changelog
2021-03-21 20:32:11 +08:00
xrkffgg
89884a3a50 Delete gh-pages.yml 2021-03-21 18:07:20 +08:00
xrkffgg
1d2d39036b refactor: change to title-excludes 2021-03-21 17:57:14 +08:00
xrkffgg
a66760a95f feat: add title-remove for check-issue (#65)
* feat: add title-remove for check-issue

* add doc
2021-03-21 13:23:21 +08:00
xrkffgg
8abd4b29f8 docs: fix title 2021-03-18 22:02:48 +08:00
xrkffgg
03203f3b5e chore: update dumi version 2021-03-14 00:51:04 +08:00
xrkffgg
0acc9bec8c docs: add branding web 2021-02-23 17:20:33 +08:00
xrkffgg
56afcb6a23 docs: add dingding 2021-02-21 16:10:57 +08:00
xrkffgg
39ff3699d6 docs: up v2.1.2 2021-02-19 18:00:41 +08:00
xrkffgg
efca7df548 feat: update/delete comment support find-comments out (#63)
* fix: find comments

* add out

* add more

* add

* add doc

* fix link

* perf

* update doc

* Update gh-pages.yml

* Update .github/workflows/gh-pages.yml
2021-02-19 17:51:19 +08:00
xrkffgg
19c073d744 chore: add env & fix link 2021-02-18 10:00:08 +08:00
xrkffgg
a6a35924a4 Create surge-preview.yml 2021-02-18 09:55:37 +08:00
xrkffgg
eb13c18a92 docs: add users 2021-02-13 03:57:37 +08:00
xrkffgg
d4e1fb07d0 chore: remove build env 2021-02-07 11:56:38 +08:00
xrkffgg
d2ccffe750 docs: add users 2021-02-07 11:49:20 +08:00
xrkffgg
f65aeadf97 docs: update labels helper 2021-02-04 11:46:45 +08:00
xrkffgg
03f463ffc8 Delete surge-preview.yml 2021-02-03 22:41:25 +08:00
xrkffgg
728e5aa63e Update ci.yml 2021-02-03 11:03:24 +08:00
xrkffgg
2a7406da4f docs: add rate limit
close https://github.com/actions-cool/issues-helper/issues/56
2021-02-03 09:57:23 +08:00
xrkffgg
f743eedacb chore: add catch (#59)
* chore: add catch

* format
2021-02-03 09:28:14 +08:00
xrkffgg
65461c17ed docs: update v2.1.1 (#58) 2021-02-03 00:45:14 +08:00
xrkffgg
1efbf3d3cf fix: api request limit (#57) 2021-02-03 00:34:17 +08:00
xrkffgg
14e4762bf5 docs: up v2.1.0 2021-02-02 20:38:24 +08:00
xrkffgg
fd3eb6dbd3 feat: add create-label (#54)
* feat: add create-label

* add doc

* format

* add
2021-02-02 20:33:00 +08:00
xrkffgg
561193570f up 2021-02-02 20:32:37 +08:00
xrkffgg
f2288b2a14 add 2021-02-02 20:22:50 +08:00
xrkffgg
4281108d01 format 2021-02-02 20:22:38 +08:00
xrkffgg
1cc6f0b7ca add doc 2021-02-02 20:12:42 +08:00
xrkffgg
f6788d2b8e feat: add create-label 2021-02-02 17:55:54 +08:00
xrkffgg
8acd7991df docs: add token trigger note 2021-02-01 10:03:25 +08:00
xrkffgg
321da097ae Create gh-pages.yml 2021-01-28 15:25:47 +08:00
xrkffgg
13e635fb2c docs: up version faq 2021-01-27 11:25:01 +08:00
xrkffgg
ae8b2ad0bd docs: update version desc 2021-01-27 11:17:46 +08:00
xrkffgg
576d7c4cb8 docs: up version v2 (#52) 2021-01-26 23:17:43 +08:00
xrkffgg
b0e25793f1 refactor: add require-permission default (#51) 2021-01-26 22:59:37 +08:00
xrkffgg
eb91801d3e docs: update changelog 1.12 2021-01-26 22:24:40 +08:00
xrkffgg
616c112b12 feat: add lock-reason (#49)
* feat: add lock-reason

* add dist
2021-01-26 22:17:55 +08:00
xrkffgg
1425c335af refactor: rename allow-permissions (#48)
* refactor: rename allow-permissions

* up
2021-01-26 21:50:10 +08:00
xrkffgg
f777971d6d feat: add allow-permissions (#46)
* feat: add

* up

* up

* add doc
2021-01-26 17:55:42 +08:00
xrkffgg
4c5e1fa83c Update ci.yml 2021-01-26 15:40:09 +08:00
xrkffgg
dcad795964 chore: add prettier (#45)
* chore: add prettier

* add badge

* up
2021-01-26 15:38:25 +08:00
xrkffgg
37632245d8 docs: add users 2021-01-22 15:53:33 +08:00
xrkffgg
9018700e94 docs: add users (#44)
* docs: add users

* fix
2021-01-18 09:54:18 +08:00
xrkffgg
11acd15e70 docs: update version (#43) 2021-01-14 10:41:25 +08:00
xrkffgg
7619e79b94 perf: expand duplicate action (#40)
* perf: expand duplicate action

* up
2021-01-13 11:08:56 +08:00
xrkffgg
c7cf5de709 feat: add question mark duplicate (#38)
* feat: add question mark duplicate

* add package

* add

* up

* up
2021-01-13 09:32:46 +08:00
xrkffgg
273b6abb78 docs: update version Introduction (#37)
* docs: update version Introduction

* add less
2021-01-12 18:12:11 +08:00
51 changed files with 22430 additions and 4046 deletions

View File

@@ -8,8 +8,8 @@ assignees:
### 🐛 Bug 描述 Bug description
<!-- 请在上方详细地描述 bug让大家都能理解。 -->
<!-- Please describe the bug in detail above so that everyone can understand. -->
<!-- 请在上方详细地描述 bug让大家都能理解。建议附上使用代码。 -->
<!-- Please describe the bug in detail above so that everyone can understand. It is recommended to attach the use code. -->
### 🏞 期望结果 Desired result

View File

@@ -42,13 +42,4 @@ Describe changes from the user side, and list all potential break changes or oth
| 🇺🇸 English | |
| 🇨🇳 Chinese | |
### ☑️ 请求合并前的自查清单 / Self Check before Merge
⚠️ 请自检并全部**勾选全部选项**。/ Please check all items below before review. ⚠️
- [ ] 文档已补充或无须补充 / Doc is updated/provided or not needed
- [ ] 代码演示已提供或无须提供 / Demo is updated/provided or not needed
- [ ] TypeScript 定义已补充或无须补充 / TypeScript definition is updated/provided or not needed
- [ ] Changelog 已提供或无须提供 / Changelog is provided or not needed
<!-- From: https://github.com/one-template/pr-template -->

22
.github/workflows/ci-notice.yml vendored Normal file
View File

@@ -0,0 +1,22 @@
name: CI Notice
on:
schedule:
- cron: '0 0 * * *'
workflow_dispatch:
jobs:
setup:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@main
- uses: actions-cool/ci-notice@main
with:
ci: |
yarn
yarn run package
yarn run docs:build
notice-types: 'issue'
issue-assignees: 'xrkffgg'

View File

@@ -12,8 +12,11 @@ jobs:
- name: install
run: yarn install
- name: package
run: yarn package
- name: format
run: yarn format-check
- name: test
run: yarn test
- name: package
run: yarn docs:build
run: yarn package

19
.github/workflows/gh-pages.yml vendored Normal file
View File

@@ -0,0 +1,19 @@
name: GitHub Pages
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- run: npm install
- run: npm run docs:build
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./docs-dist

40
.github/workflows/preview-build.yml vendored Normal file
View File

@@ -0,0 +1,40 @@
name: Preview Build
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
build-preview:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: build
run: |
yarn
yarn docs-dev:build
- run: |
zip -r dist.zip docs-dist
- name: upload dist artifact
uses: actions/upload-artifact@v2
with:
name: dist
path: dist.zip
retention-days: 5
- name: Save PR number
if: ${{ always() }}
run: echo ${{ github.event.number }} > ./pr-id.txt
- name: Upload PR number
if: ${{ always() }}
uses: actions/upload-artifact@v2
with:
name: pr
path: ./pr-id.txt

92
.github/workflows/preview-deploy.yml vendored Normal file
View File

@@ -0,0 +1,92 @@
name: Preview Deploy
on:
workflow_run:
workflows: ["Preview Build"]
types:
- completed
jobs:
success:
runs-on: ubuntu-latest
if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success'
steps:
- name: download pr artifact
uses: dawidd6/action-download-artifact@v2
with:
workflow: ${{ github.event.workflow_run.workflow_id }}
name: pr
- name: save PR id
id: pr
run: echo "::set-output name=id::$(<pr-id.txt)"
- name: download dist artifact
uses: dawidd6/action-download-artifact@v2
with:
workflow: ${{ github.event.workflow_run.workflow_id }}
workflow_conclusion: success
name: dist
- run: |
unzip dist.zip
- name: upload surge service
id: deploy
run: |
export DEPLOY_DOMAIN=https://issues-helper-preview-pr-${{ steps.pr.outputs.id }}.surge.sh
npx surge --project ./docs-dist --domain $DEPLOY_DOMAIN --token ${{ secrets.SURGE_TOKEN }}
- name: update status comment
uses: actions-cool/maintain-one-comment@v1.1.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
body: |
🎊 PR Preview has been successfully built and deployed to https://issues-helper-preview-pr-${{ steps.pr.outputs.id }}.surge.sh
<img width="300" src="https://user-images.githubusercontent.com/507615/90250366-88233900-de6e-11ea-95a5-84f0762ffd39.png">
<!-- Sticky Pull Request Comment -->
body-include: '<!-- Sticky Pull Request Comment -->'
number: ${{ steps.pr.outputs.id }}
- name: The job failed
if: ${{ failure() }}
uses: actions-cool/maintain-one-comment@v1.1.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
body: |
😭 Deploy PR Preview failed.
<img width="300" src="https://user-images.githubusercontent.com/507615/90250824-4e066700-de6f-11ea-8230-600ecc3d6a6b.png">
<!-- Sticky Pull Request Comment -->
body-include: '<!-- Sticky Pull Request Comment -->'
number: ${{ steps.pr.outputs.id }}
failed:
runs-on: ubuntu-latest
if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'failure'
steps:
- name: download pr artifact
uses: dawidd6/action-download-artifact@v2
with:
workflow: ${{ github.event.workflow_run.workflow_id }}
name: pr
- name: save PR id
id: pr
run: echo "::set-output name=id::$(<pr-id.txt)"
- name: The job failed
uses: actions-cool/maintain-one-comment@v1.1.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
body: |
😭 Deploy PR Preview failed.
<img width="300" src="https://user-images.githubusercontent.com/507615/90250824-4e066700-de6f-11ea-8230-600ecc3d6a6b.png">
<!-- Sticky Pull Request Comment -->
body-include: '<!-- Sticky Pull Request Comment -->'
number: ${{ steps.pr.outputs.id }}

19
.github/workflows/preview-start.yml vendored Normal file
View File

@@ -0,0 +1,19 @@
name: Preview Start
on: pull_request_target
jobs:
preview:
runs-on: ubuntu-latest
steps:
- name: create
uses: actions-cool/maintain-one-comment@v1.1.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
body: |
⚡️ Deploying PR Preview...
<img src="https://user-images.githubusercontent.com/507615/90240294-8d2abd00-de5b-11ea-8140-4840a0b2d571.gif" width="300" />
<!-- Sticky Pull Request Comment -->
body-include: '<!-- Sticky Pull Request Comment -->'

View File

@@ -1,20 +0,0 @@
name: 🔂 Surge PR Preview
on: pull_request_target
jobs:
preview:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
ref: refs/pull/${{ github.event.pull_request.number }}/merge
- uses: afc163/surge-preview@v1
with:
surge_token: ${{ secrets.SURGE_TOKEN }}
github_token: ${{ secrets.GITHUB_TOKEN }}
build: |
yarn
yarn docs-dev:build
dist: docs-dist
teardown: 'true'

5
.prettierignore Normal file
View File

@@ -0,0 +1,5 @@
dist/
lib/
docs-dist/
node_modules/
src/.umi/

6
.prettierrc.js Normal file
View File

@@ -0,0 +1,6 @@
const fabric = require('@umijs/fabric');
module.exports = {
...fabric.prettier,
arrowParens: 'avoid',
};

View File

@@ -1,4 +1,4 @@
export default {
base: '/',
publicPath: '/'
publicPath: '/',
};

View File

@@ -4,12 +4,10 @@ import { defineConfig } from 'dumi';
const name = 'issues-helper';
export default defineConfig({
title: 'Issue Helper',
title: 'Issues Helper',
mode: 'site',
favicon:
'https://avatars1.githubusercontent.com/u/73879334?s=200&v=4',
logo:
'https://avatars1.githubusercontent.com/u/73879334?s=200&v=4',
favicon: 'https://avatars1.githubusercontent.com/u/73879334?s=200&v=4',
logo: 'https://avatars1.githubusercontent.com/u/73879334?s=200&v=4',
exportStatic: {},
ssr: {},
outputPath: 'docs-dist',
@@ -38,7 +36,7 @@ export default defineConfig({
{ title: 'Advanced', path: '/en-US/advanced' },
{ title: 'Changelog', path: '/en-US/changelog' },
{ title: 'GitHub', path: 'https://github.com/actions-cool/issues-helper' },
]
],
},
menus: {
'/guide': [

View File

@@ -1,3 +1,102 @@
<!--
🐞 Bug fix
🚀 New feature
💄 Perf
📝 Docs
⚡️ Code style
-->
## v2.4.3
`2021.09.13`
- 🚀 feat: default number support `issue-comment`. [#90](https://github.com/actions-cool/issues-helper/pull/90)
## v2.4.2
`2021.09.06`
- 🐞 fix: `doRemoveLabels` when has no label. [#88](https://github.com/actions-cool/issues-helper/pull/88)
## v2.4.1
`2021.09.05`
- 🐞 fix: remove labels define error. [#86](https://github.com/actions-cool/issues-helper/pull/86)
## v2.4.0
`2021.08.15`
- 🚀 feat: support custom repo. [#83](https://github.com/actions-cool/issues-helper/pull/83)
- 🚀 feat: support default issueNumber get from context. [#81](https://github.com/actions-cool/issues-helper/pull/81)
- 🐞 fix: action run async. [#79](https://github.com/actions-cool/issues-helper/pull/79)
## v2.3.1
`2021.08.09`
- ⚡️ refactor: extract exclude-labels array to outer scope. [#75](https://github.com/actions-cool/issues-helper/pull/75) [@meteorlxy](https://github.com/meteorlxy)
## v2.3.0
`2021.08.09`
- 🚀 feat: add exclude-labels for `check-inactive` `close-issues` `lock-issues`. [#74](https://github.com/actions-cool/issues-helper/pull/74)
## v2.2.1
`2021.03.21`
- fix: list comment page lost in `find-comments`. [#66](https://github.com/actions-cool/issues-helper/pull/66)
## v2.2.0
`2021.03.21`
- feat: Added `title-excludes` parameter to `check-issue`. [#65](https://github.com/actions-cool/issues-helper/pull/65)
## v2.1.2
`2021.02.19`
- feat: update/delete comment support find-comments out. [#63](https://github.com/actions-cool/issues-helper/pull/63)
## v2.1.1
`2021.02.03`
- fix: api request limit. [#57](https://github.com/actions-cool/issues-helper/pull/57)
- chore: add catch. [#59](https://github.com/actions-cool/issues-helper/pull/59)
## v2.1.0
`2021.02.02`
- feat: add create-label. [#54](https://github.com/actions-cool/issues-helper/pull/54)
## v2.0.0
`2021.01.26`
- refactor: add require-permission default. [#51](https://github.com/actions-cool/issues-helper/pull/51)
## v1.12
> It will be the last version of 1.x
`2021.01.26`
- feat: add require-permission. [#46](https://github.com/actions-cool/issues-helper/pull/46) [#48](https://github.com/actions-cool/issues-helper/pull/48)
- feat: add lock-reason. [#49](https://github.com/actions-cool/issues-helper/pull/49)
## v1.11
`2021.01.14`
- feat: add question mark duplicate. [#38](https://github.com/actions-cool/issues-helper/pull/38)
- perf: expand duplicate action. [#40](https://github.com/actions-cool/issues-helper/pull/40)
## v1.10
`2021.01.12`

9
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,9 @@
## release
完整版本在网页上进行
### 替换小版本
- 删除 v2 tag
- git push origin :refs/tags/v2
- 把最新的 v2.1.0 推送到 远端 v2 tag
- git push origin v2.1.0:v2

View File

@@ -5,9 +5,11 @@
[![](https://img.shields.io/github/workflow/status/actions-cool/issues-helper/ci?style=flat-square)](https://github.com/actions-cool/issues-helper/actions)
[![](https://img.shields.io/badge/marketplace-issues--helper-red?style=flat-square)](https://github.com/marketplace/actions/issues-helper)
[![dumi](https://img.shields.io/badge/docs%20by-dumi-blue?style=flat-square)](https://github.com/umijs/dumi)
[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
[![](https://img.shields.io/github/v/release/actions-cool/issues-helper?style=flat-square&color=orange)](https://github.com/actions-cool/issues-helper/releases)
[![](https://img.shields.io/badge/discussions-on%20github-blue?style=flat-square&color=%2308979c)](https://github.com/actions-cool/issues-helper/discussions)
[![](https://img.shields.io/github/stars/actions-cool/issues-helper?style=flat-square)](https://github.com/actions-cool/issues-helper/stargazers)
[![](https://img.shields.io/badge/discussions-on%20github-blue?style=flat-square&color=%2308979c)](https://github.com/actions-cool/issues-helper/discussions)
[![](https://img.shields.io/github/license/actions-cool/issues-helper?style=flat-square)](https://github.com/actions-cool/issues-helper/blob/main/LICENSE)
A GitHub Action that easily helps you automatically manage issues
@@ -30,57 +32,141 @@ Please leave a message at [**here**](https://github.com/actions-cool/issues-help
<tr>
<td align="center" width="180">
<a href="https://github.com/ant-design/ant-design">
<img src="https://avatars1.githubusercontent.com/u/12101536?s=200&v=4" width="46" />
<div>ant-design</div>
</a></td>
<img src="https://avatars1.githubusercontent.com/u/12101536?s=200&v=4" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/ant-design-blazor/ant-design-blazor">
<img src="https://raw.githubusercontent.com/ant-design-blazor/ant-design-blazor/7dbee63648e088c73c47eada79c897bc39fc3c26/logo.svg" width="46" />
<div>ant-design-blazor</div>
</a></td>
<img src="https://user-images.githubusercontent.com/29775873/129505619-5abddb68-8663-4c71-b7d2-049c716aab26.png" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/vueComponent/ant-design-vue">
<img src="https://avatars1.githubusercontent.com/u/32120805?s=200&v=4" width="46" />
<div>ant-design-vue</div>
</a></td>
<img src="https://avatars1.githubusercontent.com/u/32120805?s=200&v=4" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/umijs/dumi">
<img src="https://avatars1.githubusercontent.com/u/33895495?s=200&v=4" width="46" />
<div>dumi</div>
</a></td>
<img src="https://avatars1.githubusercontent.com/u/33895495?s=200&v=4" width="46"/>
</a>
</td>
</tr>
<tr>
<td align="center" width="180"><a href="https://github.com/ant-design/ant-design">ant-design</a></td>
<td align="center" width="180"><a href="https://github.com/ant-design-blazor/ant-design-blazor">ant-design-blazor</a></td>
<td align="center" width="180"><a href="https://github.com/vueComponent/ant-design-vue">ant-design-vue</a></td>
<td align="center" width="180"><a href="https://github.com/umijs/dumi">dumi</a></td>
</tr><tr>
<td align="center" width="180">
<a href="https://github.com/alibaba/formily">
<img src="https://img.alicdn.com/imgextra/i2/O1CN01Kq3OHU1fph6LGqjIz_!!6000000004056-55-tps-1141-150.svg" width=""/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/vuejs/jsx-next">
<img src="https://avatars.githubusercontent.com/u/6128107?s=200&v=4" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/mui-org/material-ui">
<img src="https://avatars2.githubusercontent.com/u/33663932?s=200&v=4" width="46" />
<div>material-ui</div>
</a></td>
<img src="https://avatars2.githubusercontent.com/u/33663932?s=200&v=4" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/lijinke666/react-music-player">
<img src="https://github.com/lijinke666/react-music-player/blob/master/assetsImg/logo.png?raw=true" width="46" />
<div>react-music-player</div>
</a></td>
<td align="center" width="180">
<a href="https://github.com/umijs/umi">
<img src="https://avatars1.githubusercontent.com/u/33895495?s=200&v=4" width="46" />
<div>umi</div>
</a></td>
<td align="center" width="180">
<a href="https://github.com/AttoJS/vue-request">
<img src="https://raw.githubusercontent.com/AttoJS/art/master/vue-request-logo.png" width="46" />
<div>vue-request</div>
</a></td>
<a href="https://github.com/TuSimple/naive-ui">
<img src="https://camo.githubusercontent.com/b8ebecade711b9ae1fa306e7a1c9dd680fb56b0e2b9f015fec9cbad343570353/68747470733a2f2f6e6169766575692e6f73732d636e2d686f6e676b6f6e672e616c6979756e63732e636f6d2f6e616976656c6f676f2e737667" width="46"/>
</a>
</td>
</tr>
<tr>
<td align="center" width="180"><a href="https://github.com/alibaba/formily">formily</a></td>
<td align="center" width="180"><a href="https://github.com/vuejs/jsx-next">jsx-next</a></td>
<td align="center" width="180"><a href="https://github.com/mui-org/material-ui">material-ui</a></td>
<td align="center" width="180"><a href="https://github.com/TuSimple/naive-ui">naive-ui</a></td>
</tr><tr>
<td align="center" width="180">
<a href="https://github.com/jdf2e/nutui">
<img src="https://img14.360buyimg.com/imagetools/jfs/t1/167902/2/8762/791358/603742d7E9b4275e3/e09d8f9a8bf4c0ef.png" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/prettier/prettier">
<img src="https://user-images.githubusercontent.com/29775873/129505900-ca248179-2435-429d-9fd3-779206bcd899.png" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/ant-design/pro-components">
<img src="https://avatars1.githubusercontent.com/u/12101536?s=200&v=4" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/react-component">
<img src="https://avatars3.githubusercontent.com/u/9441414?s=200&v=4" width="46"/>
</a>
</td>
</tr>
<tr>
<td align="center" width="180"><a href="https://github.com/jdf2e/nutui">nutui</a></td>
<td align="center" width="180"><a href="https://github.com/prettier/prettier">prettier</a></td>
<td align="center" width="180"><a href="https://github.com/ant-design/pro-components">pro-components</a></td>
<td align="center" width="180"><a href="https://github.com/react-component">react-component</a></td>
</tr><tr>
<td align="center" width="180">
<a href="https://github.com/lijinke666/react-music-player">
<img src="https://user-images.githubusercontent.com/29775873/129506058-b0d8c741-f73a-496c-98de-7db2fb586db7.png" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/umijs/umi">
<img src="https://avatars1.githubusercontent.com/u/33895495?s=200&v=4" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/vitejs/vite">
<img src="https://avatars.githubusercontent.com/u/65625612?s=200&v=4" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/AttoJS/vue-request">
<img src="https://user-images.githubusercontent.com/29775873/129506134-55044c85-24cd-47d3-81ef-dba842214d71.png" width="46"/>
</a>
</td>
</tr>
<tr>
<td align="center" width="180"><a href="https://github.com/lijinke666/react-music-player">react-music-player</a></td>
<td align="center" width="180"><a href="https://github.com/umijs/umi">umi</a></td>
<td align="center" width="180"><a href="https://github.com/vitejs/vite">vite</a></td>
<td align="center" width="180"><a href="https://github.com/AttoJS/vue-request">vue-request</a></td>
</tr><tr>
<td align="center" width="180">
<a href="https://github.com/vuepress/vuepress-next">
<img src="https://v2.vuepress.vuejs.org/images/hero.png" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/zoo-js/zoo">
<img src="https://avatars1.githubusercontent.com/u/70757173?s=200&v=4" width="46" />
<div>zoo</div>
</a></td>
<img src="https://avatars1.githubusercontent.com/u/70757173?s=200&v=4" width="46"/>
</a>
</td>
<td align="center" width="180"></td>
<td align="center" width="180"></td>
</tr>
<tr>
<td align="center" width="180"><a href="https://github.com/vuepress/vuepress-next">vuepress-next</a></td>
<td align="center" width="180"><a href="https://github.com/zoo-js/zoo">zoo</a></td>
<td align="center" width="180"></td>
<td align="center" width="180"></td>
</tr>
</table>
## ⚡ Feedback
You are very welcome to try it out and put forward your comments. You can use the following methods:
- Report bugs or consult with [Issue](https://github.com/actions-cool/issues-helper/issues)
- Discuss via [Discussions](https://github.com/actions-cool/issues-helper/discussions)
- Submit [Pull Request](https://github.com/actions-cool/issues-helper/pulls) to improve the code of `issues-helper`
## List
When the following list does not have the features you want, you can submit it in [What do you want?](https://github.com/actions-cool/issues-helper/discussions/18).
@@ -91,6 +177,7 @@ When the following list does not have the features you want, you can submit it i
- [`close-issue`](#close-issue)
- [`create-comment`](#create-comment)
- [`create-issue`](#create-issue)
- [`create-label`](#create-label)
- [`delete-comment`](#delete-comment)
- [`lock-issue`](#lock-issue)
- [`mark-duplicate`](#mark-duplicate)
@@ -134,7 +221,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Add assigness
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'add-assignees'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -147,7 +234,7 @@ jobs:
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](#token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
| assignees | Designated person. No operation when no input or empty character | string | ✖ |
| random-to | When set, it will be randomly selected in assignees | number | ✖ |
@@ -176,7 +263,7 @@ jobs:
if: contains(github.event.issue.body, 'xxx') == false
steps:
- name: Add labels
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'add-labels'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -188,7 +275,7 @@ jobs:
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](#token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
| labels | New labels. When it is not filled in or is empty character, do not add | string | ✖ |
- `labels` support multiple and separated by comma
@@ -201,19 +288,18 @@ Close the specified issue.
```yml
- name: Close issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'close-issue'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: xxx
body: 'This is auto closed.'
```
| Param | Desc | Type | Required |
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](#token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
⏫ [Back to list](#List)
@@ -234,7 +320,7 @@ jobs:
if: github.event.label.name == 'xxx'
steps:
- name: Create comment
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'create-comment'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -250,7 +336,7 @@ jobs:
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](#token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
| body | Add comment content | string | ✖ |
| contents | Add [reaction](#reactions-types) | string | ✖ |
@@ -278,7 +364,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Create issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'create-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -305,13 +391,41 @@ jobs:
⏫ [Back to list](#List)
#### `create-label`
Create label. If you want to maintain labels in batches, [see](https://github.com/actions-cool/labels-helper).
```yml
- name: Create label
uses: actions-cool/issues-helper@v2
with:
actions: 'create-label'
token: ${{ secrets.GITHUB_TOKEN }}
label-name: 'xx'
label-color: '0095b3'
label-desc: 'xx'
```
| Param | Desc | Type | Required |
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](#token) | string | ✔ |
| label-name | Label name, emoji support | string | ✔ |
| label-color | Label color, the format is hexadecimal color code, without `#` | string | ✖ |
| label-desc | Label description | string | ✖ |
- `label-name`: If it already exists, no operation
- `label-color`: Default is `ededed`
⏫ [Back to list](#List)
#### `delete-comment`
According to [`comment-id`](#comment-id) delete the specified comment.
```yml
- name: Delete comment
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'delete-comment'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -323,6 +437,9 @@ According to [`comment-id`](#comment-id) delete the specified comment.
| actions | Action type | string | ✔ |
| token | [Token explain](#token) | string | ✔ |
| comment-id | The comment ID | number | ✔ |
| out-comments | The output of `find-comments`, if you find multiple, operate multiple | string | ✖ |
- When `out-comments` is entered, `comment-id` does not work
⏫ [Back to list](#List)
@@ -343,7 +460,7 @@ jobs:
if: github.event.label.name == 'invalid'
steps:
- name: Lock issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'lock-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -354,27 +471,30 @@ jobs:
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](#token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
| lock-reason | Reason for locking issue | string | ✖ |
- `lock-reason`: Optional values are `off-topic` `too heated` `resolved` `spam`
⏫ [Back to list](#List)
#### `mark-duplicate`
Quickly mark duplicate questions, only for issue new comments.
Quickly mark duplicate questions, only for issue new comments or edit comments.
```yml
name: Issue Mark Duplicate
on:
issue_comment:
types: [created]
types: [created, edited]
jobs:
mark-duplicate:
runs-on: ubuntu-latest
steps:
- name: mark-duplicate
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'mark-duplicate'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -390,10 +510,16 @@ jobs:
| labels | Replace the labels of the issue | string | ✖ |
| contents | Add [reaction](#reactions-types) for this comment | string | ✖ |
| close-issue | Whether to close the issue at the same time | string | ✖ |
| require-permission | Permission required, default is `write` | string | ✖ |
- `duplicate-command`: When setting concise commands, while still supporting the original `Duplicate of`
- `duplicate-command`: When setting concise commands, while still supporting the original `Duplicate of`. Block content contains `?`
- `labels`: Highest priority
- `close-issue`: Both `true` or `'true'` can take effect
- `require-permission`: Optional values are `admin`, `write`, `read`, `none`
- If the team member sets the `read` permission, it is `read`
- If the external Collaborator is set to `read` permission, it is `read`
- Ordinary users have `read` permission
- When set `write`, `admin` and `write` meet the conditions
⏫ [Back to list](#List)
@@ -403,7 +529,7 @@ Open the specified issue.
```yml
- name: Open issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'open-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -414,7 +540,7 @@ Open the specified issue.
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](#token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
⏫ [Back to list](#List)
@@ -424,7 +550,7 @@ Remove the person designated by issue.
```yml
- name: Remove assignees
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'remove-assignees'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -436,7 +562,7 @@ Remove the person designated by issue.
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](#token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
| assignees | Designated person removed. When it is an empty character, do not remove | string | ✔ |
⏫ [Back to list](#List)
@@ -447,7 +573,7 @@ Remove the specified labels.
```yml
- name: Remove labels
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'remove-labels'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -459,7 +585,7 @@ Remove the specified labels.
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](#token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
| labels | The removed labels. When it is a blank character, do not remove | string | ✔ |
- `labels` supports multiple, such as `x1,x2,x3`, only the labels added by the issue will be removed
@@ -472,7 +598,7 @@ Replace the labels of issue.
```yml
- name: Set labels
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'set-labels'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -484,7 +610,7 @@ Replace the labels of issue.
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](#token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
| labels | labels set. When empty characters, will remove all | string | ✔ |
⏫ [Back to list](#List)
@@ -495,7 +621,7 @@ Unlock the specified issue.
```yml
- name: Unlock issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'unlock-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -506,7 +632,7 @@ Unlock the specified issue.
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](#token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
⏫ [Back to list](#List)
@@ -528,7 +654,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Update comment
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'update-comment'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -541,12 +667,14 @@ jobs:
| actions | Action type | string | ✔ |
| token | [Token explain](#token) | string | ✔ |
| comment-id | The comment ID | number | ✔ |
| out-comments | The output of `find-comments`, if you find multiple, operate multiple | string | ✖ |
| body | Update the content of comment | string | ✖ |
| update-mode | Update mode. Default `replace`, another `append` | string | ✖ |
| contents | Add [reaction](#reactions-types) | string | ✖ |
- When `body` is not entered, it will remain as it is
- When `update-mode` is `append`, additional operations will be performed. Anything other than `append` will be replaced. Only effective for `body`
- When `out-comments` is entered, `comment-id` does not work
⏫ [Back to list](#List)
@@ -556,7 +684,7 @@ Update the specified issue according to the `issue-number`.
```yml
- name: Update issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'update-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -574,7 +702,7 @@ Update the specified issue according to the `issue-number`.
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](#token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
| state | Modify the status of issue, optional value `open` `closed` | string | ✖ |
| title | Modify the title of the issue | string | ✖ |
| body | Modify the content of issue | string | ✖ |
@@ -606,7 +734,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: welcome
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'welcome'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -649,7 +777,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: check-inactive
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'check-inactive'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -671,6 +799,7 @@ jobs:
| title-includes | Title filtering | string | ✖ |
| inactive-day | Inactive days filtering | number | ✖ |
| inactive-label | The label name adding | string | ✖ |
| exclude-labels | Exclude labels filtering | string | ✖ |
- `labels`: When there are multiple, the query will have multiple at the same time. If not entered, all
- `issue-state`: The default is `all`. Optional value `open` `closed`, when these 2 items are not, both are `all`
@@ -702,7 +831,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: check-issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'check-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -715,9 +844,10 @@ jobs:
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](#token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
| assignee-includes | Assignees contains check | string | ✖ |
| title-includes | Title contains check | string | ✖ |
| title-excludes | Check whether the title is empty after removing the default title | string | ✖ |
| body-includes | Body contains check | string | ✖ |
- `title-includes` `body-includes` supports the format `x1,x2` or `x1,x2/y1,y2`. Only supports two levels
@@ -741,7 +871,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: close-issues
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'close-issues'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -762,6 +892,7 @@ jobs:
| body-includes | Body filtering | string | ✖ |
| title-includes | Title filtering | string | ✖ |
| inactive-day | Inactive days filtering | number | ✖ |
| exclude-labels | Exclude labels filtering | string | ✖ |
- `labels`: When there are multiple, the query will have multiple at the same time. If not entered, all
- `issue-assignee`: Multiplayer is not supported. If you do not enter or enter *, all will be searched. Entering `none` will query issues for which the specified person is not added
@@ -775,7 +906,7 @@ Find the current warehouse issue No. 1, the creator is k and the content contain
```yml
- name: Find comments
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'find-comments'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -788,7 +919,7 @@ Find the current warehouse issue No. 1, the creator is k and the content contain
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](#token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
| comment-auth | Comment creator, all will be queried if not filled | string | ✖ |
| body-includes | Comment content includes filtering, no verification if not filled | string | ✖ |
| direction | Return `comments` sort | string | ✖ |
@@ -823,7 +954,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: lock-issues
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'lock-issues'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -845,6 +976,8 @@ jobs:
| body-includes | Body filtering | string | ✖ |
| title-includes | Title filtering | string | ✖ |
| inactive-day | Inactive days filtering | number | ✖ |
| lock-reason | Reason for locking issue | string | ✖ |
| exclude-labels | Exclude labels filtering | string | ✖ |
- `labels`: When there are multiple, the query will have multiple at the same time. If not entered, all
- `issue-state`: The default is `all`. Optional value `open` `closed`, when these 2 items are not, both are `all`
@@ -869,7 +1002,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: month-statistics
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'month-statistics'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -897,13 +1030,15 @@ Flexible reference.
### `find-comments + create-comment + update-comment`
Hypothetical scenario: When the issue modification of the `watch` label is added, find out whether there is a comment containing `error` created by k, if there is only one, update the comment, if not, add a new comment.
Hypothetical scenario: When the issue modification of the `watch` label is added, find out whether there is a comment created by k that contains `<!-- Created by actions-cool/issues-helper -->`, if so, update the comment, If not, add a comment.
Of course, if you need such a scene, you can directly use [**Maintain One Comment**](https://github.com/actions-cool/maintain-one-comment).
```yml
name: Test
on:
isssue:
issues:
types: [edited]
jobs:
@@ -912,32 +1047,40 @@ jobs:
if: github.event.label.name == 'watch'
steps:
- name: find comments
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
id: fcid
with:
actions: 'find-comments'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
comment-auth: k
body-includes: 'error'
body-includes: '<!-- Created by actions-cool/issues-helper -->'
# Output view found content. GitHub default outputs are strings
- run: echo find-comments ${{ steps.fcid.outputs.comments }}
shell: bash
- name: create comment
if: ${{ steps.fcid.outputs.comments.length == 0 }}
uses: actions-cool/issues-helper@v1.10
if: contains(steps.fcid.outputs.comments, '<!-- Created by actions-cool/issues-helper -->') == false
uses: actions-cool/issues-helper@v2
with:
actions: 'create-comment'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
body: 'Some error!'
body: |
Error
<!-- Created by actions-cool/issues-helper -->
- name: update comment
if: ${{ steps.fcid.outputs.comments.length == 1 }}
uses: actions-cool/issues-helper@v1.10
if: contains(steps.fcid.outputs.comments, '<!-- Created by actions-cool/issues-helper -->') == true
uses: actions-cool/issues-helper@v2
with:
actions: 'update-comment'
token: ${{ secrets.GITHUB_TOKEN }}
comment-id: ${{ steps.fcid.outputs.comments[0].id }}
body: 'Some error again!'
out-comments: ${{ steps.fcid.outputs.comments }}
body: |
Error Again
<!-- Created by actions-cool/issues-helper -->
update-mode: 'append'
```
@@ -956,7 +1099,14 @@ Need to have the person token with push permission.
- `Name` is the same as in actions
- `Value` fill in the token just applied by the individual
When the token is not filled in actions or the corresponding secrets are not added to the project, it will default to github-actions <kbd>bot</kbd>. [More](https://docs.github.com/en/free-pro-team@latest/actions/reference/authentication-in-a-workflow).
When the token is not filled in actions or input `${{ secrets.GITHUB_TOKEN }}`, it will default to `github-actions-bot`. [More](https://docs.github.com/en/free-pro-team@latest/actions/reference/authentication-in-a-workflow).
⏫ [Back to list](#List)
### 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)
⏫ [Back to list](#List)
@@ -964,7 +1114,7 @@ When the token is not filled in actions or the corresponding secrets are not add
```yml
- name: Create issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
id: createissue
with:
actions: 'create-issue'
@@ -973,12 +1123,10 @@ When the token is not filled in actions or the corresponding secrets are not add
run: echo "Outputs issue_number is ${{ steps.createissue.outputs.issue-number }}"
```
[More](https://docs.github.com/en/free-pro-team@latest/actions/creating-actions/metadata-syntax-for-github-actions#outputs).
More:
### 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)
1. https://docs.github.com/en/free-pro-team@latest/actions/creating-actions/metadata-syntax-for-github-actions#outputs
2. https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idoutputs
⏫ [Back to list](#List)
@@ -1038,32 +1186,33 @@ Click the `···` icon in the upper right corner of a comment, select `Copy lin
- Use two-level semantic version, such as v1, v1.1, v2, v2.1
- v1 represents the initial version
- The fixes and additions to the v1 version will be released to the v1.1 version
- When the released v1.x runs stable for a certain period of time, release the advanced v2 version
- When the released v1.x runs stable for a certain period of time or undergoes refactoring, release the advanced v2 version
- After the v2 version, the version will be released strictly according to the three-level semantics, such as v2.0.0, v2.1.0
- Version selection
- It is recommended to use the latest releases version. It can be seen in [releases](https://github.com/actions-cool/issues-helper/releases)
- You can also refer to the update log below to select the version
- The latest v1.x release code will be merged into the 1.x branch
- It also supports the direct use of branch versions. Such as:
```yml
- name: Issues Helper
uses: actions-cool/issues-helper@main
# or
- name: Issues Helper
uses: actions-cool/issues-helper@1.x
```
- v2 [upgrade reference](https://github.com/actions-cool/issues-helper/blob/fix/docs/guide/faq.en-US.md#what-should-i-pay-attention-to-when-upgrading-from-v1x-to-v2)
## Actions Template
- You can directly use this [GitHub Actions workflow template](https://github.com/actions-cool/.github) repositorie template
- Personal exercises and tests [Actions](https://github.com/xrkffgg/test-ci) repository
- Personal exercises and tests [Actions](https://github.com/actions-cool/test-issues-helper) repository
- Can also refer to the warehouse of [online users](#who-is-using)
## ⚡ Feedback
You are very welcome to try it out and put forward your comments. You can use the following methods:
- Report bugs or consult with [Issue](https://github.com/actions-cool/issues-helper/issues)
- Discuss via [Discussions](https://github.com/actions-cool/issues-helper/discussions)
- Submit [Pull Request](https://github.com/actions-cool/issues-helper/pulls) to improve the code of `issues-helper`
## LICENSE
[MIT](https://github.com/actions-cool/issues-helper/blob/main/LICENSE)

355
README.md
View File

@@ -5,9 +5,11 @@
[![](https://img.shields.io/github/workflow/status/actions-cool/issues-helper/ci?style=flat-square)](https://github.com/actions-cool/issues-helper/actions)
[![](https://img.shields.io/badge/marketplace-issues--helper-red?style=flat-square)](https://github.com/marketplace/actions/issues-helper)
[![dumi](https://img.shields.io/badge/docs%20by-dumi-blue?style=flat-square)](https://github.com/umijs/dumi)
[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
[![](https://img.shields.io/github/v/release/actions-cool/issues-helper?style=flat-square&color=orange)](https://github.com/actions-cool/issues-helper/releases)
[![](https://img.shields.io/badge/discussions-on%20github-blue?style=flat-square&color=%2308979c)](https://github.com/actions-cool/issues-helper/discussions)
[![](https://img.shields.io/github/stars/actions-cool/issues-helper?style=flat-square)](https://github.com/actions-cool/issues-helper/stargazers)
[![](https://img.shields.io/badge/discussions-on%20github-blue?style=flat-square&color=%2308979c)](https://github.com/actions-cool/issues-helper/discussions)
[![](https://img.shields.io/github/license/actions-cool/issues-helper?style=flat-square)](https://github.com/actions-cool/issues-helper/blob/main/LICENSE)
一个轻松帮你自动管理 issues 的 GitHub Action
@@ -30,57 +32,145 @@
<tr>
<td align="center" width="180">
<a href="https://github.com/ant-design/ant-design">
<img src="https://avatars1.githubusercontent.com/u/12101536?s=200&v=4" width="46" />
<div>ant-design</div>
</a></td>
<img src="https://avatars1.githubusercontent.com/u/12101536?s=200&v=4" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/ant-design-blazor/ant-design-blazor">
<img src="https://raw.githubusercontent.com/ant-design-blazor/ant-design-blazor/7dbee63648e088c73c47eada79c897bc39fc3c26/logo.svg" width="46" />
<div>ant-design-blazor</div>
</a></td>
<img src="https://user-images.githubusercontent.com/29775873/129505619-5abddb68-8663-4c71-b7d2-049c716aab26.png" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/vueComponent/ant-design-vue">
<img src="https://avatars1.githubusercontent.com/u/32120805?s=200&v=4" width="46" />
<div>ant-design-vue</div>
</a></td>
<img src="https://avatars1.githubusercontent.com/u/32120805?s=200&v=4" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/umijs/dumi">
<img src="https://avatars1.githubusercontent.com/u/33895495?s=200&v=4" width="46" />
<div>dumi</div>
</a></td>
<img src="https://avatars1.githubusercontent.com/u/33895495?s=200&v=4" width="46"/>
</a>
</td>
</tr>
<tr>
<td align="center" width="180"><a href="https://github.com/ant-design/ant-design">ant-design</a></td>
<td align="center" width="180"><a href="https://github.com/ant-design-blazor/ant-design-blazor">ant-design-blazor</a></td>
<td align="center" width="180"><a href="https://github.com/vueComponent/ant-design-vue">ant-design-vue</a></td>
<td align="center" width="180"><a href="https://github.com/umijs/dumi">dumi</a></td>
</tr><tr>
<td align="center" width="180">
<a href="https://github.com/alibaba/formily">
<img src="https://img.alicdn.com/imgextra/i2/O1CN01Kq3OHU1fph6LGqjIz_!!6000000004056-55-tps-1141-150.svg" width=""/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/vuejs/jsx-next">
<img src="https://avatars.githubusercontent.com/u/6128107?s=200&v=4" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/mui-org/material-ui">
<img src="https://avatars2.githubusercontent.com/u/33663932?s=200&v=4" width="46" />
<div>material-ui</div>
</a></td>
<img src="https://avatars2.githubusercontent.com/u/33663932?s=200&v=4" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/lijinke666/react-music-player">
<img src="https://github.com/lijinke666/react-music-player/blob/master/assetsImg/logo.png?raw=true" width="46" />
<div>react-music-player</div>
</a></td>
<td align="center" width="180">
<a href="https://github.com/umijs/umi">
<img src="https://avatars1.githubusercontent.com/u/33895495?s=200&v=4" width="46" />
<div>umi</div>
</a></td>
<td align="center" width="180">
<a href="https://github.com/AttoJS/vue-request">
<img src="https://raw.githubusercontent.com/AttoJS/art/master/vue-request-logo.png" width="46" />
<div>vue-request</div>
</a></td>
<a href="https://github.com/TuSimple/naive-ui">
<img src="https://camo.githubusercontent.com/b8ebecade711b9ae1fa306e7a1c9dd680fb56b0e2b9f015fec9cbad343570353/68747470733a2f2f6e6169766575692e6f73732d636e2d686f6e676b6f6e672e616c6979756e63732e636f6d2f6e616976656c6f676f2e737667" width="46"/>
</a>
</td>
</tr>
<tr>
<td align="center" width="180"><a href="https://github.com/alibaba/formily">formily</a></td>
<td align="center" width="180"><a href="https://github.com/vuejs/jsx-next">jsx-next</a></td>
<td align="center" width="180"><a href="https://github.com/mui-org/material-ui">material-ui</a></td>
<td align="center" width="180"><a href="https://github.com/TuSimple/naive-ui">naive-ui</a></td>
</tr><tr>
<td align="center" width="180">
<a href="https://github.com/jdf2e/nutui">
<img src="https://img14.360buyimg.com/imagetools/jfs/t1/167902/2/8762/791358/603742d7E9b4275e3/e09d8f9a8bf4c0ef.png" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/prettier/prettier">
<img src="https://user-images.githubusercontent.com/29775873/129505900-ca248179-2435-429d-9fd3-779206bcd899.png" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/ant-design/pro-components">
<img src="https://avatars1.githubusercontent.com/u/12101536?s=200&v=4" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/react-component">
<img src="https://avatars3.githubusercontent.com/u/9441414?s=200&v=4" width="46"/>
</a>
</td>
</tr>
<tr>
<td align="center" width="180"><a href="https://github.com/jdf2e/nutui">nutui</a></td>
<td align="center" width="180"><a href="https://github.com/prettier/prettier">prettier</a></td>
<td align="center" width="180"><a href="https://github.com/ant-design/pro-components">pro-components</a></td>
<td align="center" width="180"><a href="https://github.com/react-component">react-component</a></td>
</tr><tr>
<td align="center" width="180">
<a href="https://github.com/lijinke666/react-music-player">
<img src="https://user-images.githubusercontent.com/29775873/129506058-b0d8c741-f73a-496c-98de-7db2fb586db7.png" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/umijs/umi">
<img src="https://avatars1.githubusercontent.com/u/33895495?s=200&v=4" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/vitejs/vite">
<img src="https://avatars.githubusercontent.com/u/65625612?s=200&v=4" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/AttoJS/vue-request">
<img src="https://user-images.githubusercontent.com/29775873/129506134-55044c85-24cd-47d3-81ef-dba842214d71.png" width="46"/>
</a>
</td>
</tr>
<tr>
<td align="center" width="180"><a href="https://github.com/lijinke666/react-music-player">react-music-player</a></td>
<td align="center" width="180"><a href="https://github.com/umijs/umi">umi</a></td>
<td align="center" width="180"><a href="https://github.com/vitejs/vite">vite</a></td>
<td align="center" width="180"><a href="https://github.com/AttoJS/vue-request">vue-request</a></td>
</tr><tr>
<td align="center" width="180">
<a href="https://github.com/vuepress/vuepress-next">
<img src="https://v2.vuepress.vuejs.org/images/hero.png" width="46"/>
</a>
</td>
<td align="center" width="180">
<a href="https://github.com/zoo-js/zoo">
<img src="https://avatars1.githubusercontent.com/u/70757173?s=200&v=4" width="46" />
<div>zoo</div>
</a></td>
<img src="https://avatars1.githubusercontent.com/u/70757173?s=200&v=4" width="46"/>
</a>
</td>
<td align="center" width="180"></td>
<td align="center" width="180"></td>
</tr>
<tr>
<td align="center" width="180"><a href="https://github.com/vuepress/vuepress-next">vuepress-next</a></td>
<td align="center" width="180"><a href="https://github.com/zoo-js/zoo">zoo</a></td>
<td align="center" width="180"></td>
<td align="center" width="180"></td>
</tr>
</table>
## ⚡ 反馈
非常欢迎你来尝试使用,并提出意见,你可以通过以下方式:
- 通过 [Issue](https://github.com/actions-cool/issues-helper/issues) 报告 bug 或进行咨询
- 通过 [Discussions](https://github.com/actions-cool/issues-helper/discussions) 进行讨论
- 提交 [Pull Request](https://github.com/actions-cool/issues-helper/pulls) 改进 `issues-helper` 的代码
也欢迎加入 钉钉交流群
![](https://github.com/actions-cool/resources/blob/main/dingding.jpeg?raw=true)
## 列 表
当以下列表没有你想要的功能时,可以在 [What do you want?](https://github.com/actions-cool/issues-helper/discussions/18) 中提出。
@@ -91,6 +181,7 @@
- [`close-issue`](#close-issue)
- [`create-comment`](#create-comment)
- [`create-issue`](#create-issue)
- [`create-label`](#create-label)
- [`delete-comment`](#delete-comment)
- [`lock-issue`](#lock-issue)
- [`mark-duplicate`](#mark-duplicate)
@@ -134,7 +225,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Add assigness
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'add-assignees'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -147,7 +238,7 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](#token) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
| assignees | 指定人。当不填或者为空字符时,不操作 | string | ✖ |
| random-to | 当设置时,会在 assignees 中随机选择 | number | ✖ |
@@ -176,7 +267,7 @@ jobs:
if: contains(github.event.issue.body, 'xxx') == false
steps:
- name: Add labels
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'add-labels'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -188,7 +279,7 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](#token) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
| labels | 新增的 labels。当不填或者为空字符时不新增 | string | ✖ |
- `labels` 支持多个,需用逗号隔开
@@ -201,19 +292,18 @@ jobs:
```yml
- name: Close issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'close-issue'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: xxx
body: 'This is auto closed.'
```
| 参数 | 描述 | 类型 | 必填 |
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](#token) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
⏫ [返回列表](#列-表)
@@ -234,7 +324,7 @@ jobs:
if: github.event.label.name == 'xxx'
steps:
- name: Create comment
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'create-comment'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -250,7 +340,7 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](#token) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
| body | 新增评论的内容 | string | ✖ |
| contents | 为新增评论的增加 [reaction](#reactions-types) | string | ✖ |
@@ -278,7 +368,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Create issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'create-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -305,13 +395,41 @@ jobs:
⏫ [返回列表](#列-表)
#### `create-label`
新增 label。若想批量维护 labels[可查看](https://github.com/actions-cool/labels-helper)。
```yml
- name: Create label
uses: actions-cool/issues-helper@v2
with:
actions: 'create-label'
token: ${{ secrets.GITHUB_TOKEN }}
label-name: 'xx'
label-color: '0095b3'
label-desc: 'xx'
```
| 参数 | 描述 | 类型 | 必填 |
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](#token) | string | ✔ |
| label-name | 标签名称,支持 emoji | string | ✔ |
| label-color | 标签颜色,格式为 16 进制色码,不加 `#` | string | ✖ |
| label-desc | 标签描述 | string | ✖ |
- `label-name`:若已存在,则无操作
- `label-color`:默认为 `ededed`
⏫ [返回列表](#列-表)
#### `delete-comment`
根据 [`comment-id`](#comment-id) 删除指定评论。
```yml
- name: Delete comment
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'delete-comment'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -323,6 +441,9 @@ jobs:
| actions | 操作类型 | string | ✔ |
| token | [token 说明](#token) | string | ✔ |
| comment-id | 指定的 comment | number | ✔ |
| out-comments | `find-comments` 的输出,若查找多个,则操作多个 | string | ✖ |
-`out-comments` 输入时,`comment-id` 不起作用
⏫ [返回列表](#列-表)
@@ -343,7 +464,7 @@ jobs:
if: github.event.label.name == 'invalid'
steps:
- name: Lock issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'lock-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -354,27 +475,30 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](#token) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
| lock-reason | 锁定 issue 的原因 | string | ✖ |
- `lock-reason`:可选值有 `off-topic` `too heated` `resolved` `spam`
⏫ [返回列表](#列-表)
#### `mark-duplicate`
快捷标记重复问题,仅作用于 issue 新增评论。
快捷标记重复问题,仅作用于 issue 新增编辑评论。
```yml
name: Issue Mark Duplicate
on:
issue_comment:
types: [created]
types: [created, edited]
jobs:
mark-duplicate:
runs-on: ubuntu-latest
steps:
- name: mark-duplicate
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'mark-duplicate'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -390,10 +514,16 @@ jobs:
| labels | 替换该 issue 的 labels | string | ✖ |
| contents | 为该评论的增加 [reaction](#reactions-types) | string | ✖ |
| close-issue | 是否同时关闭该 issue | string | ✖ |
| require-permission | 要求权限,默认为 `write` | string | ✖ |
- `duplicate-command`:当设置简洁命令时,同时仍支持原有 `Duplicate of`
- `duplicate-command`:当设置简洁命令时,同时仍支持原有 `Duplicate of`。屏蔽内容包含 `?`
- `labels`:优先级最高
- `close-issue``true``'true'` 均可生效
- `require-permission`:可选值有 `admin``write``read``none`
- 团队成员若设置 `read` 权限,则为 `read`
- 外部 Collaborator 若设置 `read` 权限,则为 `read`
- 普通用户为 `read` 权限
- 当设置 `write` 后,`admin``write` 满足条件
⏫ [返回列表](#列-表)
@@ -403,7 +533,7 @@ jobs:
```yml
- name: Open issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'open-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -414,7 +544,7 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](#token) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
⏫ [返回列表](#列-表)
@@ -424,7 +554,7 @@ jobs:
```yml
- name: Remove assignees
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'remove-assignees'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -436,7 +566,7 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](#token) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
| assignees | 移除的指定人。当为空字符时,不进行移除 | string | ✔ |
⏫ [返回列表](#列-表)
@@ -447,7 +577,7 @@ jobs:
```yml
- name: Remove labels
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'remove-labels'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -459,7 +589,7 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](#token) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
| labels | 移除的 labels。当为空字符时不进行移除 | string | ✔ |
- `labels` 支持多个,如 `x1,x2,x3`,只会移除 issue 已添加的 labels
@@ -472,7 +602,7 @@ jobs:
```yml
- name: Set labels
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'set-labels'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -484,7 +614,7 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](#token) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
| labels | labels 设置。当空字符时,会移除所有 | string | ✔ |
⏫ [返回列表](#列-表)
@@ -495,7 +625,7 @@ jobs:
```yml
- name: Unlock issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'unlock-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -506,7 +636,7 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](#token) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
⏫ [返回列表](#列-表)
@@ -528,7 +658,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Update comment
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'update-comment'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -541,12 +671,14 @@ jobs:
| actions | 操作类型 | string | ✔ |
| token | [token 说明](#token) | string | ✔ |
| comment-id | 指定的 comment | number | ✔ |
| out-comments | `find-comments` 的输出,若查找多个,则操作多个 | string | ✖ |
| body | 更新 comment 的内容 | string | ✖ |
| update-mode | 更新模式。默认 `replace` 替换,`append` 附加 | string | ✖ |
| contents | 增加 [reaction](#reactions-types) | string | ✖ |
- `body` 不填时,会保持原有
- `update-mode``append` 时,会进行附加操作。非 `append` 都会进行替换。仅对 `body` 生效
-`out-comments` 输入时,`comment-id` 不起作用
⏫ [返回列表](#列-表)
@@ -556,7 +688,7 @@ jobs:
```yml
- name: Update issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'update-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -574,7 +706,7 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](#token) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
| state | 修改 issue 的状态,可选值 `open` `closed` | string | ✖ |
| title | 修改 issue 的标题 | string | ✖ |
| body | 修改 issue 的内容 | string | ✖ |
@@ -604,7 +736,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: welcome
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'welcome'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -647,7 +779,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: check-inactive
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'check-inactive'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -669,6 +801,7 @@ jobs:
| title-includes | 包含标题筛选 | string | ✖ |
| inactive-day | 非活跃天数筛选 | number | ✖ |
| inactive-label | 新增标签名称 | string | ✖ |
| exclude-labels | 排除标签筛选 | string | ✖ |
- `labels`:为多个时,会查询同时拥有多个。不填时,会查询所有
- `issue-state`:默认为 `open`。可选值 `all` `closed`,非这 2 项时,均为 `open`
@@ -696,7 +829,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: check-issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'check-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -709,9 +842,10 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](#token) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
| assignee-includes | 是否包含指定人 | string | ✖ |
| title-includes | 标题包含校验 | string | ✖ |
| title-excludes | 检测标题移除默认 title 后是否为空 | string | ✖ |
| body-includes | 内容包含校验 | string | ✖ |
- `title-includes` `body-includes` 支持格式 `x1,x2` 或者 `x1,x2/y1,y2`。只支持两个层级
@@ -735,7 +869,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: close-issues
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'close-issues'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -756,6 +890,7 @@ jobs:
| body-includes | 包含内容筛选 | string | ✖ |
| title-includes | 包含标题筛选 | string | ✖ |
| inactive-day | 非活跃天数筛选 | number | ✖ |
| exclude-labels | 排除标签筛选 | string | ✖ |
- `labels`:为多个时,会查询同时拥有多个。不填时,会查询所有
- `issue-assignee`:不支持多人。不填或输入 * 时,查询所有。输入 `none` 会查询未添加指定人的 issues
@@ -769,7 +904,7 @@ jobs:
```yml
- name: Find comments
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'find-comments'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -782,7 +917,7 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](#token) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
| comment-auth | 评论创建者,不填时会查询所有 | string | ✖ |
| body-includes | 评论内容包含过滤,不填时无校验 | string | ✖ |
| direction | 返回 `comments` 排序 | string | ✖ |
@@ -817,7 +952,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: lock-issues
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'lock-issues'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -839,6 +974,8 @@ jobs:
| body-includes | 包含内容筛选 | string | ✖ |
| title-includes | 包含标题筛选 | string | ✖ |
| inactive-day | 非活跃天数筛选 | number | ✖ |
| lock-reason | 锁定 issue 的原因 | string | ✖ |
| exclude-labels | 排除标签筛选 | string | ✖ |
- `labels`:为多个时,会查询同时拥有多个。不填时,会查询所有
- `issue-state`:默认为 `open`。可选值 `all` `closed`,非这 2 项时,均为 `open`
@@ -863,7 +1000,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: month-statistics
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'month-statistics'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -891,13 +1028,15 @@ jobs:
### `find-comments + create-comment + update-comment`
假设场景:当添加了 `watch` label 的 issue 修改时,查找是否有 k 创建的包含 `error` 的评论,如果只有一个,则更新 comment如果没有则新增一个 comment。
假设场景:当添加了 `watch` label 的 issue 修改时,查找是否有 k 创建的包含 `<!-- Created by actions-cool/issues-helper -->` 的评论,如果,则更新 comment如果没有则新增一个 comment。
当然,如果你需要这样的场景,可以直接使用 [**Maintain One Comment**](https://github.com/actions-cool/maintain-one-comment)。
```yml
name: Test
on:
isssue:
issues:
types: [edited]
jobs:
@@ -906,32 +1045,40 @@ jobs:
if: github.event.label.name == 'watch'
steps:
- name: find comments
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
id: fcid
with:
actions: 'find-comments'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
comment-auth: k
body-includes: 'error'
body-includes: '<!-- Created by actions-cool/issues-helper -->'
# 输出查看找到的内容。GitHub 默认 outputs 为字符串
- run: echo find-comments ${{ steps.fcid.outputs.comments }}
shell: bash
- name: create comment
if: ${{ steps.fcid.outputs.comments.length == 0 }}
uses: actions-cool/issues-helper@v1.10
if: contains(steps.fcid.outputs.comments, '<!-- Created by actions-cool/issues-helper -->') == false
uses: actions-cool/issues-helper@v2
with:
actions: 'create-comment'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
body: 'Some error!'
body: |
Error
<!-- Created by actions-cool/issues-helper -->
- name: update comment
if: ${{ steps.fcid.outputs.comments.length == 1 }}
uses: actions-cool/issues-helper@v1.10
if: contains(steps.fcid.outputs.comments, '<!-- Created by actions-cool/issues-helper -->') == true
uses: actions-cool/issues-helper@v2
with:
actions: 'update-comment'
token: ${{ secrets.GITHUB_TOKEN }}
comment-id: ${{ steps.fcid.outputs.comments[0].id }}
body: 'Some error again!'
out-comments: ${{ steps.fcid.outputs.comments }}
body: |
Error Again
<!-- Created by actions-cool/issues-helper -->
update-mode: 'append'
```
@@ -950,7 +1097,14 @@ jobs:
- `Name` 与 actions 中保持一致
- `Value` 填写刚才个人申请的 token
当 actions 不填写 token 时,或项目未添加对应 secrets 时,会默认为 github-actions <kbd>bot</kbd>。[更多查看](https://docs.github.com/en/free-pro-team@latest/actions/reference/authentication-in-a-workflow)。
当 actions 不填写 token 时,或填写 `${{ secrets.GITHUB_TOKEN }}`,会默认为 `github-actions-bot`。[更多查看](https://docs.github.com/en/free-pro-team@latest/actions/reference/authentication-in-a-workflow)。
⏫ [返回列表](#列-表)
### GitHub Docs
- [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)
⏫ [返回列表](#列-表)
@@ -958,7 +1112,7 @@ jobs:
```yml
- name: Create issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
id: createissue
with:
actions: 'create-issue'
@@ -967,12 +1121,10 @@ jobs:
run: echo "Outputs issue_number is ${{ steps.createissue.outputs.issue-number }}"
```
[更多查看](https://docs.github.com/en/free-pro-team@latest/actions/creating-actions/metadata-syntax-for-github-actions#outputs)。
更多查看
### GitHub Docs
- [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)
1. https://docs.github.com/en/free-pro-team@latest/actions/creating-actions/metadata-syntax-for-github-actions#outputs
2. https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idoutputs
⏫ [返回列表](#列-表)
@@ -1033,32 +1185,33 @@ x2 + y2
- 采用两级语义化版本如v1、v1.1、v2、v2.1
- v1 表示初始版本
- 对 v1 版本的修复和新增会发布到 v1.1 版本
- 当发布的 v1.x 运行一定时间稳定,发布进阶 v2 版本
- 当发布的 v1.x 运行一定时间稳定或进行重构时,发布进阶 v2 版本
- v2 版本后会严格按照三级语义来发布版本,如 v2.0.0、v2.1.0
- 版本选择
- 建议采用最新 releases 版本。可在 [releases](https://github.com/actions-cool/issues-helper/releases) 看到
- 同时也可参照下面的更新日志来选择版本
- 也支持直接使用分支版本。如:
- 最新的 v1.x release 代码会合并到 1.x 分支中
- 支持直接使用分支版本。如:
```yml
- name: Issues Helper
uses: actions-cool/issues-helper@main
# or
- name: Issues Helper
uses: actions-cool/issues-helper@1.x
```
- v2 [升级参考](https://github.com/actions-cool/issues-helper/blob/fix/docs/guide/faq.md#%E4%BB%8E-v1x-%E5%8D%87%E7%BA%A7%E5%88%B0-v2%E6%9C%89%E4%BB%80%E4%B9%88%E6%B3%A8%E6%84%8F%E7%9A%84%E5%9C%B0%E6%96%B9%E5%90%97)
## Actions 模板
- 可直接使用这个 [GitHub Actions workflow template](https://github.com/actions-cool/.github) 仓库的模板
- 个人练习和测试 [Actions](https://github.com/xrkffgg/test-ci) 的仓库
- 个人练习和测试 [Actions](https://github.com/actions-cool/test-issues-helper) 的仓库
- 也可以来 [线上使用者](#谁在使用) 的仓库参照
## ⚡ 反馈
非常欢迎你来尝试使用,并提出意见,你可以通过以下方式:
- 通过 [Issue](https://github.com/actions-cool/issues-helper/issues) 报告 bug 或进行咨询
- 通过 [Discussions](https://github.com/actions-cool/issues-helper/discussions) 进行讨论
- 提交 [Pull Request](https://github.com/actions-cool/issues-helper/pulls) 改进 `issues-helper` 的代码
## LICENSE
[MIT](https://github.com/actions-cool/issues-helper/blob/main/LICENSE)

View File

@@ -1,5 +1,12 @@
// **************************************************************************
// Add to end
/**
* @param {string} url github地址
* @param {string} logo logo地址
* @param {string} width 自定义宽度,设置 auto 用于长型 logo
*/
const users = [
{
url: 'https://github.com/ant-design/ant-design',
@@ -19,7 +26,7 @@ const users = [
},
{
url: 'https://github.com/AttoJS/vue-request',
logo: 'https://raw.githubusercontent.com/AttoJS/art/master/vue-request-logo.png'
logo: 'https://user-images.githubusercontent.com/29775873/129506134-55044c85-24cd-47d3-81ef-dba842214d71.png'
},
{
url: 'https://github.com/mui-org/material-ui',
@@ -27,16 +34,53 @@ const users = [
},
{
url: 'https://github.com/lijinke666/react-music-player',
logo: 'https://github.com/lijinke666/react-music-player/blob/master/assetsImg/logo.png?raw=true'
logo: 'https://user-images.githubusercontent.com/29775873/129506058-b0d8c741-f73a-496c-98de-7db2fb586db7.png'
},
{
url: 'https://github.com/ant-design-blazor/ant-design-blazor',
logo: 'https://raw.githubusercontent.com/ant-design-blazor/ant-design-blazor/7dbee63648e088c73c47eada79c897bc39fc3c26/logo.svg'
logo: 'https://user-images.githubusercontent.com/29775873/129505619-5abddb68-8663-4c71-b7d2-049c716aab26.png'
},
{
url: 'https://github.com/zoo-js/zoo',
logo: 'https://avatars1.githubusercontent.com/u/70757173?s=200&v=4'
},
{
url: 'https://github.com/react-component',
logo: 'https://avatars3.githubusercontent.com/u/9441414?s=200&v=4'
},
{
url: 'https://github.com/ant-design/pro-components',
logo: 'https://avatars1.githubusercontent.com/u/12101536?s=200&v=4'
},
{
url: 'https://github.com/prettier/prettier',
logo: 'https://user-images.githubusercontent.com/29775873/129505900-ca248179-2435-429d-9fd3-779206bcd899.png',
},
{
url: 'https://github.com/vuejs/jsx-next',
logo: 'https://avatars.githubusercontent.com/u/6128107?s=200&v=4',
},
{
url: 'https://github.com/vitejs/vite',
logo: 'https://avatars.githubusercontent.com/u/65625612?s=200&v=4',
},
{
url: 'https://github.com/jdf2e/nutui',
logo: 'https://img14.360buyimg.com/imagetools/jfs/t1/167902/2/8762/791358/603742d7E9b4275e3/e09d8f9a8bf4c0ef.png',
},
{
width: 'auto',
url: 'https://github.com/alibaba/formily',
logo: 'https://img.alicdn.com/imgextra/i2/O1CN01Kq3OHU1fph6LGqjIz_!!6000000004056-55-tps-1141-150.svg',
},
{
url: 'https://github.com/vuepress/vuepress-next',
logo: 'https://v2.vuepress.vuejs.org/images/hero.png',
},
{
url: 'https://github.com/TuSimple/naive-ui',
logo: 'https://camo.githubusercontent.com/b8ebecade711b9ae1fa306e7a1c9dd680fb56b0e2b9f015fec9cbad343570353/68747470733a2f2f6e6169766575692e6f73732d636e2d686f6e676b6f6e672e616c6979756e63732e636f6d2f6e616976656c6f676f2e737667',
},
];
// **************************************************************************

View File

@@ -1,15 +1,21 @@
name: 'Issues Helper'
description: 'A GitHub Action that easily helps you automatically manage issues'
author: 'xrkffgg'
# https://actions-cool.github.io/github-action-branding/
branding:
icon: 'message-square'
color: 'black'
inputs:
actions:
description: 'Action name'
token:
description: 'Github_token'
default: ${{ github.token }}
repo:
description: 'The repositorie'
issue-number:
description: 'Issue-number'
comment-id:
@@ -22,8 +28,16 @@ inputs:
description: 'Issue assignees'
random-to:
description: 'Issue assignees random to'
# label
labels:
description: 'Issue labels'
label-name:
description: 'Create label name'
label-color:
description: 'Create label color, default #ededed'
label-desc:
description: 'Create label description'
state:
description: 'Issue state'
update-mode:
@@ -32,12 +46,19 @@ inputs:
description: 'Issue reactions emoji'
direction:
description: 'Find comments direction'
# comments
comment-auth:
description: 'Find comments query auth'
out-comments:
description: 'Find comments out comments'
assignee-includes:
description: 'Check use'
body-includes:
description: 'Query use'
# check
title-excludes:
description: 'Remove some to check title whether empty.'
title-includes:
description: 'Query use'
issue-creator:
@@ -52,12 +73,19 @@ inputs:
description: 'Query use'
inactive-day:
description: 'Query use'
lock-reason:
description: 'The reason lock issue'
inactive-label:
description: 'Issue label set use'
exclude-labels:
description: 'Query issues exclude labels'
duplicate-command:
description: 'For mark-duplicate'
duplicate-labels:
description: 'For mark-duplicate add labels'
require-permission:
description: 'Only the allow can do. Possible admin, write, read, and none.'
remove-labels:
description: 'For remove labels'
close-issue:
@@ -66,6 +94,7 @@ inputs:
description: 'For month-statistics'
count-comments:
description: 'For month-statistics'
outputs:
issue-number:
description: 'Create Issue Number'
@@ -75,6 +104,7 @@ outputs:
description: 'Find comments'
check-result:
description: 'Check issue'
runs:
using: node12
main: 'dist/index.js'

4219
dist/index.js vendored

File diff suppressed because one or more lines are too long

View File

@@ -22,7 +22,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: check-inactive
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'check-inactive'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -44,6 +44,7 @@ jobs:
| title-includes | Title filtering | string | ✖ |
| inactive-day | Inactive days filtering | number | ✖ |
| inactive-label | The label name adding | string | ✖ |
| exclude-labels | Exclude labels filtering | string | ✖ |
- `labels`: When there are multiple, the query will have multiple at the same time. If not entered, all
- `issue-state`: The default is `all`. Optional value `open` `closed`, when these 2 items are not, both are `all`
@@ -73,7 +74,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: check-issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'check-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -86,9 +87,10 @@ jobs:
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
| assignee-includes | Assignees contains check | string | ✖ |
| title-includes | Title contains check | string | ✖ |
| title-excludes | Check whether the title is empty after removing the default title | string | ✖ |
| body-includes | Body contains check | string | ✖ |
- `title-includes` `body-includes` supports the format `x1,x2` or `x1,x2/y1,y2`. Only supports two levels
@@ -110,7 +112,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: close-issues
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'close-issues'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -131,6 +133,7 @@ jobs:
| body-includes | Body filtering | string | ✖ |
| title-includes | Title filtering | string | ✖ |
| inactive-day | Inactive days filtering | number | ✖ |
| exclude-labels | Exclude labels filtering | string | ✖ |
- `labels`: When there are multiple, the query will have multiple at the same time. If not entered, all
- `issue-assignee`: Multiplayer is not supported. If you do not enter or enter *, all will be searched. Entering `none` will query issues for which the specified person is not added
@@ -142,7 +145,7 @@ Find the current warehouse issue No. 1, the creator is k and the content contain
```yml
- name: Find comments
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'find-comments'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -155,7 +158,7 @@ Find the current warehouse issue No. 1, the creator is k and the content contain
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
| comment-auth | Comment creator, all will be queried if not filled | string | ✖ |
| body-includes | Comment content includes filtering, no verification if not filled | string | ✖ |
| direction | Return `comments` sort | string | ✖ |
@@ -188,7 +191,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: lock-issues
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'lock-issues'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -210,6 +213,8 @@ jobs:
| body-includes | Body filtering | string | ✖ |
| title-includes | Title filtering | string | ✖ |
| inactive-day | Inactive days filtering | number | ✖ |
| lock-reason | Reason for locking issue | string | ✖ |
| exclude-labels | Exclude labels filtering | string | ✖ |
- `labels`: When there are multiple, the query will have multiple at the same time. If not entered, all
- `issue-state`: The default is `all`. Optional value `open` `closed`, when these 2 items are not, both are `all`
@@ -232,7 +237,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: month-statistics
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'month-statistics'
token: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -22,7 +22,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: check-inactive
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'check-inactive'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -44,6 +44,7 @@ jobs:
| title-includes | 包含标题筛选 | string | ✖ |
| inactive-day | 非活跃天数筛选 | number | ✖ |
| inactive-label | 新增标签名称 | string | ✖ |
| exclude-labels | 排除标签筛选 | string | ✖ |
- `labels`:为多个时,会查询同时拥有多个。不填时,会查询所有
- `issue-state`:默认为 `all`。可选值 `open` `closed`,非这 2 项时,均为 `all`
@@ -69,7 +70,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: check-issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'check-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -82,9 +83,10 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
| assignee-includes | 是否包含指定人 | string | ✖ |
| title-includes | 标题包含校验 | string | ✖ |
| title-excludes | 检测标题移除默认 title 后是否为空 | string | ✖ |
| body-includes | 内容包含校验 | string | ✖ |
- `title-includes` `body-includes` 支持格式 `x1,x2` 或者 `x1,x2/y1,y2`。只支持两个层级
@@ -106,7 +108,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: close-issues
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'close-issues'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -127,6 +129,7 @@ jobs:
| body-includes | 包含内容筛选 | string | ✖ |
| title-includes | 包含标题筛选 | string | ✖ |
| inactive-day | 非活跃天数筛选 | number | ✖ |
| exclude-labels | 排除标签筛选 | string | ✖ |
- `labels`:为多个时,会查询同时拥有多个。不填时,会查询所有
- `issue-assignee`:不支持多人。不填或输入 * 时,查询所有。输入 `none` 会查询未添加指定人的 issues
@@ -138,7 +141,7 @@ jobs:
```yml
- name: Find comments
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'find-comments'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -151,7 +154,7 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
| comment-auth | 评论创建者,不填时会查询所有 | string | ✖ |
| body-includes | 评论内容包含过滤,不填时无校验 | string | ✖ |
| direction | 返回 `comments` 排序 | string | ✖ |
@@ -184,7 +187,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: lock-issues
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'lock-issues'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -206,6 +209,8 @@ jobs:
| body-includes | 包含内容筛选 | string | ✖ |
| title-includes | 包含标题筛选 | string | ✖ |
| inactive-day | 非活跃天数筛选 | number | ✖ |
| lock-reason | 锁定 issue 的原因 | string | ✖ |
| exclude-labels | 排除标签筛选 | string | ✖ |
- `labels`:为多个时,会查询同时拥有多个。不填时,会查询所有
- `issue-state`:默认为 `all`。可选值 `open` `closed`,非这 2 项时,均为 `all`
@@ -228,7 +233,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: month-statistics
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'month-statistics'
token: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -22,7 +22,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Add assigness
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'add-assignees'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -35,7 +35,7 @@ jobs:
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
| assignees | Designated person. No operation when no input or empty character | string | ✖ |
| random-to | When set, it will be randomly selected in assignees | number | ✖ |
@@ -62,7 +62,7 @@ jobs:
if: contains(github.event.issue.body, 'xxx') == false
steps:
- name: Add labels
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'add-labels'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -74,7 +74,7 @@ jobs:
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
| labels | New labels. When it is not filled in or is empty character, do not add | string | ✖ |
- `labels` support multiple and separated by comma
@@ -85,19 +85,18 @@ Close the specified issue.
```yml
- name: Close issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'close-issue'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: xxx
body: 'This is auto closed.'
```
| Param | Desc | Type | Required |
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
## `create-comment`
@@ -116,7 +115,7 @@ jobs:
if: github.event.label.name == 'xxx'
steps:
- name: Create comment
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'create-comment'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -132,7 +131,7 @@ jobs:
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
| body | Add comment content | string | ✖ |
| contents | Add [reaction](/en-US/guide/ref#-reactions-type) | string | ✖ |
@@ -158,7 +157,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Create issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'create-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -183,13 +182,39 @@ jobs:
- `title` default is `Default Title`
- Return `issue-number`. [Usage reference](/en-US/guide/ref#-outputs-use)
## `create-label`
Create label. If you want to maintain labels in batches, [see](https://github.com/actions-cool/labels-helper).
```yml
- name: Create label
uses: actions-cool/issues-helper@v2
with:
actions: 'create-label'
token: ${{ secrets.GITHUB_TOKEN }}
label-name: 'xx'
label-color: '0095b3'
label-desc: 'xx'
```
| Param | Desc | Type | Required |
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
| label-name | Label name, emoji support | string | ✔ |
| label-color | Label color, the format is hexadecimal color code, without `#` | string | ✖ |
| label-desc | Label description | string | ✖ |
- `label-name`: If it already exists, no operation
- `label-color`: Default is `ededed`
## `delete-comment`
According to [`comment-id`](/en-US/guide/ref#-comment-id) delete the specified comment.
```yml
- name: Delete comment
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'delete-comment'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -201,6 +226,9 @@ According to [`comment-id`](/en-US/guide/ref#-comment-id) delete the specified c
| actions | Action type | string | ✔ |
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
| comment-id | The comment ID | number | ✔ |
| out-comments | The output of `find-comments`, if you find multiple, operate multiple | string | ✖ |
- When `out-comments` is entered, `comment-id` does not work
## `lock-issue`
@@ -219,7 +247,7 @@ jobs:
if: github.event.label.name == 'invalid'
steps:
- name: Lock issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'lock-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -230,25 +258,28 @@ jobs:
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
| lock-reason | Reason for locking issue | string | ✖ |
- `lock-reason`: Optional values are `off-topic` `too heated` `resolved` `spam`
## `mark-duplicate`
Quickly mark duplicate questions, only for issue new comments.
Quickly mark duplicate questions, only for issue new comments or edit comments.
```yml
name: Issue Mark Duplicate
on:
issue_comment:
types: [created]
types: [created, edited]
jobs:
mark-duplicate:
runs-on: ubuntu-latest
steps:
- name: mark-duplicate
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'mark-duplicate'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -264,10 +295,16 @@ jobs:
| labels | Replace the labels of the issue | string | ✖ |
| contents | Add [reaction](/en-US/guide/ref#-reactions-type) for this comment | string | ✖ |
| close-issue | Whether to close the issue at the same time | string | ✖ |
| require-permission | Permission required, default is `write` | string | ✖ |
- `duplicate-command`: When setting concise commands, while still supporting the original `Duplicate of`
- `duplicate-command`: When setting concise commands, while still supporting the original `Duplicate of`. Block content contains `?`
- `labels`: Highest priority
- `close-issue`: Both `true` or `'true'` can take effect
- `require-permission`: Optional values are `admin`, `write`, `read`, `none`
- If the team member sets the `read` permission, it is `read`
- If the external Collaborator is set to `read` permission, it is `read`
- Ordinary users have `read` permission
- When set `write`, `admin` and `write` meet the conditions
<Alert>
Note: Duplicate created with the concise command does not display the content of the red box in the figure below. But in fact this has no effect.
@@ -281,7 +318,7 @@ Open the specified issue.
```yml
- name: Open issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'open-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -292,7 +329,7 @@ Open the specified issue.
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
## `remove-assignees`
@@ -300,7 +337,7 @@ Remove the person designated by issue.
```yml
- name: Remove assignees
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'remove-assignees'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -312,7 +349,7 @@ Remove the person designated by issue.
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
| assignees | Designated person removed. When it is an empty character, do not remove | string | ✔ |
## `remove-labels`
@@ -321,7 +358,7 @@ Remove the specified labels.
```yml
- name: Remove labels
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'remove-labels'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -333,7 +370,7 @@ Remove the specified labels.
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
| labels | The removed labels. When it is a blank character, do not remove | string | ✔ |
- `labels` supports multiple, such as `x1,x2,x3`, only the labels added by the issue will be removed
@@ -344,7 +381,7 @@ Replace the labels of issue.
```yml
- name: Set labels
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'set-labels'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -356,7 +393,7 @@ Replace the labels of issue.
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
| labels | labels set. When empty characters, will remove all | string | ✔ |
## `unlock-issue`
@@ -365,7 +402,7 @@ Unlock the specified issue.
```yml
- name: Unlock issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'unlock-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -376,7 +413,7 @@ Unlock the specified issue.
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
## `update-comment`
@@ -396,7 +433,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Update comment
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'update-comment'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -409,12 +446,14 @@ jobs:
| actions | Action type | string | ✔ |
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
| comment-id | The comment ID | number | ✔ |
| out-comments | The output of `find-comments`, if you find multiple, operate multiple | string | ✖ |
| body | Update the content of comment | string | ✖ |
| update-mode | Update mode. Default `replace`, another `append` | string | ✖ |
| contents | Add [reaction](/en-US/guide/ref#-reactions-type) | string | ✖ |
- When `body` is not entered, it will remain as it is
- When `update-mode` is `append`, additional operations will be performed. Anything other than `append` will be replaced. Only effective for `body`
- When `out-comments` is entered, `comment-id` does not work
## `update-issue`
@@ -422,7 +461,7 @@ Update the specified issue according to the `issue-number`.
```yml
- name: Update issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'update-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -440,7 +479,7 @@ Update the specified issue according to the `issue-number`.
| -- | -- | -- | -- |
| actions | Action type | string | ✔ |
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
| issue-number | The number of issue | number | |
| issue-number | The number of issue. When not input, it will be obtained from the trigger event | number | |
| state | Modify the status of issue, optional value `open` `closed` | string | ✖ |
| title | Modify the title of the issue | string | ✖ |
| body | Modify the content of issue | string | ✖ |
@@ -470,7 +509,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: welcome
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'welcome'
token: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -22,7 +22,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Add assigness
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'add-assignees'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -35,7 +35,7 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
| assignees | 指定人。当不填或者为空字符时,不操作 | string | ✖ |
| random-to | 当设置时,会在 assignees 中随机选择 | number | ✖ |
@@ -62,7 +62,7 @@ jobs:
if: contains(github.event.issue.body, 'xxx') == false
steps:
- name: Add labels
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'add-labels'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -74,7 +74,7 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
| labels | 新增的 labels。当不填或者为空字符时不新增 | string | ✖ |
- `labels` 支持多个,需用逗号隔开
@@ -85,19 +85,18 @@ jobs:
```yml
- name: Close issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'close-issue'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: xxx
body: 'This is auto closed.'
```
| 参数 | 描述 | 类型 | 必填 |
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
## `create-comment`
@@ -116,7 +115,7 @@ jobs:
if: github.event.label.name == 'xxx'
steps:
- name: Create comment
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'create-comment'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -132,7 +131,7 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
| body | 新增评论的内容 | string | ✖ |
| contents | 为新增评论的增加 [reaction](/guide/ref#-reactions-类型) | string | ✖ |
@@ -158,7 +157,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Create issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'create-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -183,13 +182,39 @@ jobs:
- `title` 默认为:`Default Title`
- 返回 `issue-number`[用法参考](/guide/ref#-outputs-使用)
## `create-label`
新增 label。若想批量维护 labels[可查看](https://github.com/actions-cool/labels-helper)。
```yml
- name: Create label
uses: actions-cool/issues-helper@v2
with:
actions: 'create-label'
token: ${{ secrets.GITHUB_TOKEN }}
label-name: 'xx'
label-color: '0095b3'
label-desc: 'xx'
```
| 参数 | 描述 | 类型 | 必填 |
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
| label-name | 标签名称,支持 emoji | string | ✔ |
| label-color | 标签颜色,格式为 16 进制色码,不加 `#` | string | ✖ |
| label-desc | 标签描述 | string | ✖ |
- `label-name`:若已存在,则无操作
- `label-color`:默认为 `ededed`
## `delete-comment`
根据 [`comment-id`](/guide/ref#-comment-id) 删除指定评论。
```yml
- name: Delete comment
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'delete-comment'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -201,6 +226,9 @@ jobs:
| actions | 操作类型 | string | ✔ |
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
| comment-id | 指定的 comment | number | ✔ |
| out-comments | `find-comments` 的输出,若查找多个,则操作多个 | string | ✖ |
-`out-comments` 输入时,`comment-id` 不起作用
## `lock-issue`
@@ -219,7 +247,7 @@ jobs:
if: github.event.label.name == 'invalid'
steps:
- name: Lock issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'lock-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -230,25 +258,28 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
| lock-reason | 锁定 issue 的原因 | string | ✖ |
- `lock-reason`:可选值有 `off-topic` `too heated` `resolved` `spam`
## `mark-duplicate`
快捷标记重复问题,仅作用于 issue 新增评论。
快捷标记重复问题,仅作用于 issue 新增编辑评论。
```yml
name: Issue Mark Duplicate
on:
issue_comment:
types: [created]
types: [created, edited]
jobs:
mark-duplicate:
runs-on: ubuntu-latest
steps:
- name: mark-duplicate
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'mark-duplicate'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -264,10 +295,16 @@ jobs:
| labels | 替换该 issue 的 labels | string | ✖ |
| contents | 为该评论的增加 [reaction](/guide/ref#-reactions-类型) | string | ✖ |
| close-issue | 是否同时关闭该 issue | string | ✖ |
| require-permission | 要求权限,默认为 `write` | string | ✖ |
- `duplicate-command`:当设置简洁命令时,同时仍支持原有 `Duplicate of`
- `duplicate-command`:当设置简洁命令时,同时仍支持原有 `Duplicate of`。屏蔽内容包含 `?`
- `labels`:优先级最高
- `close-issue``true``'true'` 均可生效
- `require-permission`:可选值有 `admin``write``read``none`
- 团队成员若设置 `read` 权限,则为 `read`
- 外部 Collaborator 若设置 `read` 权限,则为 `read`
- 普通用户为 `read` 权限
- 当设置 `write` 后,`admin``write` 满足条件
<Alert>
注意:使用简洁命令创建的 Duplicate 不显示下图红框内容。但其实这个没有任何影响的。
@@ -281,7 +318,7 @@ jobs:
```yml
- name: Open issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'open-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -292,7 +329,7 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
## `remove-assignees`
@@ -300,7 +337,7 @@ jobs:
```yml
- name: Remove assignees
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'remove-assignees'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -312,7 +349,7 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
| assignees | 移除的指定人。当为空字符时,不进行移除 | string | ✔ |
## `remove-labels`
@@ -321,7 +358,7 @@ jobs:
```yml
- name: Remove labels
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'remove-labels'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -333,7 +370,7 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
| labels | 移除的 labels。当为空字符时不进行移除 | string | ✔ |
- `labels` 支持多个,如 `x1,x2,x3`,只会移除 issue 已添加的 labels
@@ -344,7 +381,7 @@ jobs:
```yml
- name: Set labels
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'set-labels'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -356,7 +393,7 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
| labels | labels 设置。当空字符时,会移除所有 | string | ✔ |
## `unlock-issue`
@@ -365,7 +402,7 @@ jobs:
```yml
- name: Unlock issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'unlock-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -376,7 +413,7 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
## `update-comment`
@@ -396,7 +433,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Update comment
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'update-comment'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -409,12 +446,14 @@ jobs:
| actions | 操作类型 | string | ✔ |
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
| comment-id | 指定的 comment | number | ✔ |
| out-comments | `find-comments` 的输出,若查找多个,则操作多个 | string | ✖ |
| body | 更新 comment 的内容 | string | ✖ |
| update-mode | 更新模式。默认 `replace` 替换,`append` 附加 | string | ✖ |
| contents | 增加 [reaction](/guide/ref#-reactions-类型) | string | ✖ |
- `body` 不填时,会保持原有
- `update-mode``append` 时,会进行附加操作。非 `append` 都会进行替换。仅对 `body` 生效
-`out-comments` 输入时,`comment-id` 不起作用
## `update-issue`
@@ -422,7 +461,7 @@ jobs:
```yml
- name: Update issue
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'update-issue'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -440,7 +479,7 @@ jobs:
| -- | -- | -- | -- |
| actions | 操作类型 | string | ✔ |
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
| issue-number | 指定的 issue | number | |
| issue-number | 指定的 issue,当不传时会从触发事件中获取 | number | |
| state | 修改 issue 的状态,可选值 `open` `closed` | string | ✖ |
| title | 修改 issue 的标题 | string | ✖ |
| body | 修改 issue 的内容 | string | ✖ |
@@ -469,7 +508,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: welcome
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'welcome'
token: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -8,16 +8,31 @@ toc: menu
- Use two-level semantic version, such as v1, v1.1, v2, v2.1
- v1 represents the initial version
- The fixes and additions to the v1 version will be released to the v1.1 version
- When the released v1.x runs stable for a certain period of time, release the advanced v2 version
- When the released v1.x runs stable for a certain period of time or undergoes refactoring, release the advanced v2.x version
- After the v2 version, the version will be released strictly according to the three-level semantics, such as v2.0.0, v2.1.0
- Version selection
- It is recommended to use the latest releases version. It can be seen in [releases](https://github.com/actions-cool/issues-helper/releases)
- You can also refer to the update log below to select the version
- The latest v1.x release code will be merged into the 1.x branch
- After the v2 version, the v2 tag is supported, and the latest 2.x code will be synchronized
- It also supports the direct use of branch versions. Such as:
```yml
- name: Issues Helper
uses: actions-cool/issues-helper@main
# or
- name: Issues Helper
uses: actions-cool/issues-helper@1.x
# or
- name: Issues Helper
uses: actions-cool/issues-helper@v2
```
- v2 [upgrade reference](/en-US/guide/faq)
<embed src="../CHANGELOG.md"></embed>

View File

@@ -8,16 +8,31 @@ toc: menu
- 采用两级语义化版本如v1、v1.1、v2、v2.1
- v1 表示初始版本
- 对 v1 版本的修复和新增会发布到 v1.1 版本
- 当发布的 v1.x 运行一定时间稳定,发布进阶 v2 版本
- 当发布的 v1.x 运行一定时间稳定或进行重构时,发布进阶 v2.x 版本
- v2 版本后会严格按照三级语义来发布版本,如 v2.0.0、v2.1.0
- 版本选择
- 建议采用最新 releases 版本。可在 [releases](https://github.com/actions-cool/issues-helper/releases) 看到
- 同时也可参照下面的更新日志来选择版本
- 也支持直接使用分支版本。如:
- 最新的 v1.x release 代码会合并到 1.x 分支中
- v2 版本后支持使用 v2 tag将同步最新 2.x 代码
- 支持直接使用分支版本。如:
```yml
- name: Issues Helper
uses: actions-cool/issues-helper@main
# or
- name: Issues Helper
uses: actions-cool/issues-helper@1.x
# or
- name: Issues Helper
uses: actions-cool/issues-helper@v2
```
- v2 [升级参考](/guide/faq)
<embed src="../CHANGELOG.md"></embed>

View File

@@ -6,12 +6,16 @@ toc: menu
GitHub Actions is provided free of charge by GitHub. Among them, the `Private` project has a monthly limit of 2000 times, [see details](https://github.com/settings/billing). The `Public` project is unlimited.
### Is there a rate limit?
Yes. The bottom layer of Action uses GitHub REST API. The general situation is 5000 times per hour. It is basically sufficient in principle, and it is also required to avoid invalid requests when defining Action. [Detailed view](https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting).
## Are there any ready-made templates for reference?
Yes.
1. You can use this [GitHub Actions workflow template](https://github.com/actions-cool/.github) repository template
2. Personal exercises and tests [Actions](https://github.com/xrkffgg/test-ci) repository
2. Personal exercises and tests [Actions](https://github.com/actions-cool/test-issues-helper) repository
3. You can also refer to the warehouse of [online users](/en-US#-who-is-using)
## I want to pause Actions, is there an easy way?
@@ -22,6 +26,10 @@ Yes, you can directly modify `actions`. For example: `actions:'create-comment'`
You can view the detailed [changelog](/en-US/changelog). The latest releases version is recommended.
## What should I pay attention to when upgrading from v1.x to v2?
There is only one difference between v1.12 and v2.0.0. That is, `require-permission` in `mark-duplicate` has added the default value `write`.
## What should I do if there is no function I want here?
You can submit it in [What do you want?](https://github.com/actions-cool/issues-helper/discussions/18).

View File

@@ -6,12 +6,16 @@ toc: menu
GitHub Actions 是由 GitHub 免费提供的。其中 `Private` 项目每月有 2000 次的限制,[具体查看](https://github.com/settings/billing)。`Public` 项目无限制。
### 有没有速率的限制?
有的。Action 底层使用的是 GitHub REST API。一般情况是每小时 5000 次。原则上基本是够用的,同时也要求在 Action 定义时,尽量避免无效的请求。[具体查看](https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting)。
## 有没有现成的模板可以参考?
有的。
1. 你可以使用这个 [GitHub Actions workflow template](https://github.com/actions-cool/.github) 仓库的模板
2. 个人练习和测试 [Actions](https://github.com/xrkffgg/test-ci) 的仓库
2. 个人练习和测试 [Actions](https://github.com/actions-cool/test-issues-helper) 的仓库
3. 也可以来 [线上使用者](/#-谁在使用?) 的仓库参照
## 我想暂停 Actions有没有简单的办法
@@ -22,6 +26,10 @@ GitHub Actions 是由 GitHub 免费提供的。其中 `Private` 项目每月有
你可以查看详细的 [更新日志](/changelog)。推荐采用最新 releases 版本。
## 从 v1.x 升级到 v2有什么注意的地方吗
v1.12 和 v2.0.0 版本的差别只有一处。即 `mark-duplicate` 中的 `require-permission` 增加了默认值 `write`
## 如果这里没有我想要的功能,该怎么办?
你可以在 [What do you want?](https://github.com/actions-cool/issues-helper/discussions/18) 中提出。

View File

@@ -28,7 +28,7 @@ with:
- `count-lables`: Regardless of setting `true` or `'ture'`, all received in the program is in string format
At the same time, the output is also in string format
At the same time, the output is also in string format. [See](https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idoutputs).
- `check-result`: The judgment condition is `if: steps.xxid.outputs.check-result =='true'`
@@ -38,7 +38,13 @@ When an action is set, such as adding a label `x1` to an issue, Actions will aut
But if this is done by `GitHub Actions bot` (that is, the token in the actions is not passed, or the default `token: ${{ secrets.GITHUB_TOKEN }}` is used), the actions of label `x2` will not be triggered.
ref: [GitHub docs](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#triggering-new-workflows-using-a-personal-access-token)
## `assignees` scope
- The owner or collaborator of the warehouse, if there is an organization, including members
- Participants of the issue, including creators and commenters
## Benchmark
For example: I use a Tag to trigger an Action, and the code that triggers the benchmark will follow the Action definition of the code corresponding to this Tag instead of the main branch code.

View File

@@ -29,7 +29,7 @@ with:
- `count-lables`:不管设置 `true` 还是 `'ture'`,在程序里接收到的都是字符串格式
同时输出的也是字符串格式
同时输出的也是字符串格式。[参看](https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idoutputs)。
- `check-result`:判断条件为 `if: steps.xxid.outputs.check-result == 'true'`
@@ -39,7 +39,13 @@ with:
但如果这个是由 `GitHub Actions bot` 完成的(即 actions 中 token 不传,或使用默认 `token: ${{ secrets.GITHUB_TOKEN }}`),则不会触发 label `x2` 的 Actions。
ref: [GitHub docs](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#triggering-new-workflows-using-a-personal-access-token)
## `assignees` 范围
- 仓库的所有者或协作者,若有组织,包括成员
- issue 的参与者,包括创建者、评论者
## 运行基准
比如:我用 Tag 触发一个 Action触发基准的代码就会走这个 Tag 对应代码的 Action 定义,而非主分支代码。

View File

@@ -13,7 +13,7 @@ Need to have the person token with push permission.
- `Name` is the same as in actions
- `Value` fill in the token just applied by the individual
When the token is not filled in actions or the corresponding secrets are not added to the project, it will default to `github-actions-bot`. [More](https://docs.github.com/en/free-pro-team@latest/actions/reference/authentication-in-a-workflow).
When the token is not filled in actions or input `${{ secrets.GITHUB_TOKEN }}`, it will default to `github-actions-bot`. [More](https://docs.github.com/en/free-pro-team@latest/actions/reference/authentication-in-a-workflow).
## 📍 GitHub Docs
@@ -33,7 +33,10 @@ When the token is not filled in actions or the corresponding secrets are not add
run: echo "Outputs issue_number is ${{ steps.createissue.outputs.issue-number }}"
```
[More](https://docs.github.com/en/free-pro-team@latest/actions/creating-actions/metadata-syntax-for-github-actions#outputs).
More:
1. https://docs.github.com/en/free-pro-team@latest/actions/creating-actions/metadata-syntax-for-github-actions#outputs
2. https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idoutputs
## 📍 `includes` check rules

View File

@@ -13,7 +13,7 @@ toc: menu
- `Name` 与 actions 中保持一致
- `Value` 填写刚才个人申请的 token
当 actions 不填写 token 时,或项目未添加对应 secrets 时,会默认为 `github-actions-bot`。[更多查看](https://docs.github.com/en/free-pro-team@latest/actions/reference/authentication-in-a-workflow)。
当 actions 不填写 token 时,或输入 `${{ secrets.GITHUB_TOKEN }}`,会默认为 `github-actions-bot`。[更多查看](https://docs.github.com/en/free-pro-team@latest/actions/reference/authentication-in-a-workflow)。
## 📍 GitHub 相关文档
@@ -33,7 +33,10 @@ toc: menu
run: echo "Outputs issue_number is ${{ steps.createissue.outputs.issue-number }}"
```
[更多查看](https://docs.github.com/en/free-pro-team@latest/actions/creating-actions/metadata-syntax-for-github-actions#outputs)。
更多查看
1. https://docs.github.com/en/free-pro-team@latest/actions/creating-actions/metadata-syntax-for-github-actions#outputs
2. https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idoutputs
## 📍 `includes` 校验规则

View File

@@ -33,7 +33,7 @@ jobs:
steps:
- name: help wanted
if: github.event.label.name == 'help wanted'
uses: actions-cool/issues-helper@v1.2
uses: actions-cool/issues-helper@v2.0.0
with:
actions: 'create-comment'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -50,7 +50,7 @@ jobs:
- `on`: The action trigger condition
- Reference [Events that trigger workflows](https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows)
- `uses`: Use actions name
- `uses: actions-cool/issues-helper@v1.2`。Please [refer](/en-US/changelog) to version selection
- `uses: actions-cool/issues-helper@v2.0.0`。Please [refer](/en-US/changelog) to version selection
- `issues-hepler` parameter
- `actions`: The name of the function used, **required**. Support multiple, separated by commas, such as `create-comment,close-issue` means comment and close issue
- `token`: A person who needs to have push permission token

View File

@@ -33,7 +33,7 @@ jobs:
steps:
- name: help wanted
if: github.event.label.name == 'help wanted'
uses: actions-cool/issues-helper@v1.2
uses: actions-cool/issues-helper@v2.0.0
with:
actions: 'create-comment'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -50,7 +50,7 @@ jobs:
- `on`action 触发条件
- 参考 [工作流触发机制](https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows)
- `uses`:使用 actions 名称
- `uses: actions-cool/issues-helper@v1.2`。版本选择请 [参考](/changelog)
- `uses: actions-cool/issues-helper@v2.0.0`。版本选择请 [参考](/changelog)
- `issues-hepler` 参数
- `actions`:使用功能的名称,**必填**。支持多个,需用逗号隔开,如 `create-comment,close-issue` 表示评论和关闭 issue
- `token`:需拥有 push 权限的人员 token

View File

@@ -38,7 +38,7 @@ jobs:
steps:
- name: help wanted
if: github.event.label.name == 'help wanted'
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'create-comment'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -51,7 +51,7 @@ jobs:
## 💖 Who is using?
<embed src="../README.md#L29-L82"></embed>
<embed src="../README.md#RE-/<table>[^]+?[\r\n]<\/table>/"></embed>
## ⚡ Feedback

View File

@@ -38,7 +38,7 @@ jobs:
steps:
- name: help wanted
if: github.event.label.name == 'help wanted'
uses: actions-cool/issues-helper@v1.10
uses: actions-cool/issues-helper@v2
with:
actions: 'create-comment'
token: ${{ secrets.GITHUB_TOKEN }}
@@ -51,7 +51,7 @@ jobs:
## 💖 谁在使用?
<embed src="../README.md#L29-L82"></embed>
<embed src="../README.md#RE-/<table>[^]+?[\r\n]<\/table>/"></embed>
## ⚡ 反馈
@@ -60,3 +60,7 @@ jobs:
- 通过 [Issue](https://github.com/actions-cool/issues-helper/issues) 报告 bug 或进行咨询
- 通过 [Discussions](https://github.com/actions-cool/issues-helper/discussions) 进行讨论
- 提交 [Pull Request](https://github.com/actions-cool/issues-helper/pulls) 改进 `issues-helper` 的代码
也欢迎加入 钉钉交流群
![](https://github.com/actions-cool/resources/blob/main/dingding.jpeg?raw=true)

View File

@@ -2,6 +2,10 @@
background-color: rgba(0, 0, 0, 0.04) !important;
border-radius: 4px;
box-shadow: inset 0 0 10px 2px rgba(0,0,0,.2);
[data-prefers-color=dark] & {
box-shadow: inset 0 0 10px 2px rgba(0,0,0,.8);
}
}
.__dumi-default-menu {
@@ -54,11 +58,10 @@
}
}
.__dumi-default-layout-features + .__dumi-default-layout-content {
td {
transition: all 0.3s;
&:hover {
box-shadow: 0 1px 2px -2px rgba(0,0,0,.16), 0 3px 6px 0 rgba(0,0,0,.12), 0 5px 12px 4px rgba(0,0,0,.09);
.__dumi-default-layout-hero {
h1 {
[data-prefers-color=dark] & {
color: #000 !important;
}
}
}
@@ -102,5 +105,15 @@
.__dumi-default-menu + .__dumi-default-layout-content {
tbody tr:hover {
background: #fafafa;
[data-prefers-color=dark] & {
background: #2b2b2b;
}
}
}
.__dumi-default-alert {
box-shadow: 0 6px 16px 2px rgba(0,0,0,.06) !important;
border-radius: 2px !important;
border: 1px solid #0000000f;
}

View File

@@ -1,8 +1,8 @@
{
"name": "issue-helper",
"version": "1.10.0",
"name": "issues-helper",
"version": "2.4.3",
"private": true,
"description": "Some operations on issue.",
"description": "A GitHub Action easily helps you automatically manage issues.",
"main": "src/main.js",
"scripts": {
"start": "dumi dev",
@@ -10,16 +10,20 @@
"docs-dev:build": "UMI_ENV=dev dumi build",
"docs:deploy": "gh-pages -d docs-dist",
"deploy": "npm run docs:build && npm run docs:deploy",
"format": "prettier --write **/*.ts **/*.js",
"format-check": "prettier --check **/*.ts **/*.js",
"test": "father test",
"package": "ncc build src/main.js -o dist",
"users": "node ./script/update-users.js",
"main": "node ./src/main.js",
"ver": "node ./script/update-version.js"
"ver": "node ./script/update-version.js",
"pub": "npm run package"
},
"author": "xrkffgg",
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/actions-cool/issue-helper.git",
"url": "https://github.com/actions-cool/issues-helper.git",
"branch": "main"
},
"keywords": [
@@ -33,14 +37,14 @@
"@actions/github": "^4.0.0",
"@octokit/rest": "^18.0.12",
"dayjs": "^1.9.7",
"father": "^2.30.7",
"lodash": "^4.17.20"
},
"devDependencies": {
"@umijs/fabric": "^2.5.6",
"@vercel/ncc": "^0.25.1",
"common-tags": "^1.8.0",
"dotenv": "^8.2.0",
"dumi": "^1.1.0",
"gh-pages": "^3.1.0",
"react": "^17.0.1"
"dumi": "^1.1.26",
"gh-pages": "^3.1.0"
}
}

View File

@@ -5,10 +5,12 @@ const { stripIndent } = require('common-tags');
let { users } = require('../USERS.js');
users.sort((a, b) => getName(a).localeCompare(getName(b)));
users.sort((a, b) => getCurrentName(a).localeCompare(getCurrentName(b)));
// **************************************************************************
const DEFAULT_WIDTH = 46;
// **************************************************************************
let table = '';
let row = users.length / 4;
let lastNo = users.length % 4;
@@ -17,13 +19,20 @@ for (let j = 1; j <= row; j++) {
let data = '';
data = stripIndent`
<tr>
<td align="center" width="180">${getImg(users[(j-1)*4])}</td>
<td align="center" width="180">${getImg(users[(j-1)*4+1])}</td>
<td align="center" width="180">${getImg(users[(j-1)*4+2])}</td>
<td align="center" width="180">${getImg(users[(j-1)*4+3])}</td>
</tr>`;
table += data
};
<td align="center" width="180">${getImg(users[(j - 1) * 4])}</td>
<td align="center" width="180">${getImg(users[(j - 1) * 4 + 1])}</td>
<td align="center" width="180">${getImg(users[(j - 1) * 4 + 2])}</td>
<td align="center" width="180">${getImg(users[(j - 1) * 4 + 3])}</td>
</tr>
<tr>
<td align="center" width="180">${getName(users[(j - 1) * 4])}</td>
<td align="center" width="180">${getName(users[(j - 1) * 4 + 1])}</td>
<td align="center" width="180">${getName(users[(j - 1) * 4 + 2])}</td>
<td align="center" width="180">${getName(users[(j - 1) * 4 + 3])}</td>
</tr>
`;
table += data;
}
table = `<table>
${table}
@@ -34,8 +43,8 @@ ${table}
// **************************************************************************
const point = '<table>';
const cnPoint= `## 列 表`;
const enPoint = `## List`;
const cnPoint = `## ⚡ 反馈`;
const enPoint = `## ⚡ Feedback`;
// **************************************************************************
@@ -61,22 +70,42 @@ console.log(`🎉 Done en`);
// **************************************************************************
function getImg (o) {
function getImg(o) {
if (o) {
return `
<a href="${o.url}">
<img src="${o.logo}" width="46" />
<div>${getName(o)}</div>
</a>`
<img src="${o.logo}"${getImgWidth(o)}/>
</a>
`;
}
return ``
};
return ``;
}
function getName (o) {
function getImgWidth(o) {
if (o) {
return o.url.split('/').slice(-1)[0]
let width = o.width;
if (width === 'auto') {
width = '';
} else {
width = width ? width : DEFAULT_WIDTH;
}
return ``
};
return ` width="${width}"`;
}
return '';
}
function getName(o) {
if (o) {
return `<a href="${o.url}">${o.url.split('/').slice(-1)[0]}</a>`;
}
return ``;
}
function getCurrentName(o) {
if (o) {
return o.url.split('/').slice(-1)[0];
}
return ``;
}
// **************************************************************************

View File

@@ -1,7 +1,7 @@
const { readFileSync, writeFileSync } = require('fs');
const last = /v1\.9/g;
const now = 'v1.10';
const last = /v2\.4\.2/g;
const now = `v2`;
let readme = readFileSync('./README.md', 'utf-8');
readme = readme.replace(last, now);

View File

@@ -1,5 +1,4 @@
require('dotenv').config();
const core = require("@actions/core");
const core = require('@actions/core');
const { Octokit } = require('@octokit/rest');
const {
@@ -10,17 +9,9 @@ const {
doCreateIssue,
} = require('./base.js');
const {
doQueryIssues,
getIssuesInMonth,
getCreatedMonth,
} = require('./public.js');
const { doQueryIssues, getIssuesInMonth, getCreatedMonth } = require('./public.js');
const {
dealStringToArr,
matchKeyword,
getPreMonth
} = require('./util.js');
const { dealStringToArr, matchKeyword, getPreMonth } = require('./util.js');
// **************************************************************************
var dayjs = require('dayjs');
@@ -31,22 +22,23 @@ dayjs.extend(utc);
const token = core.getInput('token');
const octokit = new Octokit({ auth: `token ${token}` });
let direction = core.getInput("direction");
let direction = core.getInput('direction');
direction = direction === 'desc' ? 'desc' : 'asc';
const commentAuth = core.getInput("comment-auth");
const commentAuth = core.getInput('comment-auth');
const bodyIncludes = core.getInput('body-includes');
const titleIncludes = core.getInput('title-includes');
const titleRemove = core.getInput('title-excludes');
const assigneeIncludes = core.getInput('assignee-includes');
let issueState = core.getInput("issue-state") || 'open';
let issueState = core.getInput('issue-state') || 'open';
if (issueState != 'all' && issueState != 'closed') {
issueState = 'open';
}
const inactiveLabel = core.getInput("inactive-label") || 'inactive';
const inactiveLabel = core.getInput('inactive-label') || 'inactive';
// **************************************************************************
async function doCheckInactive (owner, repo, labels) {
async function doCheckInactive(owner, repo, labels) {
const issues = await doQueryIssues(owner, repo, labels, issueState);
if (issues.length) {
@@ -57,8 +49,8 @@ async function doCheckInactive (owner, repo, labels) {
});
if (!arr.includes(inactiveLabel)) {
await doAddLabels(owner, repo, issues[i].number, inactiveLabel);
if (core.getInput("body")) {
await doCreateComment(owner, repo, issues[i].number, core.getInput("body"));
if (core.getInput('body')) {
await doCreateComment(owner, repo, issues[i].number, core.getInput('body'));
}
} else {
core.info(`Actions: [add-inactive] issue ${issues[i].number} has label!`);
@@ -67,19 +59,19 @@ async function doCheckInactive (owner, repo, labels) {
} else {
core.info(`Actions: [query-issues] empty!`);
}
};
}
/**
* 检查 issue 是否满足条件,满足返回 true
* 当前 issue 的指定人是否有一个满足 assigneeIncludes 里的某个
* 关键字匹配,是否包含前一个某个+后一个某个 '官网,网站/挂了,无法访问'
*/
async function doCheckIssue (owner, repo, issueNumber) {
var checkResult = true;
async function doCheckIssue(owner, repo, issueNumber) {
let checkResult = true;
const issue = await octokit.issues.get({
owner,
repo,
issue_number: issueNumber
issue_number: issueNumber,
});
if (!!checkResult && assigneeIncludes) {
@@ -90,57 +82,62 @@ async function doCheckIssue (owner, repo, issueNumber) {
checkResult = true;
checkAssignee = true;
}
})
!checkAssignee ? checkResult = false : null;
});
!checkAssignee ? (checkResult = false) : null;
}
if (!!checkResult && titleRemove) {
const removes = dealStringToArr(titleRemove);
let t = issue.data.title;
removes.forEach(re => {
t = t.replace(re, '');
});
if (t.trim().length == 0) {
checkResult = false;
}
}
if (!!checkResult && titleIncludes) {
const titleArr = titleIncludes.split('/');
const keyword1 = dealStringToArr(titleArr[0]);
const keyword2 = dealStringToArr(titleArr[1]);
checkResult =
keyword2.length ?
matchKeyword(issue.data.title, keyword1) && matchKeyword(issue.data.title, keyword2) :
matchKeyword(issue.data.title, keyword1);
checkResult = keyword2.length
? matchKeyword(issue.data.title, keyword1) && matchKeyword(issue.data.title, keyword2)
: matchKeyword(issue.data.title, keyword1);
}
if (!!checkResult && bodyIncludes) {
const bodyArr = bodyIncludes.split('/');
const keyword1 = dealStringToArr(bodyArr[0]);
const keyword2 = dealStringToArr(bodyArr[1]);
checkResult =
keyword2.length ?
matchKeyword(issue.data.body, keyword1) && matchKeyword(issue.data.body, keyword2) :
matchKeyword(issue.data.body, keyword1);
checkResult = keyword2.length
? matchKeyword(issue.data.body, keyword1) && matchKeyword(issue.data.body, keyword2)
: matchKeyword(issue.data.body, keyword1);
}
core.info(`Actions: [check-issue][${!!checkResult}] success!`);
core.setOutput("check-result", !!checkResult);
};
core.setOutput('check-result', !!checkResult);
}
async function doCloseIssues (owner, repo, labels) {
async function doCloseIssues(owner, repo, labels) {
const issues = await doQueryIssues(owner, repo, labels, 'open');
if (issues.length) {
for (let i = 0; i < issues.length; i++) {
await doCloseIssue(owner, repo, issues[i].number);
if (core.getInput("body")) {
await doCreateComment(owner, repo, issues[i].number, core.getInput("body"));
if (core.getInput('body')) {
await doCreateComment(owner, repo, issues[i].number, core.getInput('body'));
}
}
} else {
core.info(`Actions: [query-issues] empty!`);
}
};
}
async function doFindComments (owner, repo, issueNumber) {
const res = await octokit.issues.listComments({
owner,
repo,
issue_number: issueNumber
});
async function doFindComments(owner, repo, issueNumber) {
const commentList = await listComments(owner, repo, issueNumber);
core.info(`Actions: [find-comments][${issueNumber}] success!`);
let comments = [];
res.data.forEach(item => {
commentList.forEach(item => {
const a = commentAuth ? item.user.login === commentAuth : true;
const b = bodyIncludes ? item.body.includes(bodyIncludes) : true;
if (a && b) {
@@ -149,34 +146,49 @@ async function doFindComments (owner, repo, issueNumber) {
auth: item.user.login,
body: item.body,
created: item.created_at,
updated: item.updated_at
})
updated: item.updated_at,
});
if (direction === 'desc') {
comments.reverse();
}
}
})
core.setOutput("comments", comments);
};
});
core.setOutput('comments', comments);
core.info(`out-comments: ${JSON.stringify(comments)}`);
}
async function doLockIssues (owner, repo, labels) {
async function listComments(owner, repo, issueNumber, page = 1) {
let { data: comments } = await octokit.issues.listComments({
owner,
repo,
issue_number: issueNumber,
per_page: 100,
page,
});
if (comments.length >= 100) {
comments = comments.concat(await listComments(page + 1));
}
return comments;
}
async function doLockIssues(owner, repo, labels) {
const issues = await doQueryIssues(owner, repo, labels, issueState);
if (issues.length) {
for (let i = 0; i < issues.length; i++) {
await doLockIssue(owner, repo, issues[i].number);
if (core.getInput("body")) {
await doCreateComment(owner, repo, issues[i].number, core.getInput("body"));
if (core.getInput('body')) {
await doCreateComment(owner, repo, issues[i].number, core.getInput('body'));
}
}
} else {
core.info(`Actions: [query-issues] empty!`);
}
};
}
async function doMonthStatistics (owner, repo, labels, assignees) {
const countLables = core.getInput("count-lables");
const countComments = core.getInput("count-comments");
async function doMonthStatistics(owner, repo, labels, assignees) {
const countLables = core.getInput('count-lables');
const countComments = core.getInput('count-comments');
const thisMonth = dayjs.utc().month() + 1;
const year = thisMonth == 1 ? dayjs.utc().year() - 1 : dayjs.utc().year();
@@ -184,17 +196,13 @@ async function doMonthStatistics (owner, repo, labels, assignees) {
const month = getPreMonth(thisMonth);
const showMonth = month < 10 ? `0${month}` : month;
let issues = await getIssuesInMonth(
owner,
repo,
thisMonth
);
let issues = await getIssuesInMonth(owner, repo, thisMonth);
if (issues.length == 0) {
core.info(`Actions: [query-issues-${month}] empty!`);
return false;
}
issues = issues.filter(i => {
return getCreatedMonth(i.created_at) == month
return getCreatedMonth(i.created_at) == month;
});
let total = issues.length;
let totalIssues = [...issues];
@@ -219,7 +227,7 @@ async function doMonthStatistics (owner, repo, labels, assignees) {
} else {
labelsTotals[l.name] = 1;
}
})
});
}
}
let now = dayjs().utc().format('YYYY-MM-DD HH:mm:ss');
@@ -244,8 +252,8 @@ async function doMonthStatistics (owner, repo, labels, assignees) {
for (var lab in labelsTotals) {
labelsArr.push({
labelName: lab,
number: labelsTotals[lab]
})
number: labelsTotals[lab],
});
}
labelsArr.sort((a, b) => b.number - a.number);
let labelsTitle = `
@@ -255,12 +263,16 @@ async function doMonthStatistics (owner, repo, labels, assignees) {
<tr>
<th>Name</th>
<th>Number</th>
</tr>`
</tr>`;
let labelsBody = '';
labelsArr.forEach(it => {
labelsBody += `<tr><td>${it.labelName}</td><td>${it.number}</td></tr>`
})
body = body + labelsTitle + labelsBody + `</table>
labelsBody += `<tr><td>${it.labelName}</td><td>${it.number}</td></tr>`;
});
body =
body +
labelsTitle +
labelsBody +
`</table>
`;
}
@@ -279,21 +291,21 @@ async function doMonthStatistics (owner, repo, labels, assignees) {
<th>Number</th>
<th>State</th>
</tr>
`
`;
let commentBody = '';
maxComments.forEach((it,ind) => {
maxComments.forEach((it, ind) => {
commentBody += `<tr>
<td>${ind + 1}</td>
<td>${it.number}</td>
<td>${it.title}</td>
<td>${it.comments}</td>
<td>${it.state}</td></tr>`
})
<td>${it.state}</td></tr>`;
});
body = body + commentTitle + commentBody + '</table>';
}
await doCreateIssue(owner, repo, title, body, labels, assignees);
};
}
// **************************************************************************
module.exports = {

View File

@@ -1,4 +0,0 @@
// Just for dumi style
import './less/main.less';
import './less/markdown.less';
import './less/dumi.less';

4
src/app.ts Normal file
View File

@@ -0,0 +1,4 @@
// For dumi style
import '../less/main.less';
import '../less/markdown.less';
import '../less/dumi.less';

View File

@@ -1,28 +1,17 @@
require('dotenv').config();
const core = require("@actions/core");
const github = require("@actions/github");
const core = require('@actions/core');
const github = require('@actions/github');
const { Octokit } = require('@octokit/rest');
// **************************************************************************
const ALLREACTIONS = [
"+1",
"-1",
"laugh",
"confused",
"heart",
"hooray",
"rocket",
"eyes",
];
const ALLREACTIONS = ['+1', '-1', 'laugh', 'confused', 'heart', 'hooray', 'rocket', 'eyes'];
const {
doQueryIssues
} = require('./public.js');
const { doQueryIssues } = require('./public.js');
const {
dealStringToArr,
dealRandomAssignees,
testDuplicate,
checkPermission,
} = require('./util.js');
// **************************************************************************
@@ -30,56 +19,56 @@ const token = core.getInput('token');
const octokit = new Octokit({ auth: `token ${token}` });
const context = github.context;
const contents = core.getInput("contents");
const contents = core.getInput('contents');
const randomTo = core.getInput("random-to");
const randomTo = core.getInput('random-to');
// **************************************************************************
async function doAddAssignees (owner, repo, issueNumber, assignees) {
async function doAddAssignees(owner, repo, issueNumber, assignees) {
const arr = dealRandomAssignees(assignees, randomTo);
await octokit.issues.addAssignees({
owner,
repo,
issue_number: issueNumber,
assignees: arr
assignees: arr,
});
core.info(`Actions: [add-assignees][${arr}] success!`);
};
}
async function doAddLabels (owner, repo, issueNumber, labels) {
async function doAddLabels(owner, repo, issueNumber, labels) {
await octokit.issues.addLabels({
owner,
repo,
issue_number: issueNumber,
labels: dealStringToArr(labels)
labels: dealStringToArr(labels),
});
core.info(`Actions: [add-labels][${labels}] success!`);
};
}
async function doCloseIssue (owner, repo, issueNumber) {
async function doCloseIssue(owner, repo, issueNumber) {
await octokit.issues.update({
owner,
repo,
issue_number: issueNumber,
state: 'closed'
state: 'closed',
});
core.info(`Actions: [close-issue][${issueNumber}] success!`);
};
}
async function doCreateComment (owner, repo, issueNumber, body) {
async function doCreateComment(owner, repo, issueNumber, body) {
const { data } = await octokit.issues.createComment({
owner,
repo,
issue_number: issueNumber,
body
body,
});
core.info(`Actions: [create-comment][${body}] success!`);
core.setOutput("comment-id", data.id);
core.setOutput('comment-id', data.id);
if (contents) {
await doCreateCommentContent(owner, repo, data.id, dealStringToArr(contents));
}
};
}
async function doCreateCommentContent(owner, repo, commentId, contents) {
if (contents.length) {
@@ -89,15 +78,15 @@ async function doCreateCommentContent(owner, repo, commentId, contents) {
owner,
repo,
comment_id: commentId,
content: item
content: item,
});
core.info(`Actions: [create-reactions][${item}] success!`);
}
})
});
}
};
}
async function doCreateIssue (owner, repo, title, body, labels, assignees) {
async function doCreateIssue(owner, repo, title, body, labels, assignees) {
let params = {
owner,
repo,
@@ -109,12 +98,12 @@ 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, dealStringToArr(contents));
}
};
}
async function doCreateIssueContent(owner, repo, issueNumber, contents) {
if (contents.length) {
@@ -124,54 +113,116 @@ async function doCreateIssueContent(owner, repo, issueNumber, contents) {
owner,
repo,
issue_number: issueNumber,
content: item
content: item,
});
core.info(`Actions: [create-reactions][${item}] success!`);
}
})
});
}
};
}
async function doDeleteComment (owner, repo, commentId) {
async function doCreateLabel(owner, repo) {
const name = core.getInput('label-name');
const color = core.getInput('label-color') || 'ededed';
const description = core.getInput('label-desc') || '';
if (!name) {
core.setFailed(`This actions should input 'label-name'!`);
return false;
}
try {
await octokit.issues.createLabel({
owner,
repo,
name,
color,
description,
});
core.info(`Actions: [create-label][${name}] success!`);
} catch (err) {
console.log(err.message);
}
}
async function doDeleteComment(owner, repo, commentId) {
let id = commentId;
const outComments = core.getInput('out-comments');
if (outComments) {
const outCommentsArr = JSON.parse(outComments);
core.info(`Actions: [out-comments-length][${outCommentsArr.length}] success!`);
outCommentsArr.forEach(async item => {
await doDelet(item.id);
});
} else {
await doDelet(id);
}
async function doDelet(id) {
await octokit.issues.deleteComment({
owner,
repo,
comment_id: commentId
comment_id: id,
});
core.info(`Actions: [delete-comment][${commentId}] success!`);
};
core.info(`Actions: [delete-comment][${id}] success!`);
}
}
async function doLockIssue (owner, repo, issueNumber) {
await octokit.issues.lock({
async function doLockIssue(owner, repo, issueNumber) {
const lockReason = core.getInput('lock-reason');
let params = {
owner,
repo,
issue_number: issueNumber,
});
};
const reasons = ['off-topic', 'too heated', 'resolved', 'spam'];
if (lockReason && reasons.includes(lockReason)) {
params.lock_reason = lockReason;
}
await octokit.issues.lock(params);
core.info(`Actions: [lock-issue][${issueNumber}] success!`);
};
}
async function doMarkDuplicate (owner, repo, labels) {
async function doMarkDuplicate(owner, repo, labels) {
if (context.eventName != 'issue_comment') {
core.info(`This actions only support on 'issue_comment'!`);
return false;
}
if (context.payload.action != 'created') {
core.info(`This actions only support on 'issue_comment' created!`);
return false;
}
const duplicateCommand = core.getInput("duplicate-command");
const duplicateLabels = core.getInput("duplicate-labels");
const removeLables = core.getInput("remove-labels");
const closeIssue = core.getInput("close-issue");
if (context.payload.action == 'created' || context.payload.action == 'edited') {
const duplicateCommand = core.getInput('duplicate-command');
const duplicateLabels = core.getInput('duplicate-labels');
const removeLables = core.getInput('remove-labels');
const closeIssue = core.getInput('close-issue');
const requirePermission = core.getInput('require-permission') || 'write';
const commentId = context.payload.comment.id;
const commentBody = context.payload.comment.body;
const commentUser = context.payload.comment.user.login;
const issueNumber = context.payload.issue.number;
const ifCommandInput = !!duplicateCommand;
if ((ifCommandInput && commentBody.startsWith(duplicateCommand) && commentBody.split(' ')[0] == duplicateCommand) || testDuplicate(commentBody)) {
if (
!commentBody.includes('?') &&
((ifCommandInput &&
commentBody.startsWith(duplicateCommand) &&
commentBody.split(' ')[0] == duplicateCommand) ||
testDuplicate(commentBody))
) {
try {
const res = await octokit.repos.getCollaboratorPermissionLevel({
owner,
repo,
username: commentUser,
});
const { permission } = res.data;
if (!checkPermission(requirePermission, permission)) {
core.info(`The user ${commentUser} is not allow!`);
return false;
}
if (ifCommandInput) {
const nextBody = commentBody.replace(duplicateCommand, 'Duplicate of');
await doUpdateComment(owner, repo, commentId, nextBody, 'replace', true);
@@ -182,11 +233,13 @@ async function doMarkDuplicate (owner, repo, labels) {
const issue = await octokit.issues.get({
owner,
repo,
issue_number: issueNumber
issue_number: issueNumber,
});
let newLabels = [];
if (issue.data.labels.length > 0) {
newLabels = issue.data.labels.map(({ name }) => name).filter(name => !dealStringToArr(removeLables).includes(name));
newLabels = issue.data.labels
.map(({ name }) => name)
.filter(name => !dealStringToArr(removeLables).includes(name));
}
if (duplicateLabels) {
newLabels = [...newLabels, ...dealStringToArr(duplicateLabels)];
@@ -202,46 +255,65 @@ async function doMarkDuplicate (owner, repo, labels) {
if (closeIssue == 'true') {
await doCloseIssue(owner, repo, issueNumber);
}
} else {
core.info(`This comment body should start whith 'duplicate-command'`);
} catch (error) {
core.info(error.message);
}
};
} else {
core.info(
`This comment body should start whith 'duplicate-command' or 'Duplicate of' and not include '?'`,
);
}
} else {
core.info(`This actions only support on 'issue_comment' created or edited!`);
}
}
async function doOpenIssue (owner, repo, issueNumber) {
async function doOpenIssue(owner, repo, issueNumber) {
await octokit.issues.update({
owner,
repo,
issue_number: issueNumber,
state: 'open'
state: 'open',
});
core.info(`Actions: [open-issue][${issueNumber}] success!`);
};
}
async function doRemoveAssignees (owner, repo, issueNumber, assignees) {
async function doRemoveAssignees(owner, repo, issueNumber, assignees) {
await octokit.issues.removeAssignees({
owner,
repo,
issue_number: issueNumber,
assignees: dealStringToArr(assignees)
assignees: dealStringToArr(assignees),
});
core.info(`Actions: [remove-assignees][${assignees}] success!`);
};
}
async function doRemoveLabels (owner, repo, issueNumber, labels) {
const dealLabels = dealStringToArr(labels);
for (label of dealLabels) {
async function doRemoveLabels(owner, repo, issueNumber, labels) {
const issue = await octokit.issues.get({
owner,
repo,
issue_number: issueNumber,
});
const baseLabels = issue.data.labels.map(({ name }) => name);
const removeLabels = baseLabels.filter(name => dealStringToArr(labels).includes(name));
core.info(`Actions: [filter-labels][${removeLabels.join(',')}] success!`);
for (const label of removeLabels) {
await octokit.issues.removeLabel({
owner,
repo,
issue_number: issueNumber,
name: label,
});
core.info(`Actions: [remove-labels-foreach][${label}] success!`);
core.info(`Actions: [remove-label][${label}] success!`);
}
core.info(`Actions: [remove-labels][${labels}] success!`);
};
async function doSetLabels (owner, repo, issueNumber, labels) {
core.info(`Actions: [remove-labels][${labels}] success!`);
}
async function doSetLabels(owner, repo, issueNumber, labels) {
// 概率性出现问题https://github.com/octokit/rest.js/issues/1982规避 setLabels
if (labels) {
// await octokit.issues.setLabels({
@@ -253,7 +325,7 @@ async function doSetLabels (owner, repo, issueNumber, labels) {
const issue = await octokit.issues.get({
owner,
repo,
issue_number: issueNumber
issue_number: issueNumber,
});
const baseLabels = issue.data.labels.map(({ name }) => name);
const removeLabels = baseLabels.filter(name => !dealStringToArr(labels).includes(name));
@@ -271,39 +343,46 @@ async function doSetLabels (owner, repo, issueNumber, labels) {
core.info(`Actions: [set-labels][${labels}] success!`);
}
};
}
async function doUnlockIssue (owner, repo, issueNumber) {
async function doUnlockIssue(owner, repo, issueNumber) {
await octokit.issues.unlock({
owner,
repo,
issue_number: issueNumber,
});
core.info(`Actions: [unlock-issue][${issueNumber}] success!`);
};
}
async function doUpdateComment (
owner,
repo,
commentId,
body,
updateMode,
ifUpdateBody,
) {
async function doUpdateComment(owner, repo, commentId, body, updateMode, ifUpdateBody) {
let id = commentId;
const outComments = core.getInput('out-comments');
if (outComments) {
const outCommentsArr = JSON.parse(outComments);
core.info(`Actions: [out-comments-length][${outCommentsArr.length}] success!`);
outCommentsArr.forEach(async item => {
await doComment(item.id);
});
} else {
await doComment(id);
}
async function doComment(id) {
const comment = await octokit.issues.getComment({
owner,
repo,
comment_id: commentId
})
comment_id: id,
});
const comment_body = comment.data.body;
let params = {
owner,
repo,
comment_id: commentId
comment_id: id,
};
if (core.getInput("body") || ifUpdateBody) {
if (core.getInput('body') || ifUpdateBody) {
if (updateMode === 'append') {
params.body = `${comment_body}\n${body}`;
} else {
@@ -311,15 +390,16 @@ async function doUpdateComment (
}
await octokit.issues.updateComment(params);
core.info(`Actions: [update-comment][${commentId}] success!`);
core.info(`Actions: [update-comment][${id}] success!`);
}
if (contents) {
await doCreateCommentContent(owner, repo, commentId, dealStringToArr(contents));
await doCreateCommentContent(owner, repo, id, dealStringToArr(contents));
}
};
}
}
async function doUpdateIssue (
async function doUpdateIssue(
owner,
repo,
issueNumber,
@@ -328,26 +408,26 @@ async function doUpdateIssue (
body,
updateMode,
assignees,
labels
labels,
) {
const issue = await octokit.issues.get({
owner,
repo,
issue_number: issueNumber
})
issue_number: issueNumber,
});
const issue_body = issue.data.body;
const issue_title = issue.data.title;
let issue_labels = [];
if (issue.data.labels.length > 0) {
issue.data.labels.forEach(it =>{
issue.data.labels.forEach(it => {
issue_labels.push(it.name);
});
}
let issue_assignees = [];
if (issue.data.assignees.length > 0) {
issue.data.assignees.forEach(it =>{
issue.data.assignees.forEach(it => {
issue_assignees.push(it.login);
});
}
@@ -356,13 +436,13 @@ async function doUpdateIssue (
owner,
repo,
issue_number: issueNumber,
state
state,
};
params.title = core.getInput("title") ? title : issue_title;
params.title = core.getInput('title') ? title : issue_title;
let next_body;
if (core.getInput("body")) {
if (core.getInput('body')) {
if (updateMode === 'append') {
next_body = `${issue_body}\n${body}`;
} else {
@@ -382,21 +462,21 @@ async function doUpdateIssue (
if (contents) {
await doCreateIssueContent(owner, repo, issueNumber, contents);
}
};
}
async function doWelcome (owner, repo, assignees, labels, body) {
async function doWelcome(owner, repo, assignees, labels, body) {
const context = github.context;
const isIssue = !!context.payload.issue;
const issueContents = core.getInput("issue-contents");
const issueContents = core.getInput('issue-contents');
if (!isIssue) {
core.setFailed("The event that triggered this action must be a issue. Error!");
core.setFailed('The event that triggered this action must be a issue. Error!');
} else {
const auth = context.payload.sender.login;
core.info(`Actions: [welcome: auth=][${auth}]`);
const issueNumber = context.issue.number;
const issues = await doQueryIssues(owner, repo, false, 'all', auth);
if (issues.length == 0 || (issues.length == 1 && issues[0].number == issueNumber)) {
if (core.getInput("body")) {
if (core.getInput('body')) {
await doCreateComment(owner, repo, issueNumber, body);
} else {
core.info(`Actions: [welcome] no body!`);
@@ -417,17 +497,17 @@ async function doWelcome (owner, repo, assignees, labels, body) {
core.info(`Actions: [welcome][${auth}] is not first time!`);
}
}
};
}
// **************************************************************************
function testContent(con) {
if (ALLREACTIONS.includes(con)) {
return true;
} else {
core.setFailed("This actions not supported!");
core.setFailed('This actions not supported!');
return false;
}
};
}
// **************************************************************************
module.exports = {
@@ -438,6 +518,7 @@ module.exports = {
doCreateCommentContent,
doCreateIssue,
doCreateIssueContent,
doCreateLabel,
doDeleteComment,
doMarkDuplicate,
doLockIssue,

View File

@@ -1,5 +1,5 @@
const core = require("@actions/core");
const github = require("@actions/github");
const core = require('@actions/core');
const github = require('@actions/github');
// **************************************************************************
const {
@@ -8,6 +8,7 @@ const {
doCloseIssue,
doCreateComment,
doCreateIssue,
doCreateLabel,
doDeleteComment,
doMarkDuplicate,
doLockIssue,
@@ -38,6 +39,7 @@ const ALLACTIONS = [
'close-issue',
'create-comment',
'create-issue',
'create-label',
'delete-comment',
'lock-issue',
'mark-duplicate',
@@ -62,43 +64,57 @@ const ALLACTIONS = [
// **************************************************************************
async function main() {
try {
const owner = github.context.repo.owner;
const repo = github.context.repo.repo;
const ctx = github.context;
const issueNumber = core.getInput('issue-number');
// No display to outside
let owner, repo;
if (core.getInput('repo')) {
owner = core.getInput('repo').split('/')[0];
repo = core.getInput('repo').split('/')[1];
} else {
owner = ctx.repo.owner;
repo = ctx.repo.repo;
}
let defaultNo;
if (ctx.eventName === 'issues' || ctx.eventName === 'issue_comment') {
defaultNo = ctx.payload.issue.number;
}
const issueNumber = core.getInput('issue-number') || defaultNo;
const commentId = core.getInput('comment-id');
const defaultBody = `Currently at ${owner}/${repo}. And this is default comment.`
const body = core.getInput("body") || defaultBody;
const defaultBody = `Currently at ${owner}/${repo}. And this is default comment.`;
const body = core.getInput('body') || defaultBody;
const defaultTitle = `Default Title`;
const title = core.getInput("title") || defaultTitle;
const title = core.getInput('title') || defaultTitle;
const assignees = core.getInput("assignees");
const assignees = core.getInput('assignees');
const labels = core.getInput("labels");
const state = core.getInput("state") || 'open';
const labels = core.getInput('labels');
const state = core.getInput('state') || 'open';
let updateMode = core.getInput("update-mode");
let updateMode = core.getInput('update-mode');
if (updateMode !== 'append') {
updateMode = 'replace';
}
// actions
const actions = core.getInput("actions", { required: true });
const actions = core.getInput('actions', { required: true });
const actionsArr = actions.split(',');
actionsArr.forEach(item => {
testActions(item.trim());
});
function testActions(action) {
if (ALLACTIONS.includes(action)) {
choseActions(action);
} else {
core.setFailed("This actions not supported!");
for (const action of actionsArr) {
await testActions(action.trim());
}
async function testActions(action) {
if (ALLACTIONS.includes(action)) {
await choseActions(action);
} else {
core.setFailed(`Actions: [${action}] is not supported!`);
}
}
};
async function choseActions(action) {
switch (action) {
@@ -118,6 +134,9 @@ async function main() {
case 'create-issue':
await doCreateIssue(owner, repo, title, body, labels, assignees);
break;
case 'create-label':
await doCreateLabel(owner, repo);
break;
case 'delete-comment':
await doDeleteComment(owner, repo, commentId);
break;
@@ -143,13 +162,7 @@ async function main() {
await doUnlockIssue(owner, repo, issueNumber);
break;
case 'update-comment':
await doUpdateComment(
owner,
repo,
commentId,
body,
updateMode
);
await doUpdateComment(owner, repo, commentId, body, updateMode);
break;
case 'update-issue':
await doUpdateIssue(
@@ -161,70 +174,38 @@ async function main() {
body,
updateMode,
assignees,
labels
labels,
);
break;
case 'welcome':
await doWelcome(
owner,
repo,
assignees,
labels,
body
);
await doWelcome(owner, repo, assignees, labels, body);
break;
// advanced
case 'check-inactive':
await doCheckInactive(
owner,
repo,
labels
)
await doCheckInactive(owner, repo, labels);
break;
case 'check-issue':
await doCheckIssue(
owner,
repo,
issueNumber
);
await doCheckIssue(owner, repo, issueNumber);
break;
case 'close-issues':
await doCloseIssues(
owner,
repo,
labels
)
await doCloseIssues(owner, repo, labels);
break;
case 'find-comments':
await doFindComments(
owner,
repo,
issueNumber
);
await doFindComments(owner, repo, issueNumber);
break;
case 'lock-issues':
await doLockIssues(
owner,
repo,
labels
);
await doLockIssues(owner, repo, labels);
break;
case 'month-statistics':
await doMonthStatistics(
owner,
repo,
labels,
assignees
);
await doMonthStatistics(owner, repo, labels, assignees);
break;
// default
default:
break;
}
};
}
catch (error) {
} catch (error) {
core.setFailed(error.message);
}
}

View File

@@ -1,10 +1,7 @@
require('dotenv').config();
const core = require("@actions/core");
const core = require('@actions/core');
const { Octokit } = require('@octokit/rest');
const {
getPreMonth
} = require('./util.js');
const { getPreMonth, dealStringToArr } = require('./util.js');
// **************************************************************************
var dayjs = require('dayjs');
@@ -19,26 +16,37 @@ const octokit = new Octokit({ auth: `token ${token}` });
const perPage = 100;
const issueCreator = core.getInput("issue-creator");
const issueCreator = core.getInput('issue-creator');
const issueAssignee = core.getInput('issue-assignee');
const issueMentioned = core.getInput('issue-mentioned');
const bodyIncludes = core.getInput('body-includes');
const titleIncludes = core.getInput('title-includes');
const inactiveDay = core.getInput("inactive-day");
const excludeLabels = core.getInput('exclude-labels');
const inactiveDay = core.getInput('inactive-day');
// **************************************************************************
async function doQueryIssues (owner, repo, labels, state, creator) {
/**
* 查询 Issues 列表
* @param {*} owner
* @param {*} repo
* @param {*} labels
* @param {*} state
* @param {*} creator
* @returns
*/
async function doQueryIssues(owner, repo, labels, state, creator) {
let params = {
owner,
repo,
state,
};
issueCreator ? params.creator = issueCreator : null;
issueAssignee ? params.assignee = issueAssignee : null;
issueMentioned ? params.mentioned = issueMentioned : null;
issueCreator ? (params.creator = issueCreator) : null;
issueAssignee ? (params.assignee = issueAssignee) : null;
issueMentioned ? (params.mentioned = issueMentioned) : null;
if (labels) {
params.labels = labels;
@@ -52,6 +60,7 @@ async function doQueryIssues (owner, repo, labels, state, creator) {
let issues = [];
let issueNumbers = [];
if (res.length) {
const excludeLabelsArr = dealStringToArr(excludeLabels);
res.forEach(iss => {
const a = bodyIncludes ? iss.body.includes(bodyIncludes) : true;
const b = titleIncludes ? iss.title.includes(titleIncludes) : true;
@@ -61,6 +70,12 @@ async function doQueryIssues (owner, repo, labels, state, creator) {
* You can identify pull requests by the pull_request key.
*/
if (a && b && iss.pull_request === undefined) {
if (excludeLabelsArr.length) {
for (let i = 0; i < iss.labels.length; i += 1) {
if (excludeLabelsArr.includes(iss.labels[i].name)) return;
}
}
if (inactiveDay) {
let lastTime = dayjs.utc().subtract(Number(inactiveDay), 'day');
let updateTime = dayjs.utc(iss.updated_at);
@@ -73,47 +88,47 @@ async function doQueryIssues (owner, repo, labels, state, creator) {
issueNumbers.push(iss.number);
}
}
})
});
core.info(`Actions: [query-issues]: [${JSON.stringify(issueNumbers)}]!`);
}
return issues;
};
}
async function getIssues (params, page = 1) {
async function getIssues(params, page = 1) {
let { data: issues } = await octokit.issues.listForRepo({
...params,
per_page: perPage,
page
page,
});
if (issues.length >= perPage) {
issues = issues.concat(await getIssues(params, page + 1));
}
return issues;
};
}
async function getIssuesInMonth (owner, repo, thisMonth, page = 1) {
async function getIssuesInMonth(owner, repo, thisMonth, page = 1) {
const month = getPreMonth(thisMonth);
let { data: issues } = await octokit.issues.listForRepo({
owner,
repo,
state: 'all',
per_page: perPage,
page
page,
});
issues = issues.filter(i => {
return i.pull_request === undefined
return i.pull_request === undefined;
});
if (issues.length && getCreatedMonth(issues[issues.length - 1].created_at) >= month) {
issues = issues.concat(await getIssuesInMonth(owner, repo, thisMonth, page + 1));
}
return issues;
};
}
// **************************************************************************
function getCreatedMonth (d) {
function getCreatedMonth(d) {
return dayjs(d).utc().month() + 1;
};
}
// **************************************************************************
module.exports = {

View File

@@ -1,6 +1,6 @@
const sampleSize = require('lodash/sampleSize');
function dealStringToArr (para) {
function dealStringToArr(para) {
/**
* in 'x1,x2,x3'
* out ['x1','x2','x3']
@@ -9,29 +9,29 @@ function dealStringToArr (para) {
if (para) {
const paraArr = para.split(',');
paraArr.forEach(it => {
if(it.trim()){
arr.push(it.trim())
if (it.trim()) {
arr.push(it.trim());
}
})
});
}
return arr;
};
}
function dealRandomAssignees (assignees, randomTo) {
function dealRandomAssignees(assignees, randomTo) {
let arr = dealStringToArr(assignees);
if (randomTo && Number(randomTo) > 0 && Number(randomTo) < arr.length) {
arr = sampleSize(arr, randomTo);
}
return arr;
};
}
function matchKeyword (content, keywords) {
function matchKeyword(content, keywords) {
return keywords.find(item => content.toLowerCase().includes(item));
};
}
function testDuplicate(body) {
if (!body || !body.startsWith('Duplicate of')) {
return false
return false;
}
let arr = body.split(' ');
@@ -40,16 +40,29 @@ function testDuplicate(body) {
} else {
return false;
}
};
}
function getPreMonth (m) {
return m == 1 ? 12 : m -1;
};
function getPreMonth(m) {
return m == 1 ? 12 : m - 1;
}
function checkPermission(require, permission) {
/**
* 有权限返回 true
*/
const permissions = ['none', 'read', 'write', 'admin'];
const requireNo = permissions.indexOf(require);
const permissionNo = permissions.indexOf(permission);
return requireNo <= permissionNo;
}
// **********************************************************
module.exports = {
dealStringToArr,
dealRandomAssignees,
getPreMonth,
matchKeyword,
testDuplicate,
checkPermission,
};

45
tests/public.test.js Normal file
View File

@@ -0,0 +1,45 @@
describe('Test Public', () => {
it('test query', () => {
const issues = [
{
id: 0,
labels: [{ name: '0' }, { name: '1' }],
},
{
id: 1,
labels: [{ name: '1' }, { name: '2' }],
},
{
id: 2,
labels: [{ name: '2' }, { name: '3' }],
},
{
id: 3,
labels: [{ name: '1' }, { name: '4' }],
},
{
id: 4,
labels: [{ name: '1' }, { name: '3' }],
},
{
id: 5,
labels: [{ name: '1' }, { name: '5' }],
},
];
let ex = ['2', '4'];
let r = [];
issues.forEach(iss => {
for (let i = 0; i < iss.labels.length; i += 1) {
if (ex.includes(iss.labels[i].name)) return;
}
r.push(iss);
});
expect(r[0].id).toEqual(0);
expect(r[1].id).toEqual(4);
expect(r[2].id).toEqual(5);
expect(r.length).toEqual(3);
});
});

19713
yarn.lock

File diff suppressed because it is too large Load Diff