mirror of
https://gitea.com/Lydanne/issues-helper.git
synced 2025-08-19 18:25:58 +08:00
Compare commits
48 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
11acd15e70 | ||
![]() |
7619e79b94 | ||
![]() |
c7cf5de709 | ||
![]() |
273b6abb78 | ||
![]() |
87bca14eb5 | ||
![]() |
8e05706e43 | ||
![]() |
3836013160 | ||
![]() |
fd98f44d05 | ||
![]() |
0396471168 | ||
![]() |
b7db679f4b | ||
![]() |
0cbadbacfa | ||
![]() |
1ce7be88a0 | ||
![]() |
53dda7f0e4 | ||
![]() |
026e812e04 | ||
![]() |
986730477b | ||
![]() |
9984ee0402 | ||
![]() |
dae9d88636 | ||
![]() |
7879d79201 | ||
![]() |
ed1da6607e | ||
![]() |
c70fbba1bd | ||
![]() |
ffe8047e9a | ||
![]() |
d8f67aa451 | ||
![]() |
c604486551 | ||
![]() |
80c1fcca98 | ||
![]() |
dc73f4f963 | ||
![]() |
da4725492d | ||
![]() |
7668c4b549 | ||
![]() |
b769c20e3f | ||
![]() |
44240d2ab3 | ||
![]() |
da1f8da3d4 | ||
![]() |
1cf278b531 | ||
![]() |
09b55c2859 | ||
![]() |
c81901f651 | ||
![]() |
a2273a4c3b | ||
![]() |
3cd24426bf | ||
![]() |
f3809e03c1 | ||
![]() |
caed683da4 | ||
![]() |
bbb5bbb425 | ||
![]() |
c5b5ee5c35 | ||
![]() |
78c1ba59b9 | ||
![]() |
4487540b6a | ||
![]() |
5d67e9fd3d | ||
![]() |
6189e252e2 | ||
![]() |
5e251408e1 | ||
![]() |
ebb8028be3 | ||
![]() |
18ae4ef9c4 | ||
![]() |
072eaa8147 | ||
![]() |
8175da541c |
5
.github/PULL_REQUEST_TEMPLATE.md
vendored
5
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -8,11 +8,11 @@ First of all, thank you for your contribution! 😄
|
|||||||
- [ ] 新特性提交 / New feature
|
- [ ] 新特性提交 / New feature
|
||||||
- [ ] bug 修复 / Fix bug
|
- [ ] bug 修复 / Fix bug
|
||||||
- [ ] 样式优化 / Style optimization
|
- [ ] 样式优化 / Style optimization
|
||||||
- [ ] 包体积优化 / Package size optimization
|
|
||||||
- [ ] 性能优化 / Performance optimization
|
|
||||||
- [ ] 代码风格优化 / Code style optimization
|
- [ ] 代码风格优化 / Code style optimization
|
||||||
|
- [ ] 性能优化 / Performance optimization
|
||||||
- [ ] 构建优化 / Build optimization
|
- [ ] 构建优化 / Build optimization
|
||||||
- [ ] 网站、文档、Demo 改进 / Website, documentation, demo improvements
|
- [ ] 网站、文档、Demo 改进 / Website, documentation, demo improvements
|
||||||
|
- [ ] 重构代码或样式 / Refactor code or style
|
||||||
- [ ] 测试相关 / Test related
|
- [ ] 测试相关 / Test related
|
||||||
- [ ] 其他 / Other
|
- [ ] 其他 / Other
|
||||||
|
|
||||||
@@ -42,7 +42,6 @@ Describe changes from the user side, and list all potential break changes or oth
|
|||||||
| 🇺🇸 English | |
|
| 🇺🇸 English | |
|
||||||
| 🇨🇳 Chinese | |
|
| 🇨🇳 Chinese | |
|
||||||
|
|
||||||
|
|
||||||
### ☑️ 请求合并前的自查清单 / Self Check before Merge
|
### ☑️ 请求合并前的自查清单 / Self Check before Merge
|
||||||
|
|
||||||
⚠️ 请自检并全部**勾选全部选项**。/ Please check all items below before review. ⚠️
|
⚠️ 请自检并全部**勾选全部选项**。/ Please check all items below before review. ⚠️
|
||||||
|
3
.github/workflows/ci.yml
vendored
3
.github/workflows/ci.yml
vendored
@@ -14,3 +14,6 @@ jobs:
|
|||||||
|
|
||||||
- name: package
|
- name: package
|
||||||
run: yarn package
|
run: yarn package
|
||||||
|
|
||||||
|
- name: package
|
||||||
|
run: yarn docs:build
|
||||||
|
20
.github/workflows/surge-preview.yml
vendored
Normal file
20
.github/workflows/surge-preview.yml
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
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'
|
2
.gitignore
vendored
2
.gitignore
vendored
@@ -18,7 +18,7 @@ yarn-error.log*
|
|||||||
|
|
||||||
# dependencies
|
# dependencies
|
||||||
node_modules
|
node_modules
|
||||||
yarn.lock
|
# yarn.lock
|
||||||
package-lock.json
|
package-lock.json
|
||||||
|
|
||||||
# local env files
|
# local env files
|
||||||
|
4
.umirc.dev.ts
Normal file
4
.umirc.dev.ts
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
export default {
|
||||||
|
base: '/',
|
||||||
|
publicPath: '/'
|
||||||
|
};
|
81
.umirc.ts
Normal file
81
.umirc.ts
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
// more config: https://d.umijs.org/config
|
||||||
|
import { defineConfig } from 'dumi';
|
||||||
|
|
||||||
|
const name = 'issues-helper';
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
title: 'Issue 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',
|
||||||
|
exportStatic: {},
|
||||||
|
ssr: {},
|
||||||
|
outputPath: 'docs-dist',
|
||||||
|
hash: true,
|
||||||
|
base: `/${name}/`,
|
||||||
|
publicPath: `/${name}/`,
|
||||||
|
locales: [
|
||||||
|
['zh-CN', '中文'],
|
||||||
|
['en-US', 'English'],
|
||||||
|
],
|
||||||
|
theme: {
|
||||||
|
'@c-primary': '#1890ff',
|
||||||
|
},
|
||||||
|
navs: {
|
||||||
|
'zh-CN': [
|
||||||
|
{ title: '指 南', path: '/guide' },
|
||||||
|
{ title: '基 础', path: '/base' },
|
||||||
|
{ title: '进 阶', path: '/advanced' },
|
||||||
|
{ title: '更新日志', path: '/changelog' },
|
||||||
|
{ title: '国内镜像', path: 'https://issues-helper.gitee.io' },
|
||||||
|
{ title: 'GitHub', path: 'https://github.com/actions-cool/issues-helper' },
|
||||||
|
],
|
||||||
|
'en-US': [
|
||||||
|
{ title: 'Guide', path: '/en-US/guide' },
|
||||||
|
{ title: 'Base', path: '/en-US/base' },
|
||||||
|
{ title: 'Advanced', path: '/en-US/advanced' },
|
||||||
|
{ title: 'Changelog', path: '/en-US/changelog' },
|
||||||
|
{ title: 'GitHub', path: 'https://github.com/actions-cool/issues-helper' },
|
||||||
|
]
|
||||||
|
},
|
||||||
|
menus: {
|
||||||
|
'/guide': [
|
||||||
|
{
|
||||||
|
title: '🍭 介 绍',
|
||||||
|
children: ['/guide/index', '/guide/start'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '🎁 参 考',
|
||||||
|
path: '/guide/ref',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '🎗 记 录',
|
||||||
|
path: '/guide/note',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '💬 FAQ',
|
||||||
|
path: '/guide/faq',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'/en-US/guide': [
|
||||||
|
{
|
||||||
|
title: '🍭 Guide',
|
||||||
|
children: ['/guide/index', '/guide/start'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '🎁 Reference',
|
||||||
|
path: '/guide/ref',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '🎗 Note',
|
||||||
|
path: '/guide/note',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '💬 FAQ',
|
||||||
|
path: '/guide/faq',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
});
|
78
CHANGELOG.md
Normal file
78
CHANGELOG.md
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
## 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`
|
||||||
|
|
||||||
|
- fix: duplicate labels set. [#36](https://github.com/actions-cool/issues-helper/pull/36)
|
||||||
|
|
||||||
|
## v1.9
|
||||||
|
|
||||||
|
`2021.01.11`
|
||||||
|
|
||||||
|
- feat: add random to. [#35](https://github.com/actions-cool/issues-helper/pull/35)
|
||||||
|
|
||||||
|
## v1.8
|
||||||
|
|
||||||
|
`2021.01.07`
|
||||||
|
|
||||||
|
- [#31](https://github.com/actions-cool/issues-helper/pull/31)
|
||||||
|
- refactor: split content
|
||||||
|
- feat: add `remove-labels` for duplicate
|
||||||
|
- docs: optimize website
|
||||||
|
|
||||||
|
## v1.7
|
||||||
|
|
||||||
|
`2021.01.02`
|
||||||
|
|
||||||
|
- [#27](https://github.com/actions-cool/issues-helper/pull/27)
|
||||||
|
- feat: add `month-statistics`
|
||||||
|
- fix: query issues less because pages max 100
|
||||||
|
- fix: js nested `require`
|
||||||
|
|
||||||
|
## v1.6
|
||||||
|
|
||||||
|
`2020.12.30`
|
||||||
|
|
||||||
|
- perf: optimize duplicate. [#24](https://github.com/actions-cool/issues-helper/pull/24)
|
||||||
|
|
||||||
|
## v1.5
|
||||||
|
|
||||||
|
`2020.12.30`
|
||||||
|
|
||||||
|
- feat: add `mark-duplicate`. [#23](https://github.com/actions-cool/issues-helper/pull/23)
|
||||||
|
|
||||||
|
## v1.4
|
||||||
|
|
||||||
|
`2020.12.29`
|
||||||
|
|
||||||
|
- fix: perfect `inactive-day` check. [#22](https://github.com/actions-cool/issues-helper/pull/22)
|
||||||
|
|
||||||
|
## v1.3
|
||||||
|
|
||||||
|
`2020.12.28`
|
||||||
|
|
||||||
|
- feat: add welcome. [#19](https://github.com/actions-cool/issues-helper/pull/19)
|
||||||
|
|
||||||
|
## v1.2
|
||||||
|
|
||||||
|
`2020.12.25`
|
||||||
|
|
||||||
|
- feat: add check-issue & remove labels. [#12](https://github.com/actions-cool/issues-helper/pull/12)
|
||||||
|
|
||||||
|
## v1.1
|
||||||
|
|
||||||
|
`2020.12.24`
|
||||||
|
|
||||||
|
- fix: yml not support array. [#11](https://github.com/actions-cool/issues-helper/pull/11)
|
||||||
|
|
||||||
|
## v1
|
||||||
|
|
||||||
|
`2020.12.23`
|
||||||
|
|
||||||
|
🎉 First release.
|
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
|||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2020 xrkffgg
|
Copyright (c) 2020-present xrkffgg
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
1075
README.en-US.md
Normal file
1075
README.en-US.md
Normal file
File diff suppressed because it is too large
Load Diff
858
README.zh-CN.md
858
README.zh-CN.md
@@ -1,858 +0,0 @@
|
|||||||
# 🤖 Issues 助手
|
|
||||||
|
|
||||||
[English](./README.md) | 简体中文
|
|
||||||
|
|
||||||
[](https://github.com/actions-cool/issues-helper/actions) [](https://github.com/marketplace/actions/issues-helper) [](https://github.com/actions-cool/issues-helper/stargazers) [](https://github.com/actions-cool/issues-helper/releases) [](https://github.com/actions-cool/issues-helper/discussions) [](https://github.com/actions-cool/issues-helper/blob/main/LICENSE)
|
|
||||||
|
|
||||||
一个帮你管理 issues 的 GitHub Action
|
|
||||||
|
|
||||||
在线文档 | [更新日志](./changelog.zh-CN.md)
|
|
||||||
|
|
||||||
## 😎 为什么用 GitHub Action?
|
|
||||||
|
|
||||||
1. 完全免费。
|
|
||||||
2. 全自动操作。
|
|
||||||
3. 托管于 GitHub 服务器,只要 GitHub 不宕机,它就会一直跑下去。
|
|
||||||
|
|
||||||
> Private 项目每月有 2000 次的限制,[具体查看](https://github.com/settings/billing)。Public 项目无限制。
|
|
||||||
|
|
||||||
## 列 表
|
|
||||||
|
|
||||||
- ⭐ 基 础
|
|
||||||
- [`add-assignees`](#add-assignees)
|
|
||||||
- [`add-labels`](#add-labels)
|
|
||||||
- [`close-issue`](#close-issue)
|
|
||||||
- [`create-comment`](#create-comment)
|
|
||||||
- [`create-issue`](#create-issue)
|
|
||||||
- [`delete-comment`](#delete-comment)
|
|
||||||
- [`lock-issue`](#lock-issue)
|
|
||||||
- [`open-issue`](#open-issue)
|
|
||||||
- [`remove-assignees`](#remove-assignees)
|
|
||||||
- [`remove-labels`](#remove-labels)
|
|
||||||
- [`set-labels`](#set-labels)
|
|
||||||
- [`unlock-issue`](#unlock-issue)
|
|
||||||
- [`update-comment`](#update-comment)
|
|
||||||
- [`update-issue`](#update-issue)
|
|
||||||
- ⭐ 进 阶
|
|
||||||
- [`check-inactive`](#check-inactive)
|
|
||||||
- [`check-issue`](#check-issue)
|
|
||||||
- [`close-issues`](#close-issues)
|
|
||||||
- [`find-comments`](#find-comments)
|
|
||||||
- [`lock-issues`](#lock-issues)
|
|
||||||
- 🌰 例 子
|
|
||||||
- [`find-comments + create-comment + update-comment`](#find-comments--create-comment--update-comment)
|
|
||||||
|
|
||||||
## 🚀 使 用
|
|
||||||
|
|
||||||
### ⭐ 基 础
|
|
||||||
|
|
||||||
为了更好的展示功能,下面以实际场景举例,请灵活参考。
|
|
||||||
|
|
||||||
#### `add-assignees`
|
|
||||||
|
|
||||||
当一个 issue 新增或修改时,将这个 issue 指定某人或多人。
|
|
||||||
|
|
||||||
```yml
|
|
||||||
name: Add Assigness
|
|
||||||
|
|
||||||
on:
|
|
||||||
issues:
|
|
||||||
types: [opened, edited]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
add-assigness:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Add assigness
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
with:
|
|
||||||
actions: 'add-assignees'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
issue-number: ${{ github.event.issue.number }}
|
|
||||||
assignees: 'xxx' or 'xx1,xx2'
|
|
||||||
```
|
|
||||||
|
|
||||||
| 参数 | 描述 | 类型 | 必填 | 版本 |
|
|
||||||
| -- | -- | -- | -- | -- |
|
|
||||||
| actions | 操作类型 | string | ✔ | v1 |
|
|
||||||
| token | [token 说明](#token) | string | ✔ | v1 |
|
|
||||||
| issue-number | 指定的 issue | number | ✔ | v1 |
|
|
||||||
| assignees | 指定人。当不填或者为空字符时,不操作 | string | ✖ | v1 |
|
|
||||||
|
|
||||||
- `actions` 支持多个,需用逗号隔开。如:`add-assignees,add-labels`
|
|
||||||
- 其中的 `name` 可根据自行根据实际情况修改
|
|
||||||
- [on 参考](#github-docs)
|
|
||||||
- `${{ github.event.issue.number }}` 表示当前 issue,[更多参考](https://docs.github.com/en/free-pro-team@latest/developers/webhooks-and-events)
|
|
||||||
- `assignees` 支持多个,需用逗号隔开。注意设置多个,需使用v1.1以上版本
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
#### `add-labels`
|
|
||||||
|
|
||||||
当一个新增的 issue 内容不包含指定格式时,为这个 issue 添加 labels。
|
|
||||||
|
|
||||||
```yml
|
|
||||||
name: Add Labels
|
|
||||||
|
|
||||||
on:
|
|
||||||
issues:
|
|
||||||
types: [opened]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
add-labels:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: contains(github.event.issue.body, 'xxx') == false
|
|
||||||
steps:
|
|
||||||
- name: Add labels
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
with:
|
|
||||||
actions: 'add-labels'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
issue-number: ${{ github.event.issue.number }}
|
|
||||||
labels: 'bug' or 'bug1,bug2'
|
|
||||||
```
|
|
||||||
|
|
||||||
| 参数 | 描述 | 类型 | 必填 | 版本 |
|
|
||||||
| -- | -- | -- | -- | -- |
|
|
||||||
| actions | 操作类型 | string | ✔ | v1 |
|
|
||||||
| token | [token 说明](#token) | string | ✔ | v1 |
|
|
||||||
| issue-number | 指定的 issue | number | ✔ | v1 |
|
|
||||||
| labels | 新增的 labels。当不填或者为空字符时,不新增 | string | ✖ | v1 |
|
|
||||||
|
|
||||||
- `labels` 支持多个,需用逗号隔开。注意设置多个,需使用v1.1以上版本
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
#### `close-issue`
|
|
||||||
|
|
||||||
关闭指定 issue。
|
|
||||||
|
|
||||||
```yml
|
|
||||||
- name: Close issue
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
with:
|
|
||||||
actions: 'close-issue'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
issue-number: xxx
|
|
||||||
body: 'This is auto closed.'
|
|
||||||
```
|
|
||||||
|
|
||||||
| 参数 | 描述 | 类型 | 必填 | 版本 |
|
|
||||||
| -- | -- | -- | -- | -- |
|
|
||||||
| actions | 操作类型 | string | ✔ | v1 |
|
|
||||||
| token | [token 说明](#token) | string | ✔ | v1 |
|
|
||||||
| issue-number | 指定的 issue | number | ✔ | v1 |
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
#### `create-comment`
|
|
||||||
|
|
||||||
当新增一个指定 label 时,对该 issue 进行评论。
|
|
||||||
|
|
||||||
```yml
|
|
||||||
name: Create Comment
|
|
||||||
|
|
||||||
on:
|
|
||||||
issues:
|
|
||||||
types: [labeled]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
create-comment:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: github.event.label.name == 'xxx'
|
|
||||||
steps:
|
|
||||||
- name: Create comment
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
with:
|
|
||||||
actions: 'create-comment'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
issue-number: ${{ github.event.issue.number }}
|
|
||||||
body: |
|
|
||||||
Hello ${{ github.event.issue.user.login }}. Add some comments.
|
|
||||||
|
|
||||||
你好 ${{ github.event.issue.user.login }}。巴拉巴拉。
|
|
||||||
contents: '+1' or '+1,heart'
|
|
||||||
```
|
|
||||||
|
|
||||||
| 参数 | 描述 | 类型 | 必填 | 版本 |
|
|
||||||
| -- | -- | -- | -- | -- |
|
|
||||||
| actions | 操作类型 | string | ✔ | v1 |
|
|
||||||
| token | [token 说明](#token) | string | ✔ | v1 |
|
|
||||||
| issue-number | 指定的 issue | number | ✔ | v1 |
|
|
||||||
| body | 新增评论的内容 | string | ✖ | v1 |
|
|
||||||
| contents | 为新增评论的增加 [reaction](#reactions-types) | string | ✖ | v1 |
|
|
||||||
|
|
||||||
- `body` 默认为:`Currently at ${owner}/${repo}. And this is default comment.`
|
|
||||||
- 其中 `${owner}/${repo}` 表示当前仓库
|
|
||||||
- 返回 `comment-id`,可用于之后操作。[用法参考](#outputs-使用)
|
|
||||||
- `${{ github.event.issue.user.login }}` 表示该 issue 的创建者
|
|
||||||
- `contents` 支持多个,需用逗号隔开。注意设置多个,需使用v1.1以上版本
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
#### `create-issue`
|
|
||||||
|
|
||||||
感觉新增 issue 使用场景不多。这里举例,每月 1 号 UTC 00:00 新增一个 issue。
|
|
||||||
|
|
||||||
```yml
|
|
||||||
name: Create Issue
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: "0 0 1 * *"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
create-issue:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Create issue
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
with:
|
|
||||||
actions: 'create-issue'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
title: 'xxxx'
|
|
||||||
body: 'xxxx'
|
|
||||||
labels: 'xx'
|
|
||||||
assignees: 'xxx'
|
|
||||||
contents: '+1'
|
|
||||||
```
|
|
||||||
|
|
||||||
| 参数 | 描述 | 类型 | 必填 | 版本 |
|
|
||||||
| -- | -- | -- | -- | -- |
|
|
||||||
| actions | 操作类型 | string | ✔ | v1 |
|
|
||||||
| token | [token 说明](#token) | string | ✔ | v1 |
|
|
||||||
| title | 新增 issue 的标题 | string | ✖ | v1 |
|
|
||||||
| body | 新增 issue 的内容 | string | ✖ | v1 |
|
|
||||||
| labels | 为新增 issue 添加 labels | string | ✖ | v1 |
|
|
||||||
| assignees | 为新增 issue 添加 assignees | string | ✖ | v1 |
|
|
||||||
| contents | 为新增 issue 增加 [reaction](#reactions-types) | string | ✖ | v1 |
|
|
||||||
|
|
||||||
- `title` 默认为:`Default Title`
|
|
||||||
- 返回 `issue-number`,[用法参考](#outputs-使用)
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
#### `delete-comment`
|
|
||||||
|
|
||||||
根据 [`comment-id`](#comment-id) 删除指定评论。
|
|
||||||
|
|
||||||
```yml
|
|
||||||
- name: Delete comment
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
with:
|
|
||||||
actions: 'delete-comment'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
comment-id: xxx
|
|
||||||
```
|
|
||||||
|
|
||||||
| 参数 | 描述 | 类型 | 必填 | 版本 |
|
|
||||||
| -- | -- | -- | -- | -- |
|
|
||||||
| actions | 操作类型 | string | ✔ | v1 |
|
|
||||||
| token | [token 说明](#token) | string | ✔ | v1 |
|
|
||||||
| comment-id | 指定的 comment | number | ✔ | v1 |
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
#### `lock-issue`
|
|
||||||
|
|
||||||
当新增 `invalid` label 时,对该 issue 进行锁定。
|
|
||||||
|
|
||||||
```yml
|
|
||||||
name: Lock Issue
|
|
||||||
|
|
||||||
on:
|
|
||||||
issues:
|
|
||||||
types: [labeled]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lock-issue:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: github.event.label.name == 'invalid'
|
|
||||||
steps:
|
|
||||||
- name: Lock issue
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
with:
|
|
||||||
actions: 'lock-issue'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
issue-number: ${{ github.event.issue.number }}
|
|
||||||
```
|
|
||||||
|
|
||||||
| 参数 | 描述 | 类型 | 必填 | 版本 |
|
|
||||||
| -- | -- | -- | -- | -- |
|
|
||||||
| actions | 操作类型 | string | ✔ | v1 |
|
|
||||||
| token | [token 说明](#token) | string | ✔ | v1 |
|
|
||||||
| issue-number | 指定的 issue | number | ✔ | v1 |
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
#### `open-issue`
|
|
||||||
|
|
||||||
打开指定 issue。
|
|
||||||
|
|
||||||
```yml
|
|
||||||
- name: Open issue
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
with:
|
|
||||||
actions: 'open-issue'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
issue-number: xxx
|
|
||||||
```
|
|
||||||
|
|
||||||
| 参数 | 描述 | 类型 | 必填 | 版本 |
|
|
||||||
| -- | -- | -- | -- | -- |
|
|
||||||
| actions | 操作类型 | string | ✔ | v1 |
|
|
||||||
| token | [token 说明](#token) | string | ✔ | v1 |
|
|
||||||
| issue-number | 指定的 issue | number | ✔ | v1 |
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
#### `remove-assignees`
|
|
||||||
|
|
||||||
移除 issue 指定人员。
|
|
||||||
|
|
||||||
```yml
|
|
||||||
- name: Remove assignees
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
with:
|
|
||||||
actions: 'remove-assignees'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
issue-number: ${{ github.event.issue.number }}
|
|
||||||
assignees: 'xx'
|
|
||||||
```
|
|
||||||
|
|
||||||
| 参数 | 描述 | 类型 | 必填 | 版本 |
|
|
||||||
| -- | -- | -- | -- | -- |
|
|
||||||
| actions | 操作类型 | string | ✔ | v1 |
|
|
||||||
| token | [token 说明](#token) | string | ✔ | v1 |
|
|
||||||
| issue-number | 指定的 issue | number | ✔ | v1 |
|
|
||||||
| assignees | 移除的指定人。当为空字符时,不进行移除 | string | ✔ | v1 |
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
#### `remove-labels`
|
|
||||||
|
|
||||||
移除指定 labels。
|
|
||||||
|
|
||||||
```yml
|
|
||||||
- name: Remove labels
|
|
||||||
uses: actions-cool/issues-helper@v1.2
|
|
||||||
with:
|
|
||||||
actions: 'remove-labels'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
issue-number: ${{ github.event.issue.number }}
|
|
||||||
labels: 'xx'
|
|
||||||
```
|
|
||||||
|
|
||||||
| 参数 | 描述 | 类型 | 必填 | 版本 |
|
|
||||||
| -- | -- | -- | -- | -- |
|
|
||||||
| actions | 操作类型 | string | ✔ | v1.2 |
|
|
||||||
| token | [token 说明](#token) | string | ✔ | v1.2 |
|
|
||||||
| issue-number | 指定的 issue | number | ✔ | v1.2 |
|
|
||||||
| labels | 移除的 labels。当为空字符时,不进行移除 | string | ✔ | v1.2 |
|
|
||||||
|
|
||||||
- `labels` 支持多个,如 `x1,x2,x3`,只会移除 issue 已添加的 labels
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
#### `set-labels`
|
|
||||||
|
|
||||||
替换 issue 的 labels。
|
|
||||||
|
|
||||||
```yml
|
|
||||||
- name: Set labels
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
with:
|
|
||||||
actions: 'set-labels'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
issue-number: ${{ github.event.issue.number }}
|
|
||||||
labels: 'xx'
|
|
||||||
```
|
|
||||||
|
|
||||||
| 参数 | 描述 | 类型 | 必填 | 版本 |
|
|
||||||
| -- | -- | -- | -- | -- |
|
|
||||||
| actions | 操作类型 | string | ✔ | v1 |
|
|
||||||
| token | [token 说明](#token) | string | ✔ | v1 |
|
|
||||||
| issue-number | 指定的 issue | number | ✔ | v1 |
|
|
||||||
| labels | labels 设置。当空字符时,会移除所有 | string | ✔ | v1 |
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
#### `unlock-issue`
|
|
||||||
|
|
||||||
解锁指定 issue。
|
|
||||||
|
|
||||||
```yml
|
|
||||||
- name: Unlock issue
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
with:
|
|
||||||
actions: 'unlock-issue'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
issue-number: ${{ github.event.issue.number }}
|
|
||||||
```
|
|
||||||
|
|
||||||
| 参数 | 描述 | 类型 | 必填 | 版本 |
|
|
||||||
| -- | -- | -- | -- | -- |
|
|
||||||
| actions | 操作类型 | string | ✔ | v1 |
|
|
||||||
| token | [token 说明](#token) | string | ✔ | v1 |
|
|
||||||
| issue-number | 指定的 issue | number | ✔ | v1 |
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
#### `update-comment`
|
|
||||||
|
|
||||||
根据 [`comment-id`](#comment-id) 更新指定评论。
|
|
||||||
|
|
||||||
下面的例子展示的是,为每个新增的 comment 增加 👀 。
|
|
||||||
|
|
||||||
```yml
|
|
||||||
name: Add eyes to each comment
|
|
||||||
|
|
||||||
on:
|
|
||||||
issue_comment:
|
|
||||||
types: [created]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
update-comment:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Update comment
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
with:
|
|
||||||
actions: 'update-comment'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
comment-id: ${{ github.event.comment.id }}
|
|
||||||
contents: 'eyes'
|
|
||||||
```
|
|
||||||
|
|
||||||
| 参数 | 描述 | 类型 | 必填 | 版本 |
|
|
||||||
| -- | -- | -- | -- | -- |
|
|
||||||
| actions | 操作类型 | string | ✔ | v1 |
|
|
||||||
| token | [token 说明](#token) | string | ✔ | v1 |
|
|
||||||
| comment-id | 指定的 comment | number | ✔ | v1 |
|
|
||||||
| body | 更新 comment 的内容 | string | ✖ | v1 |
|
|
||||||
| update-mode | 更新模式。默认 `replace` 替换,`append` 附加 | string | ✖ | v1 |
|
|
||||||
| contents | 增加 [reaction](#reactions-types) | string | ✖ | v1 |
|
|
||||||
|
|
||||||
- `body` 不填时,会保持原有
|
|
||||||
- `update-mode` 为 `append` 时,会进行附加操作。非 `append` 都会进行替换。仅对 `body` 生效
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
#### `update-issue`
|
|
||||||
|
|
||||||
根据 `issue-number` 更新指定 issue。
|
|
||||||
|
|
||||||
```yml
|
|
||||||
- name: Update issue
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
with:
|
|
||||||
actions: 'update-issue'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
issue-number: ${{ github.event.issue.number }}
|
|
||||||
state: 'open'
|
|
||||||
title: 'xxx'
|
|
||||||
body: 'xxxx'
|
|
||||||
update-mode: 'replace'
|
|
||||||
labels: 'xx'
|
|
||||||
assignees: 'xxx'
|
|
||||||
contents: '+1'
|
|
||||||
```
|
|
||||||
|
|
||||||
| 参数 | 描述 | 类型 | 必填 | 版本 |
|
|
||||||
| -- | -- | -- | -- | -- |
|
|
||||||
| actions | 操作类型 | string | ✔ | v1 |
|
|
||||||
| token | [token 说明](#token) | string | ✔ | v1 |
|
|
||||||
| issue-number | 指定的 issue | number | ✔ | v1 |
|
|
||||||
| state | 修改 issue 的状态,可选值 `open` `closed` | string | ✖ | v1 |
|
|
||||||
| title | 修改 issue 的标题 | string | ✖ | v1 |
|
|
||||||
| body | 修改 issue 的内容 | string | ✖ | v1 |
|
|
||||||
| update-mode | 更新模式。默认 `replace` 替换,`append` 附加 | string | ✖ | v1 |
|
|
||||||
| labels | 替换 issue 的 labels | string | ✖ | v1 |
|
|
||||||
| assignees | 替换 issue 的 assignees | string | ✖ | v1 |
|
|
||||||
| contents | 增加 [reaction](#reactions-types) | string | ✖ | v1 |
|
|
||||||
|
|
||||||
- `state` 默认为 `open`
|
|
||||||
- 当可选项不填时,会保持原有
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
### ⭐ 进 阶
|
|
||||||
|
|
||||||
进阶用法不建议 actions 多个一次同时使用。
|
|
||||||
|
|
||||||
#### `check-inactive`
|
|
||||||
|
|
||||||
每月 1 号 UTC 0 时,对所有 30 天以上未活跃的 issues 增加 `inactive` 标签。
|
|
||||||
|
|
||||||
```yml
|
|
||||||
name: Check inactive
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: "0 0 1 * *"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
check-inactive:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: check-inactive
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
with:
|
|
||||||
actions: 'check-inactive'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
inactive-day: 30
|
|
||||||
```
|
|
||||||
|
|
||||||
| 参数 | 描述 | 类型 | 必填 | 版本 |
|
|
||||||
| -- | -- | -- | -- | -- |
|
|
||||||
| actions | 操作类型 | string | ✔ | v1 |
|
|
||||||
| token | [token 说明](#token) | string | ✔ | v1 |
|
|
||||||
| body | 操作 issue 时,可进行评论。不填时,不评论 | string | ✖ | v1 |
|
|
||||||
| labels | 标签筛选 | string | ✖ | v1 |
|
|
||||||
| issue-state | 状态筛选 | string | ✖ | v1 |
|
|
||||||
| issue-assignee | 指定人筛选 | string | ✖ | v1 |
|
|
||||||
| issue-creator | 创建人筛选 | string | ✖ | v1 |
|
|
||||||
| issue-mentioned | 提及人筛选 | string | ✖ | v1 |
|
|
||||||
| body-includes | 包含内容筛选 | string | ✖ | v1 |
|
|
||||||
| title-includes | 包含标题筛选 | string | ✖ | v1 |
|
|
||||||
| inactive-day | 非活跃天数筛选 | number | ✖ | v1 |
|
|
||||||
| inactive-label | 新增标签名称 | string | ✖ | v1 |
|
|
||||||
|
|
||||||
- `labels`:为多个时,会查询同时拥有多个。不填时,会查询所有
|
|
||||||
- `issue-state`:默认为 `all`。可选值 `open` `closed`,非这 2 项时,均为 `all`
|
|
||||||
- `issue-assignee`:不支持多人。不填或输入 * 时,查询所有。输入 `none` 会查询未添加指定人的 issues
|
|
||||||
- `inactive-day`:当输入时,会筛选 issue 更新时间早于当前时间减去非活跃天数。不填时,会查询所有
|
|
||||||
- `inactive-label`:默认为 `inactive`,可自定义其他。当项目未包含该 label 时,会自动新建
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
#### `check-issue`
|
|
||||||
|
|
||||||
根据传入的参数和 `issue-number` 来检查该 issue 是否满足条件,返回一个布尔值。
|
|
||||||
|
|
||||||
下面的例子效果是:当 issue 新开时,校验当前 issue 指定人是否包含 `x1` 或者 `x2`,满足一个指定人即可校验通过,同时校验标题是否满足条件。条件如下:
|
|
||||||
|
|
||||||
```js
|
|
||||||
x1 + y1
|
|
||||||
x2 + y1
|
|
||||||
x1 + y2
|
|
||||||
x2 + y2
|
|
||||||
|
|
||||||
"x1y3y2" true
|
|
||||||
"1x2y" false
|
|
||||||
"y2 x1" true
|
|
||||||
"x1" false
|
|
||||||
```
|
|
||||||
|
|
||||||
```yml
|
|
||||||
name: Check Issue
|
|
||||||
|
|
||||||
on:
|
|
||||||
issues:
|
|
||||||
types: [edited]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
check-issue:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: check-issue
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
with:
|
|
||||||
actions: 'check-issue'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
issue-number: ${{ github.event.issue.number }}
|
|
||||||
assignee-includes: 'x1,x2'
|
|
||||||
title-includes: 'x1,x2/y1,y2'
|
|
||||||
```
|
|
||||||
|
|
||||||
| 参数 | 描述 | 类型 | 必填 | 版本 |
|
|
||||||
| -- | -- | -- | -- | -- |
|
|
||||||
| actions | 操作类型 | string | ✔ | v1.2 |
|
|
||||||
| token | [token 说明](#token) | string | ✔ | v1.2 |
|
|
||||||
| issue-number | 指定的 issue | number | ✔ | v1.2 |
|
|
||||||
| assignee-includes | 是否包含指定人 | string | ✖ | v1.2 |
|
|
||||||
| title-includes | 标题包含校验 | string | ✖ | v1.2 |
|
|
||||||
| body-includes | 内容包含校验 | string | ✖ | v1.2 |
|
|
||||||
|
|
||||||
- `title-includes` `body-includes` 支持格式 `x1,x2` 或者 `x1,x2/y1,y2`。只支持两个层级
|
|
||||||
- 返回 `check-result`
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
#### `close-issues`
|
|
||||||
|
|
||||||
每 7 天 UTC 0 时,关闭已填加 `need info` label 且 7 天以上未活跃的 issues。
|
|
||||||
|
|
||||||
```yml
|
|
||||||
name: Check need info
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: "0 0 */7 * *"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
check-need-info:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: close-issues
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
with:
|
|
||||||
actions: 'close-issues'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
labels: 'need info'
|
|
||||||
inactive-day: 7
|
|
||||||
```
|
|
||||||
|
|
||||||
| 参数 | 描述 | 类型 | 必填 | 版本 |
|
|
||||||
| -- | -- | -- | -- | -- |
|
|
||||||
| actions | 操作类型 | string | ✔ | v1 |
|
|
||||||
| token | [token 说明](#token) | string | ✔ | v1 |
|
|
||||||
| body | 操作 issue 时,可进行评论。不填时,不评论 | string | ✖ | v1 |
|
|
||||||
| labels | 标签筛选 | string | ✖ | v1 |
|
|
||||||
| issue-assignee | 指定人筛选 | string | ✖ | v1 |
|
|
||||||
| issue-creator | 创建人筛选 | string | ✖ | v1 |
|
|
||||||
| issue-mentioned | 提及人筛选 | string | ✖ | v1 |
|
|
||||||
| body-includes | 包含内容筛选 | string | ✖ | v1 |
|
|
||||||
| title-includes | 包含标题筛选 | string | ✖ | v1 |
|
|
||||||
| inactive-day | 非活跃天数筛选 | number | ✖ | v1 |
|
|
||||||
|
|
||||||
- `labels`:为多个时,会查询同时拥有多个。不填时,会查询所有
|
|
||||||
- `issue-assignee`:不支持多人。不填或输入 * 时,查询所有。输入 `none` 会查询未添加指定人的 issues
|
|
||||||
- `inactive-day`:当输入时,会筛选 issue 更新时间早于当前时间减去非活跃天数。不填时,会查询所有
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
#### `find-comments`
|
|
||||||
|
|
||||||
查找当前仓库 1 号 issue 中,创建者是 k ,内容包含 `this` 的评论列表。
|
|
||||||
|
|
||||||
```yml
|
|
||||||
- name: Find comments
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
with:
|
|
||||||
actions: 'find-comments'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
issue-number: 1
|
|
||||||
comment-auth: 'k'
|
|
||||||
body-includes: 'this'
|
|
||||||
```
|
|
||||||
|
|
||||||
| 参数 | 描述 | 类型 | 必填 | 版本 |
|
|
||||||
| -- | -- | -- | -- | -- |
|
|
||||||
| actions | 操作类型 | string | ✔ | v1 |
|
|
||||||
| token | [token 说明](#token) | string | ✔ | v1 |
|
|
||||||
| issue-number | 指定的 issue | number | ✔ | v1 |
|
|
||||||
| comment-auth | 评论创建者,不填时会查询所有 | string | ✖ | v1 |
|
|
||||||
| body-includes | 评论内容包含过滤,不填时无校验 | string | ✖ | v1 |
|
|
||||||
| direction | 返回 `comments` 排序 | string | ✖ | v1 |
|
|
||||||
|
|
||||||
- 返回 `comments`,格式如下:
|
|
||||||
|
|
||||||
```js
|
|
||||||
[
|
|
||||||
{id: 1, auth: 'x', body: 'xxx', created: '', updated: ''},
|
|
||||||
{id: 2, auth: 'x', body: 'xxx', created: '', updated: ''},
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
- `direction` 默认为升序,只有设置 `desc` 时,会返回降序
|
|
||||||
- 返回数组中 `created` `updated`,由所处环境决定,会是 UTC +0
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
#### `lock-issues`
|
|
||||||
|
|
||||||
每 3 个月 1 号 UTC 0 时,锁定已填加 `inactive` label 且 128 天以上未活跃的所有 issues。
|
|
||||||
|
|
||||||
```yml
|
|
||||||
name: Lock inactive issues
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: "0 0 1 */3 *"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lock-issues:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: lock-issues
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
with:
|
|
||||||
actions: 'lock-issues'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
labels: 'inactive'
|
|
||||||
inactive-day: 128
|
|
||||||
```
|
|
||||||
|
|
||||||
| 参数 | 描述 | 类型 | 必填 | 版本 |
|
|
||||||
| -- | -- | -- | -- | -- |
|
|
||||||
| actions | 操作类型 | string | ✔ | v1 |
|
|
||||||
| token | [token 说明](#token) | string | ✔ | v1 |
|
|
||||||
| body | 操作 issue 时,可进行评论。不填时,不评论 | string | ✖ | v1 |
|
|
||||||
| labels | 标签筛选 | string | ✖ | v1 |
|
|
||||||
| issue-state | 状态筛选 | string | ✖ | v1 |
|
|
||||||
| issue-assignee | 指定人筛选 | string | ✖ | v1 |
|
|
||||||
| issue-creator | 创建人筛选 | string | ✖ | v1 |
|
|
||||||
| issue-mentioned | 提及人筛选 | string | ✖ | v1 |
|
|
||||||
| body-includes | 包含内容筛选 | string | ✖ | v1 |
|
|
||||||
| title-includes | 包含标题筛选 | string | ✖ | v1 |
|
|
||||||
| inactive-day | 非活跃天数筛选 | number | ✖ | v1 |
|
|
||||||
|
|
||||||
- `labels`:为多个时,会查询同时拥有多个。不填时,会查询所有
|
|
||||||
- `issue-state`:默认为 `all`。可选值 `open` `closed`,非这 2 项时,均为 `all`
|
|
||||||
- `issue-assignee`:不支持多人。不填或输入 * 时,查询所有。输入 `none` 会查询未添加指定人的 issues
|
|
||||||
- `inactive-day`:当输入时,会筛选 issue 更新时间早于当前时间减去非活跃天数。不填时,会查询所有
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
## 🌰 例 子
|
|
||||||
|
|
||||||
灵活参考。
|
|
||||||
|
|
||||||
### `find-comments + create-comment + update-comment`
|
|
||||||
|
|
||||||
假设场景:当添加了 `watch` label 的 issue 修改时,查找是否有 k 创建的包含 `error` 的评论,如果只有一个,则更新该 comment,如果没有,则新增一个 comment。
|
|
||||||
|
|
||||||
```yml
|
|
||||||
name: Test
|
|
||||||
|
|
||||||
on:
|
|
||||||
isssue:
|
|
||||||
types: [edited]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
do-test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: github.event.label.name == 'watch'
|
|
||||||
steps:
|
|
||||||
- name: find comments
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
id: fcid
|
|
||||||
with:
|
|
||||||
actions: 'find-comments'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
issue-number: ${{ github.event.issue.number }}
|
|
||||||
comment-auth: k
|
|
||||||
body-includes: 'error'
|
|
||||||
|
|
||||||
- name: create comment
|
|
||||||
if: ${{ steps.fcid.outputs.comments.length == 0 }}
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
with:
|
|
||||||
actions: 'create-comment'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
issue-number: ${{ github.event.issue.number }}
|
|
||||||
body: 'Some error!'
|
|
||||||
|
|
||||||
- name: update comment
|
|
||||||
if: ${{ steps.fcid.outputs.comments.length == 1 }}
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
with:
|
|
||||||
actions: 'update-comment'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
comment-id: ${{ steps.fcid.outputs.comments[0].id }}
|
|
||||||
body: 'Some error again!'
|
|
||||||
update-mode: 'append'
|
|
||||||
```
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
## 🎁 参 考
|
|
||||||
|
|
||||||
### token
|
|
||||||
|
|
||||||
需拥有 push 权限的人员 token。
|
|
||||||
|
|
||||||
- [个人 token 申请](https://github.com/settings/tokens)
|
|
||||||
- 需勾选 `Full control of private repositories`
|
|
||||||
- 项目添加 secrets
|
|
||||||
- 选择 settings,选择 secrets,选择 `New repository secret`
|
|
||||||
- `Name` 与 actions 中保持一致
|
|
||||||
- `Value` 填写刚才个人申请的 token
|
|
||||||
|
|
||||||
当 actions 不填写 token 时,或项目未添加对应 secrets 时,会默认为 github-actions <kbd>bot</kbd>。
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
### `outputs` 使用
|
|
||||||
|
|
||||||
```yml
|
|
||||||
- name: Create issue
|
|
||||||
uses: actions-cool/issues-helper@v1
|
|
||||||
id: createissue
|
|
||||||
with:
|
|
||||||
actions: 'create-issue'
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
- name: Check outputs
|
|
||||||
run: echo "Outputs issue_number is ${{ steps.createissue.outputs.issue-number }}"
|
|
||||||
```
|
|
||||||
|
|
||||||
### GitHub Docs
|
|
||||||
|
|
||||||
- [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)
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
### Reactions types
|
|
||||||
|
|
||||||
| content | emoji |
|
|
||||||
| -- | -- |
|
|
||||||
| `+1` | 👍 |
|
|
||||||
| `-1` | 👎 |
|
|
||||||
| `laugh` | 😄 |
|
|
||||||
| `confused` | 😕 |
|
|
||||||
| `heart` | ❤️ |
|
|
||||||
| `hooray` | 🎉 |
|
|
||||||
| `rocket` | 🚀 |
|
|
||||||
| `eyes` | 👀 |
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
### `comment-id`
|
|
||||||
|
|
||||||
点击某个评论右上角 `···` 图标,选择 `Copy link`,url 末尾数字即是 `comment_id`。
|
|
||||||
|
|
||||||
⏫ [返回列表](#列-表)
|
|
||||||
|
|
||||||
## Actions 模板
|
|
||||||
|
|
||||||
- 可直接使用这个 [GitHub Actions workflow template](https://github.com/actions-cool/.github) 仓库的模板
|
|
||||||
|
|
||||||
- 个人练习和测试 [Actions](https://github.com/xrkffgg/test-ci) 的仓库
|
|
||||||
|
|
||||||
## 💖 谁在使用?
|
|
||||||
|
|
||||||
你可以来以下项目进行参考。欢迎在 [**这里**](https://github.com/actions-cool/issues-helper/issues/6) 留言。
|
|
||||||
|
|
||||||
同时,如果你在使用过程中有什么疑问,也可以在 issue 或者 discussion 中进行提问和查询。
|
|
||||||
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<td align="center">
|
|
||||||
<a href="https://github.com/ant-design/ant-design">
|
|
||||||
<img src="https://avatars1.githubusercontent.com/u/12101536?s=200&v=4" width="46" />
|
|
||||||
</a>
|
|
||||||
<br/>
|
|
||||||
<strong>ant-design</strong>
|
|
||||||
</td>
|
|
||||||
<td align="center">
|
|
||||||
<a href="https://github.com/vueComponent/ant-design-vue">
|
|
||||||
<img src="https://avatars2.githubusercontent.com/u/32120805?s=200&v=4" width="46" />
|
|
||||||
</a>
|
|
||||||
<br/>
|
|
||||||
<strong>ant-design-vue</strong>
|
|
||||||
</td>
|
|
||||||
<td align="center">
|
|
||||||
<a href="https://github.com/AttoJS/vue-request">
|
|
||||||
<img src="https://raw.githubusercontent.com/AttoJS/art/master/vue-request-logo.png" width="46" />
|
|
||||||
</a>
|
|
||||||
<br/>
|
|
||||||
<strong>vue-request</strong>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
## LICENSE
|
|
||||||
|
|
||||||
[MIT](https://github.com/actions-cool/issues-helper/blob/main/LICENSE)
|
|
47
USERS.js
Normal file
47
USERS.js
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
// **************************************************************************
|
||||||
|
// Add to end
|
||||||
|
const users = [
|
||||||
|
{
|
||||||
|
url: 'https://github.com/ant-design/ant-design',
|
||||||
|
logo: 'https://avatars1.githubusercontent.com/u/12101536?s=200&v=4'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: 'https://github.com/vueComponent/ant-design-vue',
|
||||||
|
logo: 'https://avatars1.githubusercontent.com/u/32120805?s=200&v=4'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: 'https://github.com/umijs/dumi',
|
||||||
|
logo: 'https://avatars1.githubusercontent.com/u/33895495?s=200&v=4'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: 'https://github.com/umijs/umi',
|
||||||
|
logo: 'https://avatars1.githubusercontent.com/u/33895495?s=200&v=4'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: 'https://github.com/AttoJS/vue-request',
|
||||||
|
logo: 'https://raw.githubusercontent.com/AttoJS/art/master/vue-request-logo.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: 'https://github.com/mui-org/material-ui',
|
||||||
|
logo: 'https://avatars2.githubusercontent.com/u/33663932?s=200&v=4'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: 'https://github.com/lijinke666/react-music-player',
|
||||||
|
logo: 'https://github.com/lijinke666/react-music-player/blob/master/assetsImg/logo.png?raw=true'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: 'https://github.com/ant-design-blazor/ant-design-blazor',
|
||||||
|
logo: 'https://raw.githubusercontent.com/ant-design-blazor/ant-design-blazor/7dbee63648e088c73c47eada79c897bc39fc3c26/logo.svg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: 'https://github.com/zoo-js/zoo',
|
||||||
|
logo: 'https://avatars1.githubusercontent.com/u/70757173?s=200&v=4'
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
module.exports = {
|
||||||
|
users
|
||||||
|
};
|
||||||
|
|
||||||
|
// **************************************************************************
|
18
action.yml
18
action.yml
@@ -1,5 +1,5 @@
|
|||||||
name: 'Issues Helper'
|
name: 'Issues Helper'
|
||||||
description: 'A GitHub Action to help you manage issues'
|
description: 'A GitHub Action that easily helps you automatically manage issues'
|
||||||
author: 'xrkffgg'
|
author: 'xrkffgg'
|
||||||
branding:
|
branding:
|
||||||
icon: 'message-square'
|
icon: 'message-square'
|
||||||
@@ -20,6 +20,8 @@ inputs:
|
|||||||
description: 'Issue title'
|
description: 'Issue title'
|
||||||
assignees:
|
assignees:
|
||||||
description: 'Issue assignees'
|
description: 'Issue assignees'
|
||||||
|
random-to:
|
||||||
|
description: 'Issue assignees random to'
|
||||||
labels:
|
labels:
|
||||||
description: 'Issue labels'
|
description: 'Issue labels'
|
||||||
state:
|
state:
|
||||||
@@ -44,12 +46,26 @@ inputs:
|
|||||||
description: 'Query use'
|
description: 'Query use'
|
||||||
issue-mentioned:
|
issue-mentioned:
|
||||||
description: 'Query use'
|
description: 'Query use'
|
||||||
|
issue-contents:
|
||||||
|
description: 'For welcome'
|
||||||
issue-state:
|
issue-state:
|
||||||
description: 'Query use'
|
description: 'Query use'
|
||||||
inactive-day:
|
inactive-day:
|
||||||
description: 'Query use'
|
description: 'Query use'
|
||||||
inactive-label:
|
inactive-label:
|
||||||
description: 'Issue label set use'
|
description: 'Issue label set use'
|
||||||
|
duplicate-command:
|
||||||
|
description: 'For mark-duplicate'
|
||||||
|
duplicate-labels:
|
||||||
|
description: 'For mark-duplicate add labels'
|
||||||
|
remove-labels:
|
||||||
|
description: 'For remove labels'
|
||||||
|
close-issue:
|
||||||
|
description: 'For mark-duplicate'
|
||||||
|
count-lables:
|
||||||
|
description: 'For month-statistics'
|
||||||
|
count-comments:
|
||||||
|
description: 'For month-statistics'
|
||||||
outputs:
|
outputs:
|
||||||
issue-number:
|
issue-number:
|
||||||
description: 'Create Issue Number'
|
description: 'Create Issue Number'
|
||||||
|
41
changelog.md
41
changelog.md
@@ -1,41 +0,0 @@
|
|||||||
# ✨ Changelog
|
|
||||||
|
|
||||||
## Version rules
|
|
||||||
|
|
||||||
- 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
|
|
||||||
|
|
||||||
## 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
|
|
||||||
|
|
||||||
- It also supports the direct use of branch versions. Such as:
|
|
||||||
|
|
||||||
```yml
|
|
||||||
- name: Issues Helper
|
|
||||||
uses: actions-cool/issues-helper@main
|
|
||||||
```
|
|
||||||
|
|
||||||
## Change Log
|
|
||||||
|
|
||||||
### v1.2
|
|
||||||
|
|
||||||
`2020.12.25`
|
|
||||||
|
|
||||||
- feat: add check-issue & remove labels. [#12](https://github.com/actions-cool/issues-helper/pull/12)
|
|
||||||
|
|
||||||
### v1.1
|
|
||||||
|
|
||||||
`2020.12.24`
|
|
||||||
|
|
||||||
- fix: yml not support array. [#11](https://github.com/actions-cool/issues-helper/pull/11)
|
|
||||||
|
|
||||||
### v1
|
|
||||||
|
|
||||||
`2020.12.23`
|
|
||||||
|
|
||||||
🎉 First release.
|
|
@@ -1,41 +0,0 @@
|
|||||||
# ✨ 更新日志
|
|
||||||
|
|
||||||
## 版本规则
|
|
||||||
|
|
||||||
- 采用两级语义化版本,如v1、v1.1、v2、v2.1
|
|
||||||
- v1 表示初始版本
|
|
||||||
- 对 v1 版本的修复和新增会发布到 v1.1 版本
|
|
||||||
- 当发布的 v1.x 运行一定时间稳定后,发布进阶 v2 版本
|
|
||||||
|
|
||||||
## 版本选择
|
|
||||||
|
|
||||||
- 建议采用最新 releases 版本。可在 [releases](https://github.com/actions-cool/issues-helper/releases) 看到
|
|
||||||
|
|
||||||
- 同时也可参照下面的更新日志来选择版本
|
|
||||||
|
|
||||||
- 也支持直接使用分支版本。如:
|
|
||||||
|
|
||||||
```yml
|
|
||||||
- name: Issues Helper
|
|
||||||
uses: actions-cool/issues-helper@main
|
|
||||||
```
|
|
||||||
|
|
||||||
## 更新日志
|
|
||||||
|
|
||||||
### v1.2
|
|
||||||
|
|
||||||
`2020.12.25`
|
|
||||||
|
|
||||||
- feat: add check-issue & remove labels. [#12](https://github.com/actions-cool/issues-helper/pull/12)
|
|
||||||
|
|
||||||
### v1.1
|
|
||||||
|
|
||||||
`2020.12.24`
|
|
||||||
|
|
||||||
- fix: yml not support array. [#11](https://github.com/actions-cool/issues-helper/pull/11)
|
|
||||||
|
|
||||||
### v1
|
|
||||||
|
|
||||||
`2020.12.23`
|
|
||||||
|
|
||||||
🎉 First release.
|
|
2264
dist/index.js
vendored
2264
dist/index.js
vendored
File diff suppressed because it is too large
Load Diff
257
docs/advanced.en-US.md
Normal file
257
docs/advanced.en-US.md
Normal file
@@ -0,0 +1,257 @@
|
|||||||
|
---
|
||||||
|
toc: menu
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🌟 Advanced
|
||||||
|
|
||||||
|
Advanced usage is not recommended to use multiple actions at the same time.
|
||||||
|
|
||||||
|
## `check-inactive`
|
||||||
|
|
||||||
|
At UTC 0 on the 1st of each month, add the `inactive` tag to all issues that have not been active for more than 30 days.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Check inactive
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 0 1 * *"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check-inactive:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: check-inactive
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'check-inactive'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
inactive-day: 30
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| body | When operating an issue, you can comment. Do not comment when not typing | string | ✖ |
|
||||||
|
| contents | Add [reaction](/en-US/guide/ref#-reactions-type) for this comment | string | ✖ |
|
||||||
|
| labels | Labels filtering | string | ✖ |
|
||||||
|
| issue-state | State filtering | string | ✖ |
|
||||||
|
| issue-assignee | Assignee filtering | string | ✖ |
|
||||||
|
| issue-creator | Creator filtering | string | ✖ |
|
||||||
|
| issue-mentioned | Mentioned filtering | string | ✖ |
|
||||||
|
| body-includes | Body filtering | string | ✖ |
|
||||||
|
| title-includes | Title filtering | string | ✖ |
|
||||||
|
| inactive-day | Inactive days filtering | number | ✖ |
|
||||||
|
| inactive-label | The label name adding | 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`
|
||||||
|
- `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
|
||||||
|
- `inactive-day`: When entering, it will filter the issue update time earlier than the current time minus the number of inactive days. If not entered, all
|
||||||
|
- `inactive-label`: The default is `inactive`, others can be customized. When the project does not contain the label, it will be created automatically
|
||||||
|
|
||||||
|
## `check-issue`
|
||||||
|
|
||||||
|
Check whether the issue meets the conditions according to the passed parameters and `issue-number`, and return a boolean value.
|
||||||
|
|
||||||
|
The effect of the following example is: when an issue is newly opened, verify whether the current issue designator contains `x1` or `x2`.
|
||||||
|
|
||||||
|
If one designated person is satisfied, the verification will pass, and at the same time, verify whether the title meets the conditions.
|
||||||
|
|
||||||
|
[Check rules](/en-US/guide/ref#-includes-check-rules)
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Check Issue
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [edited]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check-issue:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: check-issue
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'check-issue'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
assignee-includes: 'x1,x2'
|
||||||
|
title-includes: 'x1,x2/y1,y2'
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| issue-number | The number of issue | number | ✔ |
|
||||||
|
| assignee-includes | Assignees contains check | string | ✖ |
|
||||||
|
| title-includes | Title contains check | 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
|
||||||
|
- Return `check-result`, due to yml reasons, the judgment condition is `if: steps.xxid.outputs.check-result =='true'`
|
||||||
|
|
||||||
|
## `close-issues`
|
||||||
|
|
||||||
|
Every 7 days at UTC 0, close the issues that have been filled with the `need info` label and have not been active for more than 7 days.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Check need info
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 0 */7 * *"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check-need-info:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: close-issues
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'close-issues'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
labels: 'need info'
|
||||||
|
inactive-day: 7
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| body | When operating an issue, you can comment. Do not comment when not typing | string | ✖ |
|
||||||
|
| contents | Add [reaction](/en-US/guide/ref#-reactions-type) for this comment | string | ✖ |
|
||||||
|
| labels | Labels filtering | string | ✖ |
|
||||||
|
| issue-assignee | Assignee filtering | string | ✖ |
|
||||||
|
| issue-creator | Creator filtering | string | ✖ |
|
||||||
|
| issue-mentioned | Mentioned filtering | string | ✖ |
|
||||||
|
| body-includes | Body filtering | string | ✖ |
|
||||||
|
| title-includes | Title filtering | string | ✖ |
|
||||||
|
| inactive-day | Inactive days filtering | number | ✖ |
|
||||||
|
|
||||||
|
- `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
|
||||||
|
- `inactive-day`: When entering, it will filter the issue update time earlier than the current time minus the number of inactive days. If not entered, all
|
||||||
|
|
||||||
|
## `find-comments`
|
||||||
|
|
||||||
|
Find the current warehouse issue No. 1, the creator is k and the content contains the comment list of `this`.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
- name: Find comments
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'find-comments'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: 1
|
||||||
|
comment-auth: 'k'
|
||||||
|
body-includes: 'this'
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| issue-number | The number of issue | 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 | ✖ |
|
||||||
|
|
||||||
|
- Return `comments` in the following format:
|
||||||
|
|
||||||
|
```js
|
||||||
|
[
|
||||||
|
{id: 1, auth: 'x', body: 'xxx', created: '', updated: ''},
|
||||||
|
{id: 2, auth: 'x', body: 'xxx', created: '', updated: ''},
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
- `direction` defaults to ascending order, only when `desc` is set, descending order will be returned
|
||||||
|
- The `created` `updated` in the returned array, determined by the environment, will be UTC +0
|
||||||
|
|
||||||
|
## `lock-issues`
|
||||||
|
|
||||||
|
Every 3 months at UTC 0 on the 1st, lock all issues that have been filled with the `inactive` label and have not been active for more than 128 days.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Lock inactive issues
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 0 1 */3 *"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lock-issues:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: lock-issues
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'lock-issues'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
labels: 'inactive'
|
||||||
|
inactive-day: 128
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| body | When operating an issue, you can comment. Do not comment when not typing | string | ✖ |
|
||||||
|
| contents | Add [reaction](/en-US/guide/ref#-reactions-type) for this comment | string | ✖ |
|
||||||
|
| labels | Labels filtering | string | ✖ |
|
||||||
|
| issue-state | State filtering | string | ✖ |
|
||||||
|
| issue-assignee | Assignee filtering | string | ✖ |
|
||||||
|
| issue-creator | Creator filtering | string | ✖ |
|
||||||
|
| issue-mentioned | Mentioned filtering | string | ✖ |
|
||||||
|
| body-includes | Body filtering | string | ✖ |
|
||||||
|
| title-includes | Title filtering | string | ✖ |
|
||||||
|
| inactive-day | Inactive days filtering | number | ✖ |
|
||||||
|
|
||||||
|
- `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`
|
||||||
|
- `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
|
||||||
|
- `inactive-day`: When entering, it will filter the issue update time earlier than the current time minus the number of inactive days. If not entered, all
|
||||||
|
|
||||||
|
## `month-statistics`
|
||||||
|
|
||||||
|
At 1 o'clock on the 1st of each month, an issue is generated for the statistics of the previous month.
|
||||||
|
|
||||||
|
```
|
||||||
|
name: Issue Month Statistics
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 1 1 * *"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
month-statistics:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: month-statistics
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'month-statistics'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
count-lables: 'true'
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| labels | The labels for the new issue | string | ✖ |
|
||||||
|
| assignees | The assignees for the new issue | string | ✖ |
|
||||||
|
| count-lables | Whether the new issue count labels | string | ✖ |
|
||||||
|
| count-comments | Whether the new issue count comments | string | ✖ |
|
||||||
|
|
||||||
|
- The new issue title defaults to `[Current repo] Month Statistics: Year-Month`
|
||||||
|
- `count-lables`: You can set `'true'` to add labels statistics
|
||||||
|
- `count-comments`: You can set `'true'` to add comments statistics
|
||||||
|
|
||||||
|
As follows:
|
||||||
|
|
||||||
|

|
253
docs/advanced.md
Normal file
253
docs/advanced.md
Normal file
@@ -0,0 +1,253 @@
|
|||||||
|
---
|
||||||
|
toc: menu
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🌟 进 阶
|
||||||
|
|
||||||
|
进阶用法不建议 actions 多个一次同时使用。
|
||||||
|
|
||||||
|
## `check-inactive`
|
||||||
|
|
||||||
|
每月 1 号 UTC 0 时,对所有 30 天以上未活跃的 issues 增加 `inactive` 标签。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Check inactive
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 0 1 * *"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check-inactive:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: check-inactive
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'check-inactive'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
inactive-day: 30
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| body | 操作 issue 时,可进行评论。不填时,不评论 | string | ✖ |
|
||||||
|
| contents | 为该评论增加 [reaction](/guide/ref#-reactions-类型) | string | ✖ |
|
||||||
|
| labels | 标签筛选 | string | ✖ |
|
||||||
|
| issue-state | 状态筛选 | string | ✖ |
|
||||||
|
| issue-assignee | 指定人筛选 | string | ✖ |
|
||||||
|
| issue-creator | 创建人筛选 | string | ✖ |
|
||||||
|
| issue-mentioned | 提及人筛选 | string | ✖ |
|
||||||
|
| body-includes | 包含内容筛选 | string | ✖ |
|
||||||
|
| title-includes | 包含标题筛选 | string | ✖ |
|
||||||
|
| inactive-day | 非活跃天数筛选 | number | ✖ |
|
||||||
|
| inactive-label | 新增标签名称 | string | ✖ |
|
||||||
|
|
||||||
|
- `labels`:为多个时,会查询同时拥有多个。不填时,会查询所有
|
||||||
|
- `issue-state`:默认为 `all`。可选值 `open` `closed`,非这 2 项时,均为 `all`
|
||||||
|
- `issue-assignee`:不支持多人。不填或输入 * 时,查询所有。输入 `none` 会查询未添加指定人的 issues
|
||||||
|
- `inactive-day`:当输入时,会筛选 issue 更新时间早于当前时间减去非活跃天数。不填时,会查询所有
|
||||||
|
- `inactive-label`:默认为 `inactive`,可自定义其他。当项目未包含该 label 时,会自动新建
|
||||||
|
|
||||||
|
## `check-issue`
|
||||||
|
|
||||||
|
根据传入的参数和 `issue-number` 来检查该 issue 是否满足条件,返回一个布尔值。
|
||||||
|
|
||||||
|
下面的例子效果是:当 issue 新开时,校验当前 issue 指定人是否包含 `x1` 或者 `x2`,满足一个指定人即可校验通过,同时校验标题是否满足条件,[校验规则](/guide/ref#-includes-校验规则)。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Check Issue
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [edited]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check-issue:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: check-issue
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'check-issue'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
assignee-includes: 'x1,x2'
|
||||||
|
title-includes: 'x1,x2/y1,y2'
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| issue-number | 指定的 issue | number | ✔ |
|
||||||
|
| assignee-includes | 是否包含指定人 | string | ✖ |
|
||||||
|
| title-includes | 标题包含校验 | string | ✖ |
|
||||||
|
| body-includes | 内容包含校验 | string | ✖ |
|
||||||
|
|
||||||
|
- `title-includes` `body-includes` 支持格式 `x1,x2` 或者 `x1,x2/y1,y2`。只支持两个层级
|
||||||
|
- 返回 `check-result`,由于 yml 原因,判断条件为 `if: steps.xxid.outputs.check-result == 'true'`
|
||||||
|
|
||||||
|
## `close-issues`
|
||||||
|
|
||||||
|
每 7 天 UTC 0 时,关闭已填加 `need info` label 且 7 天以上未活跃的 issues。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Check need info
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 0 */7 * *"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check-need-info:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: close-issues
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'close-issues'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
labels: 'need info'
|
||||||
|
inactive-day: 7
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| body | 操作 issue 时,可进行评论。不填时,不评论 | string | ✖ |
|
||||||
|
| contents | 为该评论增加 [reaction](/guide/ref#-reactions-类型) | string | ✖ |
|
||||||
|
| labels | 标签筛选 | string | ✖ |
|
||||||
|
| issue-assignee | 指定人筛选 | string | ✖ |
|
||||||
|
| issue-creator | 创建人筛选 | string | ✖ |
|
||||||
|
| issue-mentioned | 提及人筛选 | string | ✖ |
|
||||||
|
| body-includes | 包含内容筛选 | string | ✖ |
|
||||||
|
| title-includes | 包含标题筛选 | string | ✖ |
|
||||||
|
| inactive-day | 非活跃天数筛选 | number | ✖ |
|
||||||
|
|
||||||
|
- `labels`:为多个时,会查询同时拥有多个。不填时,会查询所有
|
||||||
|
- `issue-assignee`:不支持多人。不填或输入 * 时,查询所有。输入 `none` 会查询未添加指定人的 issues
|
||||||
|
- `inactive-day`:当输入时,会筛选 issue 更新时间早于当前时间减去非活跃天数。不填时,会查询所有
|
||||||
|
|
||||||
|
## `find-comments`
|
||||||
|
|
||||||
|
查找当前仓库 1 号 issue 中,创建者是 k ,内容包含 `this` 的评论列表。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
- name: Find comments
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'find-comments'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: 1
|
||||||
|
comment-auth: 'k'
|
||||||
|
body-includes: 'this'
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| issue-number | 指定的 issue | number | ✔ |
|
||||||
|
| comment-auth | 评论创建者,不填时会查询所有 | string | ✖ |
|
||||||
|
| body-includes | 评论内容包含过滤,不填时无校验 | string | ✖ |
|
||||||
|
| direction | 返回 `comments` 排序 | string | ✖ |
|
||||||
|
|
||||||
|
- 返回 `comments`,格式如下:
|
||||||
|
|
||||||
|
```js
|
||||||
|
[
|
||||||
|
{id: 1, auth: 'x', body: 'xxx', created: '', updated: ''},
|
||||||
|
{id: 2, auth: 'x', body: 'xxx', created: '', updated: ''},
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
- `direction` 默认为升序,只有设置 `desc` 时,会返回降序
|
||||||
|
- 返回数组中 `created` `updated`,由所处环境决定,会是 UTC +0
|
||||||
|
|
||||||
|
## `lock-issues`
|
||||||
|
|
||||||
|
每 3 个月 1 号 UTC 0 时,锁定已填加 `inactive` label 且 128 天以上未活跃的所有 issues。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Lock inactive issues
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 0 1 */3 *"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lock-issues:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: lock-issues
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'lock-issues'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
labels: 'inactive'
|
||||||
|
inactive-day: 128
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| body | 操作 issue 时,可进行评论。不填时,不评论 | string | ✖ |
|
||||||
|
| contents | 为该评论增加 [reaction](/guide/ref#-reactions-类型) | string | ✖ |
|
||||||
|
| labels | 标签筛选 | string | ✖ |
|
||||||
|
| issue-state | 状态筛选 | string | ✖ |
|
||||||
|
| issue-assignee | 指定人筛选 | string | ✖ |
|
||||||
|
| issue-creator | 创建人筛选 | string | ✖ |
|
||||||
|
| issue-mentioned | 提及人筛选 | string | ✖ |
|
||||||
|
| body-includes | 包含内容筛选 | string | ✖ |
|
||||||
|
| title-includes | 包含标题筛选 | string | ✖ |
|
||||||
|
| inactive-day | 非活跃天数筛选 | number | ✖ |
|
||||||
|
|
||||||
|
- `labels`:为多个时,会查询同时拥有多个。不填时,会查询所有
|
||||||
|
- `issue-state`:默认为 `all`。可选值 `open` `closed`,非这 2 项时,均为 `all`
|
||||||
|
- `issue-assignee`:不支持多人。不填或输入 * 时,查询所有。输入 `none` 会查询未添加指定人的 issues
|
||||||
|
- `inactive-day`:当输入时,会筛选 issue 更新时间早于当前时间减去非活跃天数。不填时,会查询所有
|
||||||
|
|
||||||
|
## `month-statistics`
|
||||||
|
|
||||||
|
每月 1 号 1 时,生成一个 issue 上月统计。
|
||||||
|
|
||||||
|
```
|
||||||
|
name: Issue Month Statistics
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 1 1 * *"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
month-statistics:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: month-statistics
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'month-statistics'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
count-lables: 'true'
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| labels | 为新增 issue 添加 labels | string | ✖ |
|
||||||
|
| assignees | 为新增 issue 添加 assignees | string | ✖ |
|
||||||
|
| count-lables | 新增 issue 是否统计 labels | string | ✖ |
|
||||||
|
| count-comments | 新增 issue 是否统计 comments | string | ✖ |
|
||||||
|
|
||||||
|
- 新增 `issue` 的标题默认为 `[当前仓库] Month Statistics: 年-月`
|
||||||
|
- `count-lables`:可设置 `'true'`,增加 labels 统计
|
||||||
|
- `count-comments`:可设置 `'true'`,增加 comments 统计
|
||||||
|
|
||||||
|
如下所示:
|
||||||
|
|
||||||
|

|
492
docs/base.en-US.md
Normal file
492
docs/base.en-US.md
Normal file
@@ -0,0 +1,492 @@
|
|||||||
|
---
|
||||||
|
toc: menu
|
||||||
|
---
|
||||||
|
|
||||||
|
# ⭐ Base
|
||||||
|
|
||||||
|
In order to better display the function, the following is an example of the actual scene, please refer to it flexibly.
|
||||||
|
|
||||||
|
## `add-assignees`
|
||||||
|
|
||||||
|
When an issue is added or modified, assign this issue to one or more people.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Add Assigness
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [opened, edited]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
add-assigness:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Add assigness
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'add-assignees'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
assignees: 'xxx' or 'xx1,xx2'
|
||||||
|
random-to: 1
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| issue-number | The number of issue | 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 | ✖ |
|
||||||
|
|
||||||
|
- `actions` support multiple and separated by comma. Like: `add-assignees,add-labels`
|
||||||
|
- The `name` can be modified according to the actual situation
|
||||||
|
- [Reference to on](/en-US/guide/ref#-github-docs)
|
||||||
|
- `${{ github.event.issue.number }}` is the current issue. [More references](https://docs.github.com/en/free-pro-team@latest/developers/webhooks-and-events)
|
||||||
|
- `assignees` support multiple and separated by comma
|
||||||
|
|
||||||
|
## `add-labels`
|
||||||
|
|
||||||
|
When the content of a new issue does not contain the specified format, add labels for the issue.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Add Labels
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [opened]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
add-labels:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: contains(github.event.issue.body, 'xxx') == false
|
||||||
|
steps:
|
||||||
|
- name: Add labels
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'add-labels'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
labels: 'bug' or 'xx1,xx2'
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| issue-number | The number of issue | 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
|
||||||
|
|
||||||
|
## `close-issue`
|
||||||
|
|
||||||
|
Close the specified issue.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
- name: Close issue
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
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 | ✔ |
|
||||||
|
|
||||||
|
## `create-comment`
|
||||||
|
|
||||||
|
When a designated label is added, comment on the issue.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Create Comment
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [labeled]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
create-comment:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.event.label.name == 'xxx'
|
||||||
|
steps:
|
||||||
|
- name: Create comment
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'create-comment'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
body: |
|
||||||
|
Hello @${{ github.event.issue.user.login }}. Add some comments.
|
||||||
|
|
||||||
|
你好 @${{ github.event.issue.user.login }}。巴拉巴拉。
|
||||||
|
contents: '+1' or '+1,heart'
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| issue-number | The number of issue | number | ✔ |
|
||||||
|
| body | Add comment content | string | ✖ |
|
||||||
|
| contents | Add [reaction](/en-US/guide/ref#-reactions-type) | string | ✖ |
|
||||||
|
|
||||||
|
- `body` default is `Currently at ${owner}/${repo}. And this is default comment.`
|
||||||
|
- Where `${owner}/${repo}` means the current repo
|
||||||
|
- Return `comment-id`, which can be used for subsequent operations. [Usage reference](/en-US/guide/ref#-outputs-use)
|
||||||
|
- `${{ github.event.issue.user.login }}` indicates the creator of the issue
|
||||||
|
- `contents` support multiple and separated by comma
|
||||||
|
|
||||||
|
## `create-issue`
|
||||||
|
|
||||||
|
Here is an example, add an issue at UTC 00:00 on the 1st of every month.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Create Issue
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 0 1 * *"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
create-issue:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Create issue
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'create-issue'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
title: 'xxxx'
|
||||||
|
body: 'xxxx'
|
||||||
|
labels: 'xx'
|
||||||
|
assignees: 'xxx'
|
||||||
|
contents: '+1'
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| title | The title of the new issue | string | ✖ |
|
||||||
|
| body | The body of the new issue | string | ✖ |
|
||||||
|
| labels | The labels for the new issue | string | ✖ |
|
||||||
|
| assignees | The assignees for the new issue | string | ✖ |
|
||||||
|
| random-to | When set, it will be randomly selected in assignees | number | ✖ |
|
||||||
|
| contents | Add [reaction](/en-US/guide/ref#-reactions-type) | string | ✖ |
|
||||||
|
|
||||||
|
- `title` default is `Default Title`
|
||||||
|
- Return `issue-number`. [Usage reference](/en-US/guide/ref#-outputs-use)
|
||||||
|
|
||||||
|
## `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.11
|
||||||
|
with:
|
||||||
|
actions: 'delete-comment'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
comment-id: xxx
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| comment-id | The comment ID | number | ✔ |
|
||||||
|
|
||||||
|
## `lock-issue`
|
||||||
|
|
||||||
|
When the `invalid` label is added, the issue is locked.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Lock Issue
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [labeled]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lock-issue:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.event.label.name == 'invalid'
|
||||||
|
steps:
|
||||||
|
- name: Lock issue
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'lock-issue'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| issue-number | The number of issue | number | ✔ |
|
||||||
|
|
||||||
|
## `mark-duplicate`
|
||||||
|
|
||||||
|
Quickly mark duplicate questions, only for issue new comments or edit comments.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Issue Mark Duplicate
|
||||||
|
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created, edited]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
mark-duplicate:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: mark-duplicate
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'mark-duplicate'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| duplicate-command | Simple commands can be set, such as: `/d` | string | ✖ |
|
||||||
|
| duplicate-labels | Add additional labels to this issue | string | ✖ |
|
||||||
|
| remove-labels | Set removable labels | string | ✖ |
|
||||||
|
| 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 | ✖ |
|
||||||
|
|
||||||
|
- `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
|
||||||
|
|
||||||
|
<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.
|
||||||
|
</Alert>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## `open-issue`
|
||||||
|
|
||||||
|
Open the specified issue.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
- name: Open issue
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'open-issue'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: xxx
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| issue-number | The number of issue | number | ✔ |
|
||||||
|
|
||||||
|
## `remove-assignees`
|
||||||
|
|
||||||
|
Remove the person designated by issue.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
- name: Remove assignees
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'remove-assignees'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
assignees: 'xx'
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| issue-number | The number of issue | number | ✔ |
|
||||||
|
| assignees | Designated person removed. When it is an empty character, do not remove | string | ✔ |
|
||||||
|
|
||||||
|
## `remove-labels`
|
||||||
|
|
||||||
|
Remove the specified labels.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
- name: Remove labels
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'remove-labels'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
labels: 'xx'
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| issue-number | The number of issue | 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
|
||||||
|
|
||||||
|
## `set-labels`
|
||||||
|
|
||||||
|
Replace the labels of issue.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
- name: Set labels
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'set-labels'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
labels: 'xx'
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| issue-number | The number of issue | number | ✔ |
|
||||||
|
| labels | labels set. When empty characters, will remove all | string | ✔ |
|
||||||
|
|
||||||
|
## `unlock-issue`
|
||||||
|
|
||||||
|
Unlock the specified issue.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
- name: Unlock issue
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'unlock-issue'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| issue-number | The number of issue | number | ✔ |
|
||||||
|
|
||||||
|
## `update-comment`
|
||||||
|
|
||||||
|
Update the specified comment according to [`comment-id`](/en-US/guide/ref#-comment-id).
|
||||||
|
|
||||||
|
The following example shows that 👀 is added for each new comment.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Add eyes to each comment
|
||||||
|
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update-comment:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Update comment
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'update-comment'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
comment-id: ${{ github.event.comment.id }}
|
||||||
|
contents: 'eyes'
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| comment-id | The comment ID | number | ✔ |
|
||||||
|
| 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`
|
||||||
|
|
||||||
|
## `update-issue`
|
||||||
|
|
||||||
|
Update the specified issue according to the `issue-number`.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
- name: Update issue
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'update-issue'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
state: 'open'
|
||||||
|
title: 'xxx'
|
||||||
|
body: 'xxxx'
|
||||||
|
update-mode: 'replace'
|
||||||
|
labels: 'xx'
|
||||||
|
assignees: 'xxx'
|
||||||
|
contents: '+1'
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| issue-number | The number of issue | 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 | ✖ |
|
||||||
|
| update-mode | Update mode. Default `replace`, another `append` | string | ✖ |
|
||||||
|
| labels | Replace the labels of issue | string | ✖ |
|
||||||
|
| assignees | Replace the assignees of issue | string | ✖ |
|
||||||
|
| contents | Add [reaction](/en-US/guide/ref#-reactions-type) | string | ✖ |
|
||||||
|
|
||||||
|
- `state` defaults to `open`
|
||||||
|
- When the option is not filled, it will keep the original
|
||||||
|
|
||||||
|
## `welcome`
|
||||||
|
|
||||||
|
When an issue is created, the user who created the issue for the first time is welcome.
|
||||||
|
|
||||||
|
If the user is not creating for the first time, there is no operation.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Issue Welcome
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [opened]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
issue-welcome:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: welcome
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'welcome'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
body: hi @${{ github.event.issue.user.login }}, welcome!
|
||||||
|
labels: 'welcome1, welcome2'
|
||||||
|
assignees: 'xx1'
|
||||||
|
issue-contents: '+1, -1, eyes'
|
||||||
|
```
|
||||||
|
|
||||||
|
| Param | Desc | Type | Required |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | Action type | string | ✔ |
|
||||||
|
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||||
|
| body | Comment on the welcome content, no comment if you leave it blank | string | ✖ |
|
||||||
|
| labels | Add labels to this issue | string | ✖ |
|
||||||
|
| assignees | Add assignees to this issue | string | ✖ |
|
||||||
|
| issue-contents | Add [reaction](/en-US/guide/ref#-reactions-type) to this issue| string | ✖ |
|
||||||
|
|
||||||
|
- If these 4 options are not filled, no operation
|
491
docs/base.md
Normal file
491
docs/base.md
Normal file
@@ -0,0 +1,491 @@
|
|||||||
|
---
|
||||||
|
toc: menu
|
||||||
|
---
|
||||||
|
|
||||||
|
为了更好的展示功能,下面以实际场景举例,请灵活参考。
|
||||||
|
|
||||||
|
# ⭐ 基 础
|
||||||
|
|
||||||
|
## `add-assignees`
|
||||||
|
|
||||||
|
当一个 issue 新增或修改时,将这个 issue 指定某人或多人。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Add Assigness
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [opened, edited]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
add-assigness:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Add assigness
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'add-assignees'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
assignees: 'xxx' or 'xx1,xx2'
|
||||||
|
random-to: 1
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| issue-number | 指定的 issue | number | ✔ |
|
||||||
|
| assignees | 指定人。当不填或者为空字符时,不操作 | string | ✖ |
|
||||||
|
| random-to | 当设置时,会在 assignees 中随机选择 | number | ✖ |
|
||||||
|
|
||||||
|
- `actions` 支持多个,需用逗号隔开。如:`add-assignees,add-labels`
|
||||||
|
- 其中的 `name` 可根据自行根据实际情况修改
|
||||||
|
- [on 参考](/guide/ref#-github-相关文档)
|
||||||
|
- `${{ github.event.issue.number }}` 表示当前 issue,[更多参考](https://docs.github.com/en/free-pro-team@latest/developers/webhooks-and-events)
|
||||||
|
- `assignees` 支持多个,需用逗号隔开
|
||||||
|
|
||||||
|
## `add-labels`
|
||||||
|
|
||||||
|
当一个新增的 issue 内容不包含指定格式时,为这个 issue 添加 labels。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Add Labels
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [opened]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
add-labels:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: contains(github.event.issue.body, 'xxx') == false
|
||||||
|
steps:
|
||||||
|
- name: Add labels
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'add-labels'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
labels: 'bug' or 'bug1,bug2'
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| issue-number | 指定的 issue | number | ✔ |
|
||||||
|
| labels | 新增的 labels。当不填或者为空字符时,不新增 | string | ✖ |
|
||||||
|
|
||||||
|
- `labels` 支持多个,需用逗号隔开
|
||||||
|
|
||||||
|
## `close-issue`
|
||||||
|
|
||||||
|
关闭指定 issue。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
- name: Close issue
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
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 | ✔ |
|
||||||
|
|
||||||
|
## `create-comment`
|
||||||
|
|
||||||
|
当新增一个指定 label 时,对该 issue 进行评论。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Create Comment
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [labeled]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
create-comment:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.event.label.name == 'xxx'
|
||||||
|
steps:
|
||||||
|
- name: Create comment
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'create-comment'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
body: |
|
||||||
|
Hello ${{ github.event.issue.user.login }}. Add some comments.
|
||||||
|
|
||||||
|
你好 ${{ github.event.issue.user.login }}。巴拉巴拉。
|
||||||
|
contents: '+1' or '+1,heart'
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| issue-number | 指定的 issue | number | ✔ |
|
||||||
|
| body | 新增评论的内容 | string | ✖ |
|
||||||
|
| contents | 为新增评论的增加 [reaction](/guide/ref#-reactions-类型) | string | ✖ |
|
||||||
|
|
||||||
|
- `body` 默认为:`Currently at ${owner}/${repo}. And this is default comment.`
|
||||||
|
- 其中 `${owner}/${repo}` 表示当前仓库
|
||||||
|
- 返回 `comment-id`,可用于之后操作。[用法参考](/guide/ref#-outputs-使用)
|
||||||
|
- `${{ github.event.issue.user.login }}` 表示该 issue 的创建者
|
||||||
|
- `contents` 支持多个,需用逗号隔开
|
||||||
|
|
||||||
|
## `create-issue`
|
||||||
|
|
||||||
|
感觉新增 issue 使用场景不多。这里举例,每月 1 号 UTC 00:00 新增一个 issue。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Create Issue
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 0 1 * *"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
create-issue:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Create issue
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'create-issue'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
title: 'xxxx'
|
||||||
|
body: 'xxxx'
|
||||||
|
labels: 'xx'
|
||||||
|
assignees: 'xxx'
|
||||||
|
contents: '+1'
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| title | 新增 issue 的标题 | string | ✖ |
|
||||||
|
| body | 新增 issue 的内容 | string | ✖ |
|
||||||
|
| labels | 为新增 issue 添加 labels | string | ✖ |
|
||||||
|
| assignees | 为新增 issue 添加 assignees | string | ✖ |
|
||||||
|
| random-to | 当设置时,会在 assignees 中随机选择 | number | ✖ |
|
||||||
|
| contents | 为新增 issue 增加 [reaction](/guide/ref#-reactions-类型) | string | ✖ |
|
||||||
|
|
||||||
|
- `title` 默认为:`Default Title`
|
||||||
|
- 返回 `issue-number`,[用法参考](/guide/ref#-outputs-使用)
|
||||||
|
|
||||||
|
## `delete-comment`
|
||||||
|
|
||||||
|
根据 [`comment-id`](/guide/ref#-comment-id) 删除指定评论。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
- name: Delete comment
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'delete-comment'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
comment-id: xxx
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| comment-id | 指定的 comment | number | ✔ |
|
||||||
|
|
||||||
|
## `lock-issue`
|
||||||
|
|
||||||
|
当新增 `invalid` label 时,对该 issue 进行锁定。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Lock Issue
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [labeled]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lock-issue:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.event.label.name == 'invalid'
|
||||||
|
steps:
|
||||||
|
- name: Lock issue
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'lock-issue'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| issue-number | 指定的 issue | number | ✔ |
|
||||||
|
|
||||||
|
## `mark-duplicate`
|
||||||
|
|
||||||
|
快捷标记重复问题,仅作用于 issue 新增编辑评论。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Issue Mark Duplicate
|
||||||
|
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created, edited]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
mark-duplicate:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: mark-duplicate
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'mark-duplicate'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| duplicate-command | 可设置简洁命令,如:`/d` | string | ✖ |
|
||||||
|
| duplicate-labels | 为该 issue 额外增加 labels | string | ✖ |
|
||||||
|
| remove-labels | 设置可移除的 labels | string | ✖ |
|
||||||
|
| labels | 替换该 issue 的 labels | string | ✖ |
|
||||||
|
| contents | 为该评论的增加 [reaction](/guide/ref#-reactions-类型) | string | ✖ |
|
||||||
|
| close-issue | 是否同时关闭该 issue | string | ✖ |
|
||||||
|
|
||||||
|
- `duplicate-command`:当设置简洁命令时,同时仍支持原有 `Duplicate of`。屏蔽内容包含 `?`
|
||||||
|
- `labels`:优先级最高
|
||||||
|
- `close-issue`:`true` 或 `'true'` 均可生效
|
||||||
|
|
||||||
|
<Alert>
|
||||||
|
注意:使用简洁命令创建的 Duplicate 不显示下图红框内容。但其实这个没有任何影响的。
|
||||||
|
</Alert>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## `open-issue`
|
||||||
|
|
||||||
|
打开指定 issue。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
- name: Open issue
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'open-issue'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: xxx
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| issue-number | 指定的 issue | number | ✔ |
|
||||||
|
|
||||||
|
## `remove-assignees`
|
||||||
|
|
||||||
|
移除 issue 指定人员。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
- name: Remove assignees
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'remove-assignees'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
assignees: 'xx'
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| issue-number | 指定的 issue | number | ✔ |
|
||||||
|
| assignees | 移除的指定人。当为空字符时,不进行移除 | string | ✔ |
|
||||||
|
|
||||||
|
## `remove-labels`
|
||||||
|
|
||||||
|
移除指定 labels。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
- name: Remove labels
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'remove-labels'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
labels: 'xx'
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| issue-number | 指定的 issue | number | ✔ |
|
||||||
|
| labels | 移除的 labels。当为空字符时,不进行移除 | string | ✔ |
|
||||||
|
|
||||||
|
- `labels` 支持多个,如 `x1,x2,x3`,只会移除 issue 已添加的 labels
|
||||||
|
|
||||||
|
## `set-labels`
|
||||||
|
|
||||||
|
替换 issue 的 labels。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
- name: Set labels
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'set-labels'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
labels: 'xx'
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| issue-number | 指定的 issue | number | ✔ |
|
||||||
|
| labels | labels 设置。当空字符时,会移除所有 | string | ✔ |
|
||||||
|
|
||||||
|
## `unlock-issue`
|
||||||
|
|
||||||
|
解锁指定 issue。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
- name: Unlock issue
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'unlock-issue'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| issue-number | 指定的 issue | number | ✔ |
|
||||||
|
|
||||||
|
## `update-comment`
|
||||||
|
|
||||||
|
根据 [`comment-id`](/guide/ref#-comment-id) 更新指定评论。
|
||||||
|
|
||||||
|
下面的例子展示的是,为每个新增的 comment 增加 👀 。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Add eyes to each comment
|
||||||
|
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update-comment:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Update comment
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'update-comment'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
comment-id: ${{ github.event.comment.id }}
|
||||||
|
contents: 'eyes'
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| comment-id | 指定的 comment | number | ✔ |
|
||||||
|
| body | 更新 comment 的内容 | string | ✖ |
|
||||||
|
| update-mode | 更新模式。默认 `replace` 替换,`append` 附加 | string | ✖ |
|
||||||
|
| contents | 增加 [reaction](/guide/ref#-reactions-类型) | string | ✖ |
|
||||||
|
|
||||||
|
- `body` 不填时,会保持原有
|
||||||
|
- `update-mode` 为 `append` 时,会进行附加操作。非 `append` 都会进行替换。仅对 `body` 生效
|
||||||
|
|
||||||
|
## `update-issue`
|
||||||
|
|
||||||
|
根据 `issue-number` 更新指定 issue。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
- name: Update issue
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'update-issue'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
state: 'open'
|
||||||
|
title: 'xxx'
|
||||||
|
body: 'xxxx'
|
||||||
|
update-mode: 'replace'
|
||||||
|
labels: 'xx'
|
||||||
|
assignees: 'xxx'
|
||||||
|
contents: '+1'
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| issue-number | 指定的 issue | number | ✔ |
|
||||||
|
| state | 修改 issue 的状态,可选值 `open` `closed` | string | ✖ |
|
||||||
|
| title | 修改 issue 的标题 | string | ✖ |
|
||||||
|
| body | 修改 issue 的内容 | string | ✖ |
|
||||||
|
| update-mode | 更新模式。默认 `replace` 替换,`append` 附加 | string | ✖ |
|
||||||
|
| labels | 替换 issue 的 labels | string | ✖ |
|
||||||
|
| assignees | 替换 issue 的 assignees | string | ✖ |
|
||||||
|
| contents | 增加 [reaction](/guide/ref#-reactions-类型) | string | ✖ |
|
||||||
|
|
||||||
|
- `state` 默认为 `open`
|
||||||
|
- 当可选项不填时,会保持原有
|
||||||
|
|
||||||
|
|
||||||
|
## `welcome`
|
||||||
|
|
||||||
|
当一个 issue 新建时,对首次新建 issue 的用户进行欢迎。若用户非首次新建,则无操作。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Issue Welcome
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [opened]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
issue-welcome:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: welcome
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'welcome'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
body: hi @${{ github.event.issue.user.login }}, welcome!
|
||||||
|
labels: 'welcome1, welcome2'
|
||||||
|
assignees: 'xx1'
|
||||||
|
issue-contents: '+1, -1, eyes'
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 描述 | 类型 | 必填 |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
| actions | 操作类型 | string | ✔ |
|
||||||
|
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||||
|
| body | 评论欢迎的内容,不填则不评论 | string | ✖ |
|
||||||
|
| labels | 为该 issue 增加 labels | string | ✖ |
|
||||||
|
| assignees | 为该 issue 增加 assignees | string | ✖ |
|
||||||
|
| issue-contents | 为该 issue 增加 [reaction](/guide/ref#-reactions-类型) | string | ✖ |
|
||||||
|
|
||||||
|
- 若这 4 个可选项都不填,则无操作
|
29
docs/changelog.en-US.md
Normal file
29
docs/changelog.en-US.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
toc: menu
|
||||||
|
---
|
||||||
|
|
||||||
|
# ✨ Changelog
|
||||||
|
|
||||||
|
- Version rules
|
||||||
|
- 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 or undergoes refactoring, release the advanced v2 version
|
||||||
|
|
||||||
|
- 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
|
||||||
|
```
|
||||||
|
|
||||||
|
<embed src="../CHANGELOG.md"></embed>
|
29
docs/changelog.md
Normal file
29
docs/changelog.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
toc: menu
|
||||||
|
---
|
||||||
|
|
||||||
|
# ✨ 更新日志
|
||||||
|
|
||||||
|
- 版本规则
|
||||||
|
- 采用两级语义化版本,如v1、v1.1、v2、v2.1
|
||||||
|
- v1 表示初始版本
|
||||||
|
- 对 v1 版本的修复和新增会发布到 v1.1 版本
|
||||||
|
- 当发布的 v1.x 运行一定时间稳定或进行重构时,发布进阶 v2 版本
|
||||||
|
|
||||||
|
- 版本选择
|
||||||
|
- 建议采用最新 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
|
||||||
|
```
|
||||||
|
|
||||||
|
<embed src="../CHANGELOG.md"></embed>
|
27
docs/guide/faq.en-US.md
Normal file
27
docs/guide/faq.en-US.md
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
toc: menu
|
||||||
|
---
|
||||||
|
|
||||||
|
## Is there a charge for this feature?
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
## 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
|
||||||
|
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?
|
||||||
|
|
||||||
|
Yes, you can directly modify `actions`. For example: `actions:'create-comment'` is changed to `actions:'#create-comment'`. It is also convenient for recovery.
|
||||||
|
|
||||||
|
## So many versions, how to choose?
|
||||||
|
|
||||||
|
You can view the detailed [changelog](/en-US/changelog). The latest releases version is recommended.
|
||||||
|
|
||||||
|
## 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).
|
27
docs/guide/faq.md
Normal file
27
docs/guide/faq.md
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
toc: menu
|
||||||
|
---
|
||||||
|
|
||||||
|
## 该功能是否收费?
|
||||||
|
|
||||||
|
GitHub Actions 是由 GitHub 免费提供的。其中 `Private` 项目每月有 2000 次的限制,[具体查看](https://github.com/settings/billing)。`Public` 项目无限制。
|
||||||
|
|
||||||
|
## 有没有现成的模板可以参考?
|
||||||
|
|
||||||
|
有的。
|
||||||
|
|
||||||
|
1. 你可以使用这个 [GitHub Actions workflow template](https://github.com/actions-cool/.github) 仓库的模板
|
||||||
|
2. 个人练习和测试 [Actions](https://github.com/xrkffgg/test-ci) 的仓库
|
||||||
|
3. 也可以来 [线上使用者](/#-谁在使用?) 的仓库参照
|
||||||
|
|
||||||
|
## 我想暂停 Actions,有没有简单的办法?
|
||||||
|
|
||||||
|
有的,你可以将直接修改 `actions`。例如:`actions: 'create-comment'` 修改为 `actions: '#create-comment'`。同时也方便恢复。
|
||||||
|
|
||||||
|
## 这么多版本,如何选择?
|
||||||
|
|
||||||
|
你可以查看详细的 [更新日志](/changelog)。推荐采用最新 releases 版本。
|
||||||
|
|
||||||
|
## 如果这里没有我想要的功能,该怎么办?
|
||||||
|
|
||||||
|
你可以在 [What do you want?](https://github.com/actions-cool/issues-helper/discussions/18) 中提出。
|
23
docs/guide/index.en-US.md
Normal file
23
docs/guide/index.en-US.md
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
## Introduction
|
||||||
|
|
||||||
|
The Issues Helper is a GitHub Action that easily helps you automatically manage issues.
|
||||||
|
|
||||||
|
### What are GitHub Actions?
|
||||||
|
|
||||||
|
Automate, customize, and execute your software development workflows right in your repository with GitHub Actions. You can discover, create, and share actions to perform any job you'd like, including CI/CD, and combine actions in a completely customized workflow. [More](https://docs.github.com/en/free-pro-team@latest/actions).
|
||||||
|
|
||||||
|
`issues-helper` is based on this, using GitHub Actions to help you deal with various operations on issues.
|
||||||
|
|
||||||
|
### ✨ Feature
|
||||||
|
|
||||||
|
- 😎 Complete free
|
||||||
|
- 🚀 Fully automatic
|
||||||
|
- 🏖 Hosted on the GitHub server, as long as GitHub is not down, it is not affected
|
||||||
|
|
||||||
|
### ⚡ 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`
|
23
docs/guide/index.md
Normal file
23
docs/guide/index.md
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
## 介 绍
|
||||||
|
|
||||||
|
Issues 助手是一个轻松帮你自动管理 issues 的 GitHub Action。
|
||||||
|
|
||||||
|
### GitHub Actions 是什么?
|
||||||
|
|
||||||
|
GitHub Actions 是由 GitHub 官方提供在存储库中自动化、自定义和执行软件开发工作流程。您可以发现,创建和共享操作以执行所需的任何工作(包括CI / CD),并在完全定制的工作流程中组合操作。[更多介绍](https://docs.github.com/en/free-pro-team@latest/actions)。
|
||||||
|
|
||||||
|
`issues-helper` 就是以此为基础,利用 GitHub Actions 来帮你处理各种关于 issue 方面的操作。
|
||||||
|
|
||||||
|
### ✨ 特性
|
||||||
|
|
||||||
|
- 😎 完全免费
|
||||||
|
- 🚀 全自动操作
|
||||||
|
- 🏖 托管于 GitHub 服务器,只要 GitHub 不宕机,它就不受影响
|
||||||
|
|
||||||
|
### ⚡ 反馈
|
||||||
|
|
||||||
|
非常欢迎你来尝试使用,并提出意见,你可以通过以下方式:
|
||||||
|
|
||||||
|
- 通过 [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` 的代码
|
44
docs/guide/note.en-US.md
Normal file
44
docs/guide/note.en-US.md
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
---
|
||||||
|
toc: menu
|
||||||
|
---
|
||||||
|
|
||||||
|
<Alert type="success">
|
||||||
|
Here are some things I summarized in my use, I hope it can help you.
|
||||||
|
</Alert>
|
||||||
|
|
||||||
|
## Include judgment in `yml`
|
||||||
|
|
||||||
|
```yml
|
||||||
|
if: contains(github.event.issue.body, 'ie') == false
|
||||||
|
```
|
||||||
|
- Triggered when the issue body does not contain `ie`
|
||||||
|
- The js `includes()` syntax is not supported in the yml
|
||||||
|
- Case is not checked, `IE` and also similar to `kiekk` can also be satisfied
|
||||||
|
|
||||||
|
[More](https://docs.github.com/en/free-pro-team@latest/actions/reference/context-and-expression-syntax-for-github-actions#functions).
|
||||||
|
|
||||||
|
## Pass value and output in `yml`
|
||||||
|
|
||||||
|
```
|
||||||
|
with:
|
||||||
|
actions: 'month-statistics'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
count-lables: 'true'
|
||||||
|
```
|
||||||
|
|
||||||
|
- `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
|
||||||
|
|
||||||
|
- `check-result`: The judgment condition is `if: steps.xxid.outputs.check-result =='true'`
|
||||||
|
|
||||||
|
## `GitHub Actions bot` trigger
|
||||||
|
|
||||||
|
When an action is set, such as adding a label `x1` to an issue, Actions will automatically add a label `x2` to the issue.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
## `assignees` scope
|
||||||
|
|
||||||
|
- The owner or collaborator of the warehouse, if there is an organization, including members
|
||||||
|
- Participants of the issue, including creators and commenters
|
45
docs/guide/note.md
Normal file
45
docs/guide/note.md
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
---
|
||||||
|
toc: menu
|
||||||
|
---
|
||||||
|
|
||||||
|
<Alert type="success">
|
||||||
|
这里记录自己在使用中总结的一些东西,希望可以帮助到你。
|
||||||
|
</Alert>
|
||||||
|
|
||||||
|
## `yml` 中包含判断
|
||||||
|
|
||||||
|
```yml
|
||||||
|
if: contains(github.event.issue.body, 'ie') == false
|
||||||
|
```
|
||||||
|
|
||||||
|
- 当 issue body 不包含 `ie` 触发
|
||||||
|
- 测试 yml 中不支持 js `includes()` 语法
|
||||||
|
- 大小写不校验,`IE` 还有同时类似 `kiekk` 也可满足
|
||||||
|
|
||||||
|
更多[查看](https://docs.github.com/en/free-pro-team@latest/actions/reference/context-and-expression-syntax-for-github-actions#functions)。
|
||||||
|
|
||||||
|
## `yml` 中传值和输出
|
||||||
|
|
||||||
|
```
|
||||||
|
with:
|
||||||
|
actions: 'month-statistics'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
count-lables: 'true'
|
||||||
|
```
|
||||||
|
|
||||||
|
- `count-lables`:不管设置 `true` 还是 `'ture'`,在程序里接收到的都是字符串格式
|
||||||
|
|
||||||
|
同时输出的也是字符串格式
|
||||||
|
|
||||||
|
- `check-result`:判断条件为 `if: steps.xxid.outputs.check-result == 'true'`
|
||||||
|
|
||||||
|
## `GitHub Actions bot` 触发
|
||||||
|
|
||||||
|
当设置了一个 Actions,如为给一个 issue 新增 label `x1` 时,Actions 自动为该 issue 增加 `x2` label。
|
||||||
|
|
||||||
|
但如果这个是由 `GitHub Actions bot` 完成的(即 actions 中 token 不传,或使用默认 `token: ${{ secrets.GITHUB_TOKEN }}`),则不会触发 label `x2` 的 Actions。
|
||||||
|
|
||||||
|
## `assignees` 范围
|
||||||
|
|
||||||
|
- 仓库的所有者或协作者,若有组织,包括成员
|
||||||
|
- issue 的参与者,包括创建者、评论者
|
83
docs/guide/ref.en-US.md
Normal file
83
docs/guide/ref.en-US.md
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
---
|
||||||
|
toc: menu
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📍 `token`
|
||||||
|
|
||||||
|
Need to have the person token with push permission.
|
||||||
|
|
||||||
|
- [Personal token application](https://github.com/settings/tokens)
|
||||||
|
- Need to check `Full control of private repositories`
|
||||||
|
- Project add secrets
|
||||||
|
- Select settings, select secrets, select `New repository secret`
|
||||||
|
- `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).
|
||||||
|
|
||||||
|
## 📍 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)
|
||||||
|
|
||||||
|
## 📍 `outputs` use
|
||||||
|
|
||||||
|
```yml
|
||||||
|
- name: Create issue
|
||||||
|
uses: actions-cool/issues-helper@v1
|
||||||
|
id: createissue
|
||||||
|
with:
|
||||||
|
actions: 'create-issue'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Check outputs
|
||||||
|
run: echo "Outputs issue_number is ${{ steps.createissue.outputs.issue-number }}"
|
||||||
|
```
|
||||||
|
|
||||||
|
[More](https://docs.github.com/en/free-pro-team@latest/actions/creating-actions/metadata-syntax-for-github-actions#outputs).
|
||||||
|
|
||||||
|
## 📍 `includes` check rules
|
||||||
|
|
||||||
|
```js
|
||||||
|
"title-includes": 'x1,x2'
|
||||||
|
|
||||||
|
x1
|
||||||
|
x2
|
||||||
|
|
||||||
|
"x1y3y2" true
|
||||||
|
"y2 x1" true
|
||||||
|
"x2" true
|
||||||
|
"x3" false
|
||||||
|
```
|
||||||
|
|
||||||
|
```js
|
||||||
|
"title-includes": 'x1,x2/y1,y2'
|
||||||
|
|
||||||
|
x1 + y1
|
||||||
|
x2 + y1
|
||||||
|
x1 + y2
|
||||||
|
x2 + y2
|
||||||
|
|
||||||
|
"x1y3y2" true
|
||||||
|
"y2 x1" true
|
||||||
|
"1x2y" false
|
||||||
|
"x1" false
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📍 `Reactions` Type
|
||||||
|
|
||||||
|
| content | emoji |
|
||||||
|
| -- | -- |
|
||||||
|
| `+1` | 👍 |
|
||||||
|
| `-1` | 👎 |
|
||||||
|
| `laugh` | 😄 |
|
||||||
|
| `confused` | 😕 |
|
||||||
|
| `heart` | ❤️ |
|
||||||
|
| `hooray` | 🎉 |
|
||||||
|
| `rocket` | 🚀 |
|
||||||
|
| `eyes` | 👀 |
|
||||||
|
|
||||||
|
For details, please [view](https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions).
|
||||||
|
|
||||||
|
## 📍 `comment-id`
|
||||||
|
|
||||||
|
Click the `···` icon in the upper right corner of a comment, select `Copy link`, and the number at the end of the url is `comment_id`.
|
83
docs/guide/ref.md
Normal file
83
docs/guide/ref.md
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
---
|
||||||
|
toc: menu
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📍 `token` 说明
|
||||||
|
|
||||||
|
需拥有 push 权限的人员 token。
|
||||||
|
|
||||||
|
- [个人 token 申请](https://github.com/settings/tokens)
|
||||||
|
- 需勾选 `Full control of private repositories`
|
||||||
|
- 项目添加 secrets
|
||||||
|
- 选择 settings,选择 secrets,选择 `New repository secret`
|
||||||
|
- `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)。
|
||||||
|
|
||||||
|
## 📍 GitHub 相关文档
|
||||||
|
|
||||||
|
- [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)
|
||||||
|
|
||||||
|
## 📍 `outputs` 使用
|
||||||
|
|
||||||
|
```yml
|
||||||
|
- name: Create issue
|
||||||
|
uses: actions-cool/issues-helper@v1
|
||||||
|
id: createissue
|
||||||
|
with:
|
||||||
|
actions: 'create-issue'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Check outputs
|
||||||
|
run: echo "Outputs issue_number is ${{ steps.createissue.outputs.issue-number }}"
|
||||||
|
```
|
||||||
|
|
||||||
|
[更多查看](https://docs.github.com/en/free-pro-team@latest/actions/creating-actions/metadata-syntax-for-github-actions#outputs)。
|
||||||
|
|
||||||
|
## 📍 `includes` 校验规则
|
||||||
|
|
||||||
|
```js
|
||||||
|
"title-includes": 'x1,x2'
|
||||||
|
|
||||||
|
x1
|
||||||
|
x2
|
||||||
|
|
||||||
|
"x1y3y2" true
|
||||||
|
"y2 x1" true
|
||||||
|
"x2" true
|
||||||
|
"x3" false
|
||||||
|
```
|
||||||
|
|
||||||
|
```js
|
||||||
|
"title-includes": 'x1,x2/y1,y2'
|
||||||
|
|
||||||
|
x1 + y1
|
||||||
|
x2 + y1
|
||||||
|
x1 + y2
|
||||||
|
x2 + y2
|
||||||
|
|
||||||
|
"x1y3y2" true
|
||||||
|
"y2 x1" true
|
||||||
|
"1x2y" false
|
||||||
|
"x1" false
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📍 `Reactions` 类型
|
||||||
|
|
||||||
|
| content | emoji |
|
||||||
|
| -- | -- |
|
||||||
|
| `+1` | 👍 |
|
||||||
|
| `-1` | 👎 |
|
||||||
|
| `laugh` | 😄 |
|
||||||
|
| `confused` | 😕 |
|
||||||
|
| `heart` | ❤️ |
|
||||||
|
| `hooray` | 🎉 |
|
||||||
|
| `rocket` | 🚀 |
|
||||||
|
| `eyes` | 👀 |
|
||||||
|
|
||||||
|
如需详细了解,可 [查看](https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions)。
|
||||||
|
|
||||||
|
## 📍 `comment-id`
|
||||||
|
|
||||||
|
点击某个评论右上角 `···` 图标,选择 `Copy link`,url 末尾数字即是 `comment_id`。
|
67
docs/guide/start.en-US.md
Normal file
67
docs/guide/start.en-US.md
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
## Quick start
|
||||||
|
|
||||||
|
### 1. New Action
|
||||||
|
|
||||||
|
Click Actions in the warehouse, if Actions have been added, the following interface will be displayed.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Click `New workflow` to add.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
<Alert type="success">
|
||||||
|
You can click <Badge>set up a workflow yourself</Badge> to add a custom action, or you can apply a new action based on a template. <a target="_blank" href="https://github.com/actions-cool/.github">Templates</a>.
|
||||||
|
</Alert>
|
||||||
|
|
||||||
|
### 2. Edit Action
|
||||||
|
|
||||||
|
Actions storage address is fixed, unified as `/.github/workflows/xx.yml`.
|
||||||
|
|
||||||
|
Let's take the example of the home page and explain it in detail. The corresponding scenario is: when an issue adds the `help wanted` tag, the system will automatically comment.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Issue Reply
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [labeled]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
reply-helper:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: help wanted
|
||||||
|
if: github.event.label.name == 'help wanted'
|
||||||
|
uses: actions-cool/issues-helper@v1.2
|
||||||
|
with:
|
||||||
|
actions: 'create-comment'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
body: |
|
||||||
|
Hello @${{ github.event.issue.user.login }}. We totally like your proposal/feedback, welcome PR。
|
||||||
|
|
||||||
|
你好 @${{ github.event.issue.user.login }},我们完全同意你的提议/反馈,欢迎PR。
|
||||||
|
```
|
||||||
|
- `YML` syntax reference
|
||||||
|
- [Workflow syntax for GitHub Actions](https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions#on)
|
||||||
|
- `name`: The workflow name
|
||||||
|
- Actions workflow name, can be customized according to actual situation
|
||||||
|
- `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
|
||||||
|
- `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
|
||||||
|
- [More view](/en-US/guide/ref#-token)
|
||||||
|
- `issue-number`: Incoming parameter, here means the number of the current issue. If you are confused about the writing, you can [view](https://docs.github.com/en/free-pro-team@latest/actions/reference/context-and-expression-syntax-for-github-actions#github-context)
|
||||||
|
- `body`: Incoming parameters, here means the content of the current comment
|
||||||
|
|
||||||
|
### 3. Enable Action
|
||||||
|
|
||||||
|
When you finish writing and submit to the master branch, you can automatically enable the workflow, and the trigger conditions follow the definition of `on`.
|
||||||
|
|
||||||
|
😏 I believe that you have a general understanding of `how to use`, do you want to try it quickly?
|
||||||
|
|
||||||
|
Please check the functions you need in [Basic](/en-US/base) and [Advanced](/en-US/advanced) for flexible reference.
|
67
docs/guide/start.md
Normal file
67
docs/guide/start.md
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
## 快速开始
|
||||||
|
|
||||||
|
### 1. 新建 Action
|
||||||
|
|
||||||
|
点击仓库的 Actions,若已增加过 Actions,会显示如下界面。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
点击 `New workflow` 新增。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
<Alert type="success">
|
||||||
|
你可以点击 <Badge>set up a workflow yourself</Badge> 新增一个自定义 action,也可以根据模板来套用新增一个 action。<a target="_blank" href="https://github.com/actions-cool/.github">模板使用</a>。
|
||||||
|
</Alert>
|
||||||
|
|
||||||
|
### 2. 编写 Action
|
||||||
|
|
||||||
|
Actions 存放地址是固定的,统一为 `/.github/workflows/xx.yml`。
|
||||||
|
|
||||||
|
下面拿首页的例子详细说明下。对应场景为:当一个 issue 新增 `help wanted` 标签时,系统会自动进行评论。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Issue Reply
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [labeled]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
reply-helper:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: help wanted
|
||||||
|
if: github.event.label.name == 'help wanted'
|
||||||
|
uses: actions-cool/issues-helper@1.x
|
||||||
|
with:
|
||||||
|
actions: 'create-comment'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
body: |
|
||||||
|
Hello @${{ github.event.issue.user.login }}. We totally like your proposal/feedback, welcome PR。
|
||||||
|
|
||||||
|
你好 @${{ github.event.issue.user.login }},我们完全同意你的提议/反馈,欢迎PR。
|
||||||
|
```
|
||||||
|
- `YML` 语法参考
|
||||||
|
- [GitHub Actions 语法](https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions#on)
|
||||||
|
- `name`:workflow 名称
|
||||||
|
- Actions 流程名称,可根据实际情况自定义
|
||||||
|
- `on`:action 触发条件
|
||||||
|
- 参考 [工作流触发机制](https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows)
|
||||||
|
- `uses`:使用 actions 名称
|
||||||
|
- `uses: actions-cool/issues-helper@1.x`。版本选择请 [参考](/changelog)
|
||||||
|
- `issues-hepler` 参数
|
||||||
|
- `actions`:使用功能的名称,**必填**。支持多个,需用逗号隔开,如 `create-comment,close-issue` 表示评论和关闭 issue
|
||||||
|
- `token`:需拥有 push 权限的人员 token
|
||||||
|
- 更多 [参考](/guide/ref#-token-说明)
|
||||||
|
- `issue-number`:传入参数,这里表示当前 issue 的编号。如果你对写法疑惑,可 [查看](https://docs.github.com/en/free-pro-team@latest/actions/reference/context-and-expression-syntax-for-github-actions#github-context)
|
||||||
|
- `body`:传入参数,这里表示当前进行评论的内容
|
||||||
|
|
||||||
|
### 3. 启用 Action
|
||||||
|
|
||||||
|
当你完成编写完成提交到主分支后,即可自动启用该 workflow,触发条件遵循 `on` 的定义。
|
||||||
|
|
||||||
|
😏 相信到这里你已经对 `如何使用` 有了大概的了解,是不是想快点尝试一下。
|
||||||
|
|
||||||
|
下面请在 [基 础](/base) 和 [进 阶](/advanced) 查看你需要的功能,灵活参考。
|
62
docs/index.en-US.md
Normal file
62
docs/index.en-US.md
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
---
|
||||||
|
title: Issues Helper
|
||||||
|
order: 1
|
||||||
|
hero:
|
||||||
|
title: Issues Helper
|
||||||
|
image: https://avatars1.githubusercontent.com/u/73879334?s=200&v=4
|
||||||
|
desc: 🤖 A GitHub Action that easily helps you automatically manage issues
|
||||||
|
actions:
|
||||||
|
- text: Quick start
|
||||||
|
link: /en-US/guide/start
|
||||||
|
features:
|
||||||
|
- icon: https://github.com/actions-cool/resources/blob/main/image/free.png?raw=true
|
||||||
|
title: Completely free
|
||||||
|
desc: Use the Actions service provided by GitHub
|
||||||
|
- icon: https://github.com/actions-cool/resources/blob/main/image/snap.png?raw=true
|
||||||
|
title: Easy to use
|
||||||
|
desc: Detailed tutorials and rich templates
|
||||||
|
- icon: https://github.com/actions-cool/resources/blob/main/image/network.png?raw=true
|
||||||
|
title: Easy hosting
|
||||||
|
desc: As long as GitHub is not down, it will not be affected
|
||||||
|
footer: Open-source MIT Licensed | Copyright © 2020-present<br />Powered by xrkffgg
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🍭 Get started quickly
|
||||||
|
|
||||||
|
Here is a very simple and commonly used example. The corresponding scenario is: when an issue adds the `help wanted` tag, the system will automatically comment.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Issue Reply
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [labeled]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
reply-helper:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: help wanted
|
||||||
|
if: github.event.label.name == 'help wanted'
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'create-comment'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
body: |
|
||||||
|
Hello @${{ github.event.issue.user.login }}. We totally like your proposal/feedback, welcome PR。
|
||||||
|
|
||||||
|
你好 @${{ github.event.issue.user.login }},我们完全同意你的提议/反馈,欢迎PR。
|
||||||
|
```
|
||||||
|
|
||||||
|
## 💖 Who is using?
|
||||||
|
|
||||||
|
<embed src="../README.md#L29-L82"></embed>
|
||||||
|
|
||||||
|
## ⚡ 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`
|
62
docs/index.md
Normal file
62
docs/index.md
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
---
|
||||||
|
title: Issues 助手
|
||||||
|
order: 1
|
||||||
|
hero:
|
||||||
|
title: Issues 助手
|
||||||
|
image: https://avatars1.githubusercontent.com/u/73879334?s=200&v=4
|
||||||
|
desc: 🤖 一个轻松帮你自动管理 issues 的 GitHub Action
|
||||||
|
actions:
|
||||||
|
- text: 快速开始
|
||||||
|
link: /guide/start
|
||||||
|
features:
|
||||||
|
- icon: https://github.com/actions-cool/resources/blob/main/image/free.png?raw=true
|
||||||
|
title: 完全免费
|
||||||
|
desc: 使用 GitHub 自带提供的 Actions 服务
|
||||||
|
- icon: https://github.com/actions-cool/resources/blob/main/image/snap.png?raw=true
|
||||||
|
title: 简单易用
|
||||||
|
desc: 教程详细,模版丰富
|
||||||
|
- icon: https://github.com/actions-cool/resources/blob/main/image/network.png?raw=true
|
||||||
|
title: 轻松托管
|
||||||
|
desc: 只要 GitHub 不宕机,它就不受影响
|
||||||
|
footer: Open-source MIT Licensed | Copyright © 2020-present<br />Powered by xrkffgg
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🍭 快速上手
|
||||||
|
|
||||||
|
这里列举一个非常简单以及常用的例子。对应场景为:当一个 issue 新增 `help wanted` 标签时,系统会自动进行评论。
|
||||||
|
|
||||||
|
```yml
|
||||||
|
name: Issue Reply
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [labeled]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
reply-helper:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: help wanted
|
||||||
|
if: github.event.label.name == 'help wanted'
|
||||||
|
uses: actions-cool/issues-helper@v1.11
|
||||||
|
with:
|
||||||
|
actions: 'create-comment'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
body: |
|
||||||
|
Hello @${{ github.event.issue.user.login }}. We totally like your proposal/feedback, welcome PR。
|
||||||
|
|
||||||
|
你好 @${{ github.event.issue.user.login }},我们完全同意你的提议/反馈,欢迎PR。
|
||||||
|
```
|
||||||
|
|
||||||
|
## 💖 谁在使用?
|
||||||
|
|
||||||
|
<embed src="../README.md#L29-L82"></embed>
|
||||||
|
|
||||||
|
## ⚡ 反馈
|
||||||
|
|
||||||
|
非常欢迎你来尝试使用,并提出意见,你可以通过以下方式:
|
||||||
|
|
||||||
|
- 通过 [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` 的代码
|
26
package.json
26
package.json
@@ -1,17 +1,26 @@
|
|||||||
{
|
{
|
||||||
"name": "issue-helper",
|
"name": "issues-helper",
|
||||||
"version": "1.0",
|
"version": "1.11.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Some operations on issue.",
|
"description": "Some operations on issue.",
|
||||||
"main": "src/main.js",
|
"main": "src/main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"package": "ncc build src/main.js -o dist"
|
"start": "dumi dev",
|
||||||
|
"docs:build": "dumi build",
|
||||||
|
"docs-dev:build": "UMI_ENV=dev dumi build",
|
||||||
|
"docs:deploy": "gh-pages -d docs-dist",
|
||||||
|
"deploy": "npm run docs:build && npm run docs:deploy",
|
||||||
|
"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"
|
||||||
},
|
},
|
||||||
"author": "xrkffgg",
|
"author": "xrkffgg",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git+https://github.com/actions-cool/issue-helper.git"
|
"url": "https://github.com/actions-cool/issues-helper.git",
|
||||||
|
"branch": "main"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"actions",
|
"actions",
|
||||||
@@ -23,10 +32,15 @@
|
|||||||
"@actions/core": "^1.2.6",
|
"@actions/core": "^1.2.6",
|
||||||
"@actions/github": "^4.0.0",
|
"@actions/github": "^4.0.0",
|
||||||
"@octokit/rest": "^18.0.12",
|
"@octokit/rest": "^18.0.12",
|
||||||
"dayjs": "^1.9.7"
|
"dayjs": "^1.9.7",
|
||||||
|
"lodash": "^4.17.20"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@vercel/ncc": "^0.25.1",
|
"@vercel/ncc": "^0.25.1",
|
||||||
"dotenv": "^8.2.0"
|
"common-tags": "^1.8.0",
|
||||||
|
"dotenv": "^8.2.0",
|
||||||
|
"dumi": "^1.1.0",
|
||||||
|
"gh-pages": "^3.1.0",
|
||||||
|
"react": "^17.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
BIN
public/add-1.jpg
Normal file
BIN
public/add-1.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
BIN
public/add-2.jpg
Normal file
BIN
public/add-2.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 48 KiB |
BIN
public/duplicate.png
Normal file
BIN
public/duplicate.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 54 KiB |
BIN
public/month.png
Normal file
BIN
public/month.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 49 KiB |
82
script/update-users.js
Normal file
82
script/update-users.js
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
const { readFileSync, writeFileSync } = require('fs');
|
||||||
|
const { stripIndent } = require('common-tags');
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
let { users } = require('../USERS.js');
|
||||||
|
|
||||||
|
users.sort((a, b) => getName(a).localeCompare(getName(b)));
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
let table = '';
|
||||||
|
let row = users.length / 4;
|
||||||
|
let lastNo = users.length % 4;
|
||||||
|
if (lastNo != 0) row += 1;
|
||||||
|
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
|
||||||
|
};
|
||||||
|
|
||||||
|
table = `<table>
|
||||||
|
${table}
|
||||||
|
</table>
|
||||||
|
|
||||||
|
`;
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
const point = '<table>';
|
||||||
|
const cnPoint= `## 列 表`;
|
||||||
|
const enPoint = `## List`;
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
const cn = readFileSync('./README.md', 'utf8');
|
||||||
|
const cnIn = cn.indexOf(point);
|
||||||
|
const cnAfterIn = cn.indexOf(cnPoint);
|
||||||
|
const cnBefore = cn.substring(0, cnIn);
|
||||||
|
const cnAfter = cn.substring(cnAfterIn, cn.length);
|
||||||
|
const newcn = cnBefore + table + cnAfter;
|
||||||
|
writeFileSync('./README.md', newcn);
|
||||||
|
console.log(`🎉 Done cn`);
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
const en = readFileSync('./README.en-US.md', 'utf8');
|
||||||
|
const enIn = en.indexOf(point);
|
||||||
|
const enAfterIn = en.indexOf(enPoint);
|
||||||
|
const enBefore = en.substring(0, enIn);
|
||||||
|
const enAfter = en.substring(enAfterIn, en.length);
|
||||||
|
const newen = enBefore + table + enAfter;
|
||||||
|
writeFileSync('./README.en-US.md', newen);
|
||||||
|
console.log(`🎉 Done en`);
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
function getImg (o) {
|
||||||
|
if (o) {
|
||||||
|
return `
|
||||||
|
<a href="${o.url}">
|
||||||
|
<img src="${o.logo}" width="46" />
|
||||||
|
<div>${getName(o)}</div>
|
||||||
|
</a>`
|
||||||
|
}
|
||||||
|
return ``
|
||||||
|
};
|
||||||
|
|
||||||
|
function getName (o) {
|
||||||
|
if (o) {
|
||||||
|
return o.url.split('/').slice(-1)[0]
|
||||||
|
}
|
||||||
|
return ``
|
||||||
|
};
|
||||||
|
|
||||||
|
// **************************************************************************
|
44
script/update-version.js
Normal file
44
script/update-version.js
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
const { readFileSync, writeFileSync } = require('fs');
|
||||||
|
|
||||||
|
const last = /v1\.10/g;
|
||||||
|
const now = 'v1.11';
|
||||||
|
|
||||||
|
let readme = readFileSync('./README.md', 'utf-8');
|
||||||
|
readme = readme.replace(last, now);
|
||||||
|
writeFileSync('./README.md', readme);
|
||||||
|
console.log('readme done!');
|
||||||
|
|
||||||
|
let readmeen = readFileSync('./README.en-US.md', 'utf-8');
|
||||||
|
readmeen = readmeen.replace(last, now);
|
||||||
|
writeFileSync('./README.en-US.md', readmeen);
|
||||||
|
console.log('readmeen done!');
|
||||||
|
|
||||||
|
let index = readFileSync('./docs/index.md', 'utf-8');
|
||||||
|
index = index.replace(last, now);
|
||||||
|
writeFileSync('./docs/index.md', index);
|
||||||
|
console.log('index done!');
|
||||||
|
|
||||||
|
let indexen = readFileSync('./docs/index.en-US.md', 'utf-8');
|
||||||
|
indexen = indexen.replace(last, now);
|
||||||
|
writeFileSync('./docs/index.en-US.md', indexen);
|
||||||
|
console.log('indexen done!');
|
||||||
|
|
||||||
|
let base = readFileSync('./docs/base.md', 'utf-8');
|
||||||
|
base = base.replace(last, now);
|
||||||
|
writeFileSync('./docs/base.md', base);
|
||||||
|
console.log('base done!');
|
||||||
|
|
||||||
|
let baseen = readFileSync('./docs/base.en-US.md', 'utf-8');
|
||||||
|
baseen = baseen.replace(last, now);
|
||||||
|
writeFileSync('./docs/base.en-US.md', baseen);
|
||||||
|
console.log('baseen done!');
|
||||||
|
|
||||||
|
let adv = readFileSync('./docs/advanced.md', 'utf-8');
|
||||||
|
adv = adv.replace(last, now);
|
||||||
|
writeFileSync('./docs/advanced.md', adv);
|
||||||
|
console.log('adv done!');
|
||||||
|
|
||||||
|
let adven = readFileSync('./docs/advanced.en-US.md', 'utf-8');
|
||||||
|
adven = adven.replace(last, now);
|
||||||
|
writeFileSync('./docs/advanced.en-US.md', adven);
|
||||||
|
console.log('adven done!');
|
207
src/advanced.js
207
src/advanced.js
@@ -2,51 +2,60 @@ require('dotenv').config();
|
|||||||
const core = require("@actions/core");
|
const core = require("@actions/core");
|
||||||
const { Octokit } = require('@octokit/rest');
|
const { Octokit } = require('@octokit/rest');
|
||||||
|
|
||||||
|
const {
|
||||||
|
doAddLabels,
|
||||||
|
doCreateComment,
|
||||||
|
doCloseIssue,
|
||||||
|
doLockIssue,
|
||||||
|
doCreateIssue,
|
||||||
|
} = require('./base.js');
|
||||||
|
|
||||||
|
const {
|
||||||
|
doQueryIssues,
|
||||||
|
getIssuesInMonth,
|
||||||
|
getCreatedMonth,
|
||||||
|
} = require('./public.js');
|
||||||
|
|
||||||
|
const {
|
||||||
|
dealStringToArr,
|
||||||
|
matchKeyword,
|
||||||
|
getPreMonth
|
||||||
|
} = require('./util.js');
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
var dayjs = require('dayjs');
|
var dayjs = require('dayjs');
|
||||||
var utc = require('dayjs/plugin/utc');
|
var utc = require('dayjs/plugin/utc');
|
||||||
dayjs.extend(utc);
|
dayjs.extend(utc);
|
||||||
var isSameOrBefore = require('dayjs/plugin/isSameOrBefore');
|
|
||||||
dayjs.extend(isSameOrBefore);
|
|
||||||
|
|
||||||
const {
|
|
||||||
doAddLabels,
|
|
||||||
doCloseIssue,
|
|
||||||
doCreateComment,
|
|
||||||
doLockIssue
|
|
||||||
} = require('./base.js');
|
|
||||||
|
|
||||||
const { dealInput, matchKeyword } = require('./util.js');
|
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
const token = core.getInput('token');
|
const token = core.getInput('token');
|
||||||
const octokit = new Octokit({ auth: `token ${token}` });
|
const octokit = new Octokit({ auth: `token ${token}` });
|
||||||
|
|
||||||
let direction = core.getInput("direction");
|
let direction = core.getInput("direction");
|
||||||
direction = direction === 'desc' ? 'desc' : 'asc';
|
direction = direction === 'desc' ? 'desc' : 'asc';
|
||||||
|
|
||||||
const commentAuth = core.getInput("comment-auth");
|
const commentAuth = core.getInput("comment-auth");
|
||||||
const bodyIncludes = core.getInput('body-includes');
|
const bodyIncludes = core.getInput('body-includes');
|
||||||
const titleIncludes = core.getInput('title-includes');
|
const titleIncludes = core.getInput('title-includes');
|
||||||
const assigneeIncludes = core.getInput('assignee-includes');
|
const assigneeIncludes = core.getInput('assignee-includes');
|
||||||
|
|
||||||
const issueCreator = core.getInput("issue-creator");
|
let issueState = core.getInput("issue-state") || 'open';
|
||||||
const issueAssignee = core.getInput('issue-assignee');
|
if (issueState != 'all' && issueState != 'closed') {
|
||||||
const issueMentioned = core.getInput('issue-mentioned');
|
issueState = 'open';
|
||||||
|
|
||||||
let issueState = core.getInput("issue-state") || 'all';
|
|
||||||
|
|
||||||
if (issueState != 'open' && issueState != 'closed') {
|
|
||||||
issueState = 'all';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const inactiveDay = core.getInput("inactive-day");
|
|
||||||
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);
|
const issues = await doQueryIssues(owner, repo, labels, issueState);
|
||||||
|
|
||||||
if (issues.length) {
|
if (issues.length) {
|
||||||
for (let i = 0; i < issues.length; i++) {
|
for (let i = 0; i < issues.length; i++) {
|
||||||
if (!JSON.stringify(issues[i].labels).includes(inactiveLabel)) {
|
let arr = [];
|
||||||
|
issues[i].labels.forEach(it => {
|
||||||
|
arr.push(it.name);
|
||||||
|
});
|
||||||
|
if (!arr.includes(inactiveLabel)) {
|
||||||
await doAddLabels(owner, repo, issues[i].number, inactiveLabel);
|
await doAddLabels(owner, repo, issues[i].number, inactiveLabel);
|
||||||
if (core.getInput("body")) {
|
if (core.getInput("body")) {
|
||||||
await doCreateComment(owner, repo, issues[i].number, core.getInput("body"));
|
await doCreateComment(owner, repo, issues[i].number, core.getInput("body"));
|
||||||
@@ -74,7 +83,7 @@ async function doCheckIssue (owner, repo, issueNumber) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (!!checkResult && assigneeIncludes) {
|
if (!!checkResult && assigneeIncludes) {
|
||||||
let assigneesCheck = dealInput(assigneeIncludes);
|
let assigneesCheck = dealStringToArr(assigneeIncludes);
|
||||||
let checkAssignee = false;
|
let checkAssignee = false;
|
||||||
issue.data.assignees.forEach(it => {
|
issue.data.assignees.forEach(it => {
|
||||||
if (checkResult && !checkAssignee && assigneesCheck.includes(it.login)) {
|
if (checkResult && !checkAssignee && assigneesCheck.includes(it.login)) {
|
||||||
@@ -87,8 +96,8 @@ async function doCheckIssue (owner, repo, issueNumber) {
|
|||||||
|
|
||||||
if (!!checkResult && titleIncludes) {
|
if (!!checkResult && titleIncludes) {
|
||||||
const titleArr = titleIncludes.split('/');
|
const titleArr = titleIncludes.split('/');
|
||||||
const keyword1 = dealInput(titleArr[0]);
|
const keyword1 = dealStringToArr(titleArr[0]);
|
||||||
const keyword2 = dealInput(titleArr[1]);
|
const keyword2 = dealStringToArr(titleArr[1]);
|
||||||
checkResult =
|
checkResult =
|
||||||
keyword2.length ?
|
keyword2.length ?
|
||||||
matchKeyword(issue.data.title, keyword1) && matchKeyword(issue.data.title, keyword2) :
|
matchKeyword(issue.data.title, keyword1) && matchKeyword(issue.data.title, keyword2) :
|
||||||
@@ -97,8 +106,8 @@ async function doCheckIssue (owner, repo, issueNumber) {
|
|||||||
|
|
||||||
if (!!checkResult && bodyIncludes) {
|
if (!!checkResult && bodyIncludes) {
|
||||||
const bodyArr = bodyIncludes.split('/');
|
const bodyArr = bodyIncludes.split('/');
|
||||||
const keyword1 = dealInput(bodyArr[0]);
|
const keyword1 = dealStringToArr(bodyArr[0]);
|
||||||
const keyword2 = dealInput(bodyArr[1]);
|
const keyword2 = dealStringToArr(bodyArr[1]);
|
||||||
checkResult =
|
checkResult =
|
||||||
keyword2.length ?
|
keyword2.length ?
|
||||||
matchKeyword(issue.data.body, keyword1) && matchKeyword(issue.data.body, keyword2) :
|
matchKeyword(issue.data.body, keyword1) && matchKeyword(issue.data.body, keyword2) :
|
||||||
@@ -165,51 +174,133 @@ async function doLockIssues (owner, repo, labels) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
async function doQueryIssues (owner, repo, labels, state) {
|
async function doMonthStatistics (owner, repo, labels, assignees) {
|
||||||
let params = {
|
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();
|
||||||
|
|
||||||
|
const month = getPreMonth(thisMonth);
|
||||||
|
const showMonth = month < 10 ? `0${month}` : month;
|
||||||
|
|
||||||
|
let issues = await getIssuesInMonth(
|
||||||
owner,
|
owner,
|
||||||
repo,
|
repo,
|
||||||
state,
|
thisMonth
|
||||||
};
|
);
|
||||||
|
if (issues.length == 0) {
|
||||||
issueCreator ? params.creator = issueCreator : null;
|
core.info(`Actions: [query-issues-${month}] empty!`);
|
||||||
issueAssignee ? params.assignee = issueAssignee : null;
|
return false;
|
||||||
issueMentioned ? params.mentioned = issueMentioned : null;
|
|
||||||
|
|
||||||
if (labels) {
|
|
||||||
params.labels = labels;
|
|
||||||
}
|
}
|
||||||
|
issues = issues.filter(i => {
|
||||||
const res = await octokit.issues.listForRepo(params);
|
return getCreatedMonth(i.created_at) == month
|
||||||
let issues = [];
|
});
|
||||||
res.data.forEach(iss => {
|
let total = issues.length;
|
||||||
const a = bodyIncludes ? iss.body.includes(bodyIncludes) : true;
|
let totalIssues = [...issues];
|
||||||
const b = titleIncludes ? iss.title.includes(titleIncludes) : true;
|
let openTotal = 0;
|
||||||
/**
|
let openIssuesNumber = [];
|
||||||
* Note: GitHub's REST API v3 considers every pull request an issue, but not every issue is a pull request.
|
let closeTotal = 0;
|
||||||
* For this reason, "Issues" endpoints may return both issues and pull requests in the response.
|
let closeIssuesNumber = [];
|
||||||
* You can identify pull requests by the pull_request key.
|
let labelsTotals = [];
|
||||||
*/
|
const title = `[${owner}/${repo}] Month Statistics: ${year}-${showMonth}`;
|
||||||
if (a && b && iss.pull_request === undefined) {
|
for (let i = 0; i < issues.length; i++) {
|
||||||
if (inactiveDay && typeof(inactiveDay) === 'number') {
|
if (issues[i].state == 'closed') {
|
||||||
let lastTime = dayjs.utc().subtract(inactiveDay, 'day');
|
closeTotal += 1;
|
||||||
let updateTime = dayjs.utc(iss.updated_at);
|
closeIssuesNumber.push(issues[i].number);
|
||||||
if (updateTime.isSameOrBefore(lastTime)) {
|
} else if (issues[i].state == 'open') {
|
||||||
issues.push(iss);
|
openTotal += 1;
|
||||||
|
openIssuesNumber.push(issues[i].number);
|
||||||
}
|
}
|
||||||
|
if (countLables && issues[i].labels) {
|
||||||
|
issues[i].labels.forEach(l => {
|
||||||
|
if (l.name in labelsTotals) {
|
||||||
|
labelsTotals[l.name] += 1;
|
||||||
} else {
|
} else {
|
||||||
issues.push(iss);
|
labelsTotals[l.name] = 1;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let now = dayjs().utc().format('YYYY-MM-DD HH:mm:ss');
|
||||||
|
let body = `
|
||||||
|
- Created time: ${now}
|
||||||
|
|
||||||
return issues;
|
- Time base: UTC +0
|
||||||
|
`;
|
||||||
|
let totalShow = `
|
||||||
|
### Count
|
||||||
|
|
||||||
|
| Total | Open | Closed |
|
||||||
|
| -- | -- | -- |
|
||||||
|
| ${total} | ${openTotal} | ${closeTotal} |
|
||||||
|
|
||||||
|
`;
|
||||||
|
|
||||||
|
body += totalShow;
|
||||||
|
|
||||||
|
if (countLables == 'true') {
|
||||||
|
let labelsArr = [];
|
||||||
|
for (var lab in labelsTotals) {
|
||||||
|
labelsArr.push({
|
||||||
|
labelName: lab,
|
||||||
|
number: labelsTotals[lab]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
labelsArr.sort((a, b) => b.number - a.number);
|
||||||
|
let labelsTitle = `
|
||||||
|
### Labels statistics
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Number</th>
|
||||||
|
</tr>`
|
||||||
|
let labelsBody = '';
|
||||||
|
labelsArr.forEach(it => {
|
||||||
|
labelsBody += `<tr><td>${it.labelName}</td><td>${it.number}</td></tr>`
|
||||||
|
})
|
||||||
|
body = body + labelsTitle + labelsBody + `</table>
|
||||||
|
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (countComments == 'true') {
|
||||||
|
totalIssues.sort((a, b) => b.comments - a.comments);
|
||||||
|
const maxComments = totalIssues.slice(0, 3);
|
||||||
|
let commentTitle = `
|
||||||
|
### Most comments
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>#</th>
|
||||||
|
<th>Issue</th>
|
||||||
|
<th>Title</th>
|
||||||
|
<th>Number</th>
|
||||||
|
<th>State</th>
|
||||||
|
</tr>
|
||||||
|
`
|
||||||
|
let commentBody = '';
|
||||||
|
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>`
|
||||||
|
})
|
||||||
|
body = body + commentTitle + commentBody + '</table>';
|
||||||
|
}
|
||||||
|
|
||||||
|
await doCreateIssue(owner, repo, title, body, labels, assignees);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
module.exports = {
|
module.exports = {
|
||||||
doCheckInactive,
|
doCheckInactive,
|
||||||
doCheckIssue,
|
doCheckIssue,
|
||||||
doCloseIssues,
|
doCloseIssues,
|
||||||
doFindComments,
|
doFindComments,
|
||||||
doLockIssues,
|
doLockIssues,
|
||||||
|
doMonthStatistics,
|
||||||
};
|
};
|
||||||
|
4
src/app.jsx
Normal file
4
src/app.jsx
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
// Just for dumi style
|
||||||
|
import './less/main.less';
|
||||||
|
import './less/markdown.less';
|
||||||
|
import './less/dumi.less';
|
201
src/base.js
201
src/base.js
@@ -1,7 +1,9 @@
|
|||||||
require('dotenv').config();
|
require('dotenv').config();
|
||||||
const core = require("@actions/core");
|
const core = require("@actions/core");
|
||||||
|
const github = require("@actions/github");
|
||||||
const { Octokit } = require('@octokit/rest');
|
const { Octokit } = require('@octokit/rest');
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
const ALLREACTIONS = [
|
const ALLREACTIONS = [
|
||||||
"+1",
|
"+1",
|
||||||
"-1",
|
"-1",
|
||||||
@@ -13,21 +15,35 @@ const ALLREACTIONS = [
|
|||||||
"eyes",
|
"eyes",
|
||||||
];
|
];
|
||||||
|
|
||||||
const { dealInput } = require('./util.js');
|
const {
|
||||||
|
doQueryIssues
|
||||||
|
} = require('./public.js');
|
||||||
|
|
||||||
|
const {
|
||||||
|
dealStringToArr,
|
||||||
|
dealRandomAssignees,
|
||||||
|
testDuplicate,
|
||||||
|
} = require('./util.js');
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
const token = core.getInput('token');
|
const token = core.getInput('token');
|
||||||
const octokit = new Octokit({ auth: `token ${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");
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
async function doAddAssignees (owner, repo, issueNumber, assignees) {
|
async function doAddAssignees (owner, repo, issueNumber, assignees) {
|
||||||
|
const arr = dealRandomAssignees(assignees, randomTo);
|
||||||
await octokit.issues.addAssignees({
|
await octokit.issues.addAssignees({
|
||||||
owner,
|
owner,
|
||||||
repo,
|
repo,
|
||||||
issue_number: issueNumber,
|
issue_number: issueNumber,
|
||||||
assignees: dealInput(assignees)
|
assignees: arr
|
||||||
});
|
});
|
||||||
core.info(`Actions: [add-assignees][${assignees}] success!`);
|
core.info(`Actions: [add-assignees][${arr}] success!`);
|
||||||
};
|
};
|
||||||
|
|
||||||
async function doAddLabels (owner, repo, issueNumber, labels) {
|
async function doAddLabels (owner, repo, issueNumber, labels) {
|
||||||
@@ -35,7 +51,7 @@ async function doAddLabels (owner, repo, issueNumber, labels) {
|
|||||||
owner,
|
owner,
|
||||||
repo,
|
repo,
|
||||||
issue_number: issueNumber,
|
issue_number: issueNumber,
|
||||||
labels: dealInput(labels)
|
labels: dealStringToArr(labels)
|
||||||
});
|
});
|
||||||
core.info(`Actions: [add-labels][${labels}] success!`);
|
core.info(`Actions: [add-labels][${labels}] success!`);
|
||||||
};
|
};
|
||||||
@@ -61,7 +77,7 @@ async function doCreateComment (owner, repo, issueNumber, body) {
|
|||||||
core.setOutput("comment-id", data.id);
|
core.setOutput("comment-id", data.id);
|
||||||
|
|
||||||
if (contents) {
|
if (contents) {
|
||||||
await doCreateCommentContent(owner, repo, data.id, dealInput(contents));
|
await doCreateCommentContent(owner, repo, data.id, dealStringToArr(contents));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -87,8 +103,8 @@ async function doCreateIssue (owner, repo, title, body, labels, assignees) {
|
|||||||
repo,
|
repo,
|
||||||
title,
|
title,
|
||||||
body,
|
body,
|
||||||
labels: dealInput(labels),
|
labels: dealStringToArr(labels),
|
||||||
assignees: dealInput(assignees),
|
assignees: dealRandomAssignees(assignees, randomTo),
|
||||||
};
|
};
|
||||||
|
|
||||||
const { data } = await octokit.issues.create(params);
|
const { data } = await octokit.issues.create(params);
|
||||||
@@ -96,7 +112,7 @@ async function doCreateIssue (owner, repo, title, body, labels, assignees) {
|
|||||||
core.setOutput("issue-number", data.number);
|
core.setOutput("issue-number", data.number);
|
||||||
|
|
||||||
if (contents) {
|
if (contents) {
|
||||||
await doCreateIssueContent(owner, repo, data.number, dealInput(contents));
|
await doCreateIssueContent(owner, repo, data.number, dealStringToArr(contents));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -134,6 +150,63 @@ async function doLockIssue (owner, repo, issueNumber) {
|
|||||||
core.info(`Actions: [lock-issue][${issueNumber}] success!`);
|
core.info(`Actions: [lock-issue][${issueNumber}] success!`);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
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' || 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 commentId = context.payload.comment.id;
|
||||||
|
const commentBody = context.payload.comment.body;
|
||||||
|
const issueNumber = context.payload.issue.number;
|
||||||
|
|
||||||
|
const ifCommandInput = !!duplicateCommand;
|
||||||
|
|
||||||
|
if (!commentBody.includes('?') && ((ifCommandInput && commentBody.startsWith(duplicateCommand) && commentBody.split(' ')[0] == duplicateCommand) || testDuplicate(commentBody))) {
|
||||||
|
if (ifCommandInput) {
|
||||||
|
const nextBody = commentBody.replace(duplicateCommand, 'Duplicate of');
|
||||||
|
await doUpdateComment(owner, repo, commentId, nextBody, 'replace', true);
|
||||||
|
} else if (contents) {
|
||||||
|
await doCreateCommentContent(owner, repo, commentId, dealStringToArr(contents));
|
||||||
|
}
|
||||||
|
|
||||||
|
const issue = await octokit.issues.get({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
issue_number: issueNumber
|
||||||
|
});
|
||||||
|
let newLabels = [];
|
||||||
|
if (issue.data.labels.length > 0) {
|
||||||
|
newLabels = issue.data.labels.map(({ name }) => name).filter(name => !dealStringToArr(removeLables).includes(name));
|
||||||
|
}
|
||||||
|
if (duplicateLabels) {
|
||||||
|
newLabels = [...newLabels, ...dealStringToArr(duplicateLabels)];
|
||||||
|
}
|
||||||
|
if (labels) {
|
||||||
|
newLabels = dealStringToArr(labels);
|
||||||
|
}
|
||||||
|
if (newLabels.length > 0) {
|
||||||
|
await doSetLabels(owner, repo, issueNumber, newLabels.toString());
|
||||||
|
core.info(`Actions: [mark-duplicate-labels][${newLabels}] success!`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (closeIssue == 'true') {
|
||||||
|
await doCloseIssue(owner, repo, issueNumber);
|
||||||
|
}
|
||||||
|
} 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({
|
await octokit.issues.update({
|
||||||
owner,
|
owner,
|
||||||
@@ -149,41 +222,55 @@ async function doRemoveAssignees (owner, repo, issueNumber, assignees) {
|
|||||||
owner,
|
owner,
|
||||||
repo,
|
repo,
|
||||||
issue_number: issueNumber,
|
issue_number: issueNumber,
|
||||||
assignees: dealInput(assignees),
|
assignees: dealStringToArr(assignees)
|
||||||
});
|
});
|
||||||
core.info(`Actions: [remove-assignees][${assignees}] success!`);
|
core.info(`Actions: [remove-assignees][${assignees}] success!`);
|
||||||
};
|
};
|
||||||
|
|
||||||
async function doRemoveLabels (owner, repo, issueNumber, labels) {
|
async function doRemoveLabels (owner, repo, issueNumber, labels) {
|
||||||
|
const dealLabels = dealStringToArr(labels);
|
||||||
|
for (label of dealLabels) {
|
||||||
|
await octokit.issues.removeLabel({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
issue_number: issueNumber,
|
||||||
|
name: label,
|
||||||
|
});
|
||||||
|
core.info(`Actions: [remove-labels-foreach][${label}] success!`);
|
||||||
|
}
|
||||||
|
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({
|
||||||
|
// owner,
|
||||||
|
// repo,
|
||||||
|
// issue_number: issueNumber,
|
||||||
|
// labels: dealStringToArr(labels)
|
||||||
|
// });
|
||||||
const issue = await octokit.issues.get({
|
const issue = await octokit.issues.get({
|
||||||
owner,
|
owner,
|
||||||
repo,
|
repo,
|
||||||
issue_number: issueNumber
|
issue_number: issueNumber
|
||||||
});
|
});
|
||||||
const dealLabels = dealInput(labels);
|
const baseLabels = issue.data.labels.map(({ name }) => name);
|
||||||
let addLables = [];
|
const removeLabels = baseLabels.filter(name => !dealStringToArr(labels).includes(name));
|
||||||
if (dealLabels.length) {
|
const addLabels = dealStringToArr(labels).filter(name => !baseLabels.includes(name));
|
||||||
issue.data.labels.forEach(item => {
|
|
||||||
!dealLabels.includes(item.name) ? addLables.push(item.name) : '';
|
if (removeLabels.length > 0) {
|
||||||
})
|
await doRemoveLabels(owner, repo, issueNumber, removeLabels.toString());
|
||||||
await octokit.issues.setLabels({
|
core.info(`Actions: [set-labels-remove][${removeLabels}] success!`);
|
||||||
owner,
|
}
|
||||||
repo,
|
|
||||||
issue_number: issueNumber,
|
if (addLabels.length > 0) {
|
||||||
labels: addLables
|
await doAddLabels(owner, repo, issueNumber, addLabels.toString());
|
||||||
});
|
core.info(`Actions: [set-labels-add][${addLabels}] success!`);
|
||||||
core.info(`Actions: [remove-labels][${labels}] success!`);
|
}
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
async function doSetLabels (owner, repo, issueNumber, labels) {
|
|
||||||
await octokit.issues.setLabels({
|
|
||||||
owner,
|
|
||||||
repo,
|
|
||||||
issue_number: issueNumber,
|
|
||||||
labels: dealInput(labels)
|
|
||||||
});
|
|
||||||
core.info(`Actions: [set-labels][${labels}] success!`);
|
core.info(`Actions: [set-labels][${labels}] success!`);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
async function doUnlockIssue (owner, repo, issueNumber) {
|
async function doUnlockIssue (owner, repo, issueNumber) {
|
||||||
@@ -200,7 +287,8 @@ async function doUpdateComment (
|
|||||||
repo,
|
repo,
|
||||||
commentId,
|
commentId,
|
||||||
body,
|
body,
|
||||||
updateMode
|
updateMode,
|
||||||
|
ifUpdateBody,
|
||||||
) {
|
) {
|
||||||
const comment = await octokit.issues.getComment({
|
const comment = await octokit.issues.getComment({
|
||||||
owner,
|
owner,
|
||||||
@@ -215,7 +303,7 @@ async function doUpdateComment (
|
|||||||
comment_id: commentId
|
comment_id: commentId
|
||||||
};
|
};
|
||||||
|
|
||||||
if (core.getInput("body")) {
|
if (core.getInput("body") || ifUpdateBody) {
|
||||||
if (updateMode === 'append') {
|
if (updateMode === 'append') {
|
||||||
params.body = `${comment_body}\n${body}`;
|
params.body = `${comment_body}\n${body}`;
|
||||||
} else {
|
} else {
|
||||||
@@ -227,7 +315,7 @@ async function doUpdateComment (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (contents) {
|
if (contents) {
|
||||||
await doCreateCommentContent(owner, repo, commentId, dealInput(contents));
|
await doCreateCommentContent(owner, repo, commentId, dealStringToArr(contents));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -285,8 +373,8 @@ async function doUpdateIssue (
|
|||||||
}
|
}
|
||||||
params.body = next_body;
|
params.body = next_body;
|
||||||
|
|
||||||
params.labels = labels ? dealInput(labels) : issue_labels;
|
params.labels = labels ? dealStringToArr(labels) : issue_labels;
|
||||||
params.assignees = assignees ? dealInput(assignees) : issue_assignees;
|
params.assignees = assignees ? dealStringToArr(assignees) : issue_assignees;
|
||||||
|
|
||||||
await octokit.issues.update(params);
|
await octokit.issues.update(params);
|
||||||
core.info(`Actions: [update-issue][${issueNumber}] success!`);
|
core.info(`Actions: [update-issue][${issueNumber}] success!`);
|
||||||
@@ -296,7 +384,42 @@ async function doUpdateIssue (
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// tool
|
async function doWelcome (owner, repo, assignees, labels, body) {
|
||||||
|
const context = github.context;
|
||||||
|
const isIssue = !!context.payload.issue;
|
||||||
|
const issueContents = core.getInput("issue-contents");
|
||||||
|
if (!isIssue) {
|
||||||
|
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")) {
|
||||||
|
await doCreateComment(owner, repo, issueNumber, body);
|
||||||
|
} else {
|
||||||
|
core.info(`Actions: [welcome] no body!`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (assignees) {
|
||||||
|
await doAddAssignees(owner, repo, issueNumber, assignees);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (labels) {
|
||||||
|
await doAddLabels(owner, repo, issueNumber, labels);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (issueContents) {
|
||||||
|
await doCreateIssueContent(owner, repo, issueNumber, dealStringToArr(issueContents));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
core.info(`Actions: [welcome][${auth}] is not first time!`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
function testContent(con) {
|
function testContent(con) {
|
||||||
if (ALLREACTIONS.includes(con)) {
|
if (ALLREACTIONS.includes(con)) {
|
||||||
return true;
|
return true;
|
||||||
@@ -306,7 +429,7 @@ function testContent(con) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// exports
|
// **************************************************************************
|
||||||
module.exports = {
|
module.exports = {
|
||||||
doAddAssignees,
|
doAddAssignees,
|
||||||
doAddLabels,
|
doAddLabels,
|
||||||
@@ -316,6 +439,7 @@ module.exports = {
|
|||||||
doCreateIssue,
|
doCreateIssue,
|
||||||
doCreateIssueContent,
|
doCreateIssueContent,
|
||||||
doDeleteComment,
|
doDeleteComment,
|
||||||
|
doMarkDuplicate,
|
||||||
doLockIssue,
|
doLockIssue,
|
||||||
doOpenIssue,
|
doOpenIssue,
|
||||||
doRemoveAssignees,
|
doRemoveAssignees,
|
||||||
@@ -324,4 +448,5 @@ module.exports = {
|
|||||||
doUnlockIssue,
|
doUnlockIssue,
|
||||||
doUpdateComment,
|
doUpdateComment,
|
||||||
doUpdateIssue,
|
doUpdateIssue,
|
||||||
|
doWelcome,
|
||||||
};
|
};
|
||||||
|
112
src/less/dumi.less
Normal file
112
src/less/dumi.less
Normal file
File diff suppressed because one or more lines are too long
3
src/less/main.less
Normal file
3
src/less/main.less
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
html {
|
||||||
|
scroll-behavior: smooth;
|
||||||
|
}
|
20
src/less/markdown.less
Normal file
20
src/less/markdown.less
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
.markdown table {
|
||||||
|
width: auto !important;
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown table td:first-child {
|
||||||
|
font-weight: normal !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
padding: 1px 5px !important;
|
||||||
|
border-radius: 4px;
|
||||||
|
color: #ff7875 !important;
|
||||||
|
background: rgba(0, 0, 0, 0.06) !important;
|
||||||
|
box-shadow: 0px 1px 0px 0px rgba(0, 0, 0, 0.1);
|
||||||
|
border: 1px solid rgba(0,0,0,0.1);
|
||||||
|
}
|
34
src/main.js
34
src/main.js
@@ -1,15 +1,15 @@
|
|||||||
const core = require("@actions/core");
|
const core = require("@actions/core");
|
||||||
const github = require("@actions/github");
|
const github = require("@actions/github");
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
const {
|
const {
|
||||||
doAddAssignees,
|
doAddAssignees,
|
||||||
doAddLabels,
|
doAddLabels,
|
||||||
doCloseIssue,
|
doCloseIssue,
|
||||||
doCreateComment,
|
doCreateComment,
|
||||||
doCreateCommentContent,
|
|
||||||
doCreateIssue,
|
doCreateIssue,
|
||||||
doCreateIssueContent,
|
|
||||||
doDeleteComment,
|
doDeleteComment,
|
||||||
|
doMarkDuplicate,
|
||||||
doLockIssue,
|
doLockIssue,
|
||||||
doOpenIssue,
|
doOpenIssue,
|
||||||
doRemoveAssignees,
|
doRemoveAssignees,
|
||||||
@@ -18,6 +18,7 @@ const {
|
|||||||
doUnlockIssue,
|
doUnlockIssue,
|
||||||
doUpdateComment,
|
doUpdateComment,
|
||||||
doUpdateIssue,
|
doUpdateIssue,
|
||||||
|
doWelcome,
|
||||||
} = require('./base.js');
|
} = require('./base.js');
|
||||||
|
|
||||||
const {
|
const {
|
||||||
@@ -26,8 +27,10 @@ const {
|
|||||||
doCloseIssues,
|
doCloseIssues,
|
||||||
doFindComments,
|
doFindComments,
|
||||||
doLockIssues,
|
doLockIssues,
|
||||||
|
doMonthStatistics,
|
||||||
} = require('./advanced.js');
|
} = require('./advanced.js');
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
const ALLACTIONS = [
|
const ALLACTIONS = [
|
||||||
// base
|
// base
|
||||||
'add-assignees',
|
'add-assignees',
|
||||||
@@ -37,6 +40,7 @@ const ALLACTIONS = [
|
|||||||
'create-issue',
|
'create-issue',
|
||||||
'delete-comment',
|
'delete-comment',
|
||||||
'lock-issue',
|
'lock-issue',
|
||||||
|
'mark-duplicate',
|
||||||
'open-issue',
|
'open-issue',
|
||||||
'remove-assignees',
|
'remove-assignees',
|
||||||
'remove-labels',
|
'remove-labels',
|
||||||
@@ -44,6 +48,7 @@ const ALLACTIONS = [
|
|||||||
'unlock-issue',
|
'unlock-issue',
|
||||||
'update-comment',
|
'update-comment',
|
||||||
'update-issue',
|
'update-issue',
|
||||||
|
'welcome',
|
||||||
|
|
||||||
// advanced
|
// advanced
|
||||||
'check-inactive',
|
'check-inactive',
|
||||||
@@ -51,8 +56,10 @@ const ALLACTIONS = [
|
|||||||
'close-issues',
|
'close-issues',
|
||||||
'find-comments',
|
'find-comments',
|
||||||
'lock-issues',
|
'lock-issues',
|
||||||
|
'month-statistics',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
async function main() {
|
async function main() {
|
||||||
try {
|
try {
|
||||||
const owner = github.context.repo.owner;
|
const owner = github.context.repo.owner;
|
||||||
@@ -77,7 +84,9 @@ async function main() {
|
|||||||
updateMode = 'replace';
|
updateMode = 'replace';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// actions
|
||||||
const actions = core.getInput("actions", { required: true });
|
const actions = core.getInput("actions", { required: true });
|
||||||
|
|
||||||
const actionsArr = actions.split(',');
|
const actionsArr = actions.split(',');
|
||||||
actionsArr.forEach(item => {
|
actionsArr.forEach(item => {
|
||||||
testActions(item.trim());
|
testActions(item.trim());
|
||||||
@@ -115,6 +124,9 @@ async function main() {
|
|||||||
case 'lock-issue':
|
case 'lock-issue':
|
||||||
await doLockIssue(owner, repo, issueNumber);
|
await doLockIssue(owner, repo, issueNumber);
|
||||||
break;
|
break;
|
||||||
|
case 'mark-duplicate':
|
||||||
|
await doMarkDuplicate(owner, repo, labels);
|
||||||
|
break;
|
||||||
case 'open-issue':
|
case 'open-issue':
|
||||||
await doOpenIssue(owner, repo, issueNumber);
|
await doOpenIssue(owner, repo, issueNumber);
|
||||||
break;
|
break;
|
||||||
@@ -152,6 +164,15 @@ async function main() {
|
|||||||
labels
|
labels
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
case 'welcome':
|
||||||
|
await doWelcome(
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
assignees,
|
||||||
|
labels,
|
||||||
|
body
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
|
||||||
// advanced
|
// advanced
|
||||||
case 'check-inactive':
|
case 'check-inactive':
|
||||||
@@ -189,6 +210,14 @@ async function main() {
|
|||||||
labels
|
labels
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
case 'month-statistics':
|
||||||
|
await doMonthStatistics(
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
labels,
|
||||||
|
assignees
|
||||||
|
);
|
||||||
|
break;
|
||||||
// default
|
// default
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -200,4 +229,5 @@ async function main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
main();
|
main();
|
||||||
|
124
src/public.js
Normal file
124
src/public.js
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
require('dotenv').config();
|
||||||
|
const core = require("@actions/core");
|
||||||
|
const { Octokit } = require('@octokit/rest');
|
||||||
|
|
||||||
|
const {
|
||||||
|
getPreMonth
|
||||||
|
} = require('./util.js');
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
var dayjs = require('dayjs');
|
||||||
|
var utc = require('dayjs/plugin/utc');
|
||||||
|
dayjs.extend(utc);
|
||||||
|
var isSameOrBefore = require('dayjs/plugin/isSameOrBefore');
|
||||||
|
dayjs.extend(isSameOrBefore);
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
const token = core.getInput('token');
|
||||||
|
const octokit = new Octokit({ auth: `token ${token}` });
|
||||||
|
|
||||||
|
const perPage = 100;
|
||||||
|
|
||||||
|
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");
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
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;
|
||||||
|
|
||||||
|
if (labels) {
|
||||||
|
params.labels = labels;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (creator) {
|
||||||
|
params.creator = creator;
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = await getIssues(params);
|
||||||
|
let issues = [];
|
||||||
|
let issueNumbers = [];
|
||||||
|
if (res.length) {
|
||||||
|
res.forEach(iss => {
|
||||||
|
const a = bodyIncludes ? iss.body.includes(bodyIncludes) : true;
|
||||||
|
const b = titleIncludes ? iss.title.includes(titleIncludes) : true;
|
||||||
|
/**
|
||||||
|
* Note: GitHub's REST API v3 considers every pull request an issue, but not every issue is a pull request.
|
||||||
|
* For this reason, "Issues" endpoints may return both issues and pull requests in the response.
|
||||||
|
* You can identify pull requests by the pull_request key.
|
||||||
|
*/
|
||||||
|
if (a && b && iss.pull_request === undefined) {
|
||||||
|
if (inactiveDay) {
|
||||||
|
let lastTime = dayjs.utc().subtract(Number(inactiveDay), 'day');
|
||||||
|
let updateTime = dayjs.utc(iss.updated_at);
|
||||||
|
if (updateTime.isSameOrBefore(lastTime)) {
|
||||||
|
issues.push(iss);
|
||||||
|
issueNumbers.push(iss.number);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
issues.push(iss);
|
||||||
|
issueNumbers.push(iss.number);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
core.info(`Actions: [query-issues]: [${JSON.stringify(issueNumbers)}]!`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return issues;
|
||||||
|
};
|
||||||
|
|
||||||
|
async function getIssues (params, page = 1) {
|
||||||
|
let { data: issues } = await octokit.issues.listForRepo({
|
||||||
|
...params,
|
||||||
|
per_page: perPage,
|
||||||
|
page
|
||||||
|
});
|
||||||
|
if (issues.length >= perPage) {
|
||||||
|
issues = issues.concat(await getIssues(params, page + 1));
|
||||||
|
}
|
||||||
|
return issues;
|
||||||
|
};
|
||||||
|
|
||||||
|
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
|
||||||
|
});
|
||||||
|
issues = issues.filter(i => {
|
||||||
|
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) {
|
||||||
|
return dayjs(d).utc().month() + 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
module.exports = {
|
||||||
|
doQueryIssues,
|
||||||
|
getIssues,
|
||||||
|
getIssuesInMonth,
|
||||||
|
getCreatedMonth,
|
||||||
|
};
|
44
src/util.js
44
src/util.js
@@ -1,4 +1,10 @@
|
|||||||
function dealInput (para) {
|
const sampleSize = require('lodash/sampleSize');
|
||||||
|
|
||||||
|
function dealStringToArr (para) {
|
||||||
|
/**
|
||||||
|
* in 'x1,x2,x3'
|
||||||
|
* out ['x1','x2','x3']
|
||||||
|
*/
|
||||||
let arr = [];
|
let arr = [];
|
||||||
if (para) {
|
if (para) {
|
||||||
const paraArr = para.split(',');
|
const paraArr = para.split(',');
|
||||||
@@ -11,11 +17,39 @@ function dealInput (para) {
|
|||||||
return arr;
|
return arr;
|
||||||
};
|
};
|
||||||
|
|
||||||
function matchKeyword(content, keywords) {
|
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) {
|
||||||
return keywords.find(item => content.toLowerCase().includes(item));
|
return keywords.find(item => content.toLowerCase().includes(item));
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = {
|
function testDuplicate(body) {
|
||||||
dealInput,
|
if (!body || !body.startsWith('Duplicate of')) {
|
||||||
matchKeyword,
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
let arr = body.split(' ');
|
||||||
|
if (arr[0] == 'Duplicate' && arr[1] == 'of') {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function getPreMonth (m) {
|
||||||
|
return m == 1 ? 12 : m -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
dealStringToArr,
|
||||||
|
dealRandomAssignees,
|
||||||
|
getPreMonth,
|
||||||
|
matchKeyword,
|
||||||
|
testDuplicate,
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user