Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 34 additions & 2 deletions .github/workflows/invite-contributor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ name: Invite contributor
# 新人提交的 PR 被合并后,把 PR 作者邀请进组织,并加入 all-members team。
#
# 触发方式:
# - pull_request_target / closed:PR 合并时自动执行(对 fork 的 PR 同样生效)
# - workflow_dispatch:手动补发邀请,用于邀请失败或遗漏时的重试
# - pull_request_target / closed:个人介绍 PR 合并时自动执行(对 fork 的 PR 同样生效)
# - workflow_dispatch:手动补发邀请,用于邀请失败或遗漏时的重试,不受介绍文件限制
#
# 安全约定:本 workflow 使用 pull_request_target,可以访问仓库 Secret,因此
# 只通过 API 操作用户,绝不允许 checkout 或执行 PR 里的代码。
Expand Down Expand Up @@ -79,6 +79,38 @@ jobs:
return
}

// 只有改动 members/ 下个人介绍文件的 PR 才发邀请;
// members/README.md 与 members/example.md 是仓库脚手架,不算个人介绍。
// 手动触发(workflow_dispatch)不受此限制,作为补发入口。
if (context.eventName !== 'workflow_dispatch') {
const pullNumber = context.payload.pull_request.number
const files = await github.paginate(github.rest.pulls.listFiles, {
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pullNumber,
per_page: 100,
})

const introFiles = files
.map((file) => file.filename)
.filter(
(name) =>
/^members\/.+\.md$/.test(name) &&
name !== 'members/README.md' &&
name !== 'members/example.md'
)

if (introFiles.length === 0) {
core.notice(
`PR #${pullNumber} 没有改动 members/ 下的个人介绍,跳过邀请。` +
'按贡献指南,组织邀请只发给个人介绍 PR;确需补发请手动运行本 workflow。'
)
return
}

core.info(`检测到个人介绍改动:${introFiles.join(', ')}`)
}

let team
try {
team = (await github.rest.teams.getByName({ org, team_slug: teamSlug })).data
Expand Down
4 changes: 3 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,9 @@ git switch -c challenge/your-task

这一步由 [.github/workflows/invite-contributor.yml](.github/workflows/invite-contributor.yml) 自动完成,规则是:

- 触发时机:本仓库任意 PR 被合并时(对来自 fork 的 PR 同样生效),取 PR 作者账号为邀请对象。
- 触发时机:本仓库的 PR 被合并时(对来自 fork 的 PR 同样生效),取 PR 作者账号为邀请对象。
- 邀请范围:只有 PR 改动了 `members/` 下的个人介绍文件才会邀请。`members/README.md` 与 `members/example.md` 是仓库脚手架,不算个人介绍。因此挑战与自由实验的 PR 合并后不会发邀请,与「个人介绍 PR 才发邀请」的规则一致。
- 例外:手动运行 workflow 不受上面的范围限制,用于补发遗漏的邀请。
- 已是组织成员:只补 `all-members` team 归属,不重复发邀请。
- 已有待接受的邀请:只补 team 归属,不重复发邀请。
- 不是组织成员:发送组织邀请,并把 `all-members` team 一并写进邀请,对方接受后自动进入该 team。
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ playground/

请使用准备加入组织的 GitHub 账号提交 PR,个人介绍中的用户名也填写该账号。我们以 PR 提交者的账号为邀请对象。

PR 合并后由 [邀请流程](.github/workflows/invite-contributor.yml) 自动执行:如果作者还不是组织成员,会立即发送组织邀请并预先加入 `all-members` team。接受邀请后即成为组织成员,同时出现在所有成员名单里。如果长时间没有收到邀请邮件,请到 GitHub 的 [组织邀请页面](https://github.com/account/organizations) 查看,或在 Issue 中留言请负责人手动补发。
个人介绍 PR 合并后由 [邀请流程](.github/workflows/invite-contributor.yml) 自动执行:如果作者还不是组织成员,会立即发送组织邀请并预先加入 `all-members` team。接受邀请后即成为组织成员,同时出现在所有成员名单里。只有改动了 `members/` 下个人介绍文件的 PR 才会触发,挑战与自由实验的 PR 不在此列。如果长时间没有收到邀请邮件,请到 GitHub 的 [组织邀请页面](https://github.com/account/organizations) 查看,或在 Issue 中留言请负责人手动补发。

## 参与约定

Expand Down
Loading