From b2b0226221e279ce1a0e0e048a408e407cb60bdf Mon Sep 17 00:00:00 2001 From: mcell Date: Mon, 19 Oct 2026 00:52:54 +0800 Subject: [PATCH] =?UTF-8?q?ci:=20=E7=BB=84=E7=BB=87=E9=82=80=E8=AF=B7?= =?UTF-8?q?=E6=94=B6=E7=AA=84=E5=88=B0=20members/=20=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E4=BB=8B=E7=BB=8D=20PR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 把邀请门槛从「任意 PR 合并即邀请」收窄为「PR 改动了 members/ 下的 个人介绍文件才邀请」,与 README/CONTRIBUTING 既有的「个人介绍 PR 才 发邀请、挑战与自由实验不作为邀请条件」规则对齐。members/README.md 与 members/example.md 属仓库脚手架,不计入。workflow_dispatch 手动 触发不受限制,保留补发入口。 --- .github/workflows/invite-contributor.yml | 36 ++++++++++++++++++++++-- CONTRIBUTING.md | 4 ++- README.md | 2 +- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/.github/workflows/invite-contributor.yml b/.github/workflows/invite-contributor.yml index 3aea9a8..8cb1a36 100644 --- a/.github/workflows/invite-contributor.yml +++ b/.github/workflows/invite-contributor.yml @@ -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 里的代码。 @@ -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 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4f80bdd..5c8bebd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -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。 diff --git a/README.md b/README.md index e3c8bb4..924512e 100644 --- a/README.md +++ b/README.md @@ -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 中留言请负责人手动补发。 ## 参与约定