github-community-projects/issue-metrics

GitHub: github-community-projects/issue-metrics

一款用于自动收集并报告 GitHub 仓库中 issue、PR 和 discussion 响应及处理指标的 GitHub Action。

Stars: 533 | Forks: 93

# Issue Metrics Action [![CodeQL](https://static.pigsec.cn/wp-content/uploads/repos/cas/53/539e9a6bf48ad24469a4363bff3aa68124154549e26592783d3d8577f2acbbfc.svg)](https://github.com/github-community-projects/issue-metrics/actions/workflows/github-code-scanning/codeql) [![Docker Image CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/1e/1e21a2e3da31b453a5f1bc45b8310f5afda3c3605bac4e1120106ea4cf8e8890.svg)](https://github.com/github-community-projects/issue-metrics/actions/workflows/docker-image.yml) [![Python package](https://static.pigsec.cn/wp-content/uploads/repos/cas/a0/a08ae093d3546a553a1b1f65eaf52ea9db7cb54c416870331caad305ac8f5d3b.svg)](https://github.com/github-community-projects/issue-metrics/actions/workflows/python-package.yml) [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/github-community-projects/issue-metrics/badge)](https://scorecard.dev/viewer/?uri=github.com/github-community-projects/issue-metrics) [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/9501/badge)](https://www.bestpractices.dev/projects/9501) 这是一个 GitHub Action,用于搜索仓库中的 issue/pull request/discussion,测量多项指标,并生成 GitHub issue 形式的报告。 可以使用搜索查询来过滤要搜索的 issue/pull request/discussion。 此 Action 由 GitHub OSPO 开发,最初用于内部用途,现将其开源以期能为您提供便利。 欢迎在此仓库中创建 issue 来询问其使用方法。 ## 可用指标 | 指标 | 描述 | | --------------------------------- | ------------------------------------------------------------------------------------------ | | 首次响应时间 | 从创建到首次评论或审查的持续时间。\* | | 首次审查时间 (仅限 PR) | 从创建到首次提交审查的持续时间。\* | | 关闭时间 | 从创建到关闭的时间段。\* | | 回答时间 (仅限 Discussion) | 从创建到获得回答的时间。 | | 标签停留时间 | 从应用标签到移除标签的持续时间,需要设置 `LABELS_TO_MEASURE` 环境变量。 | | 草稿停留时间 (仅限 PR) | 从创建到 PR 被标记为“准备审查”的持续时间。 | \*对于 pull request,这些指标不包括 PR 处于草稿状态的时间。 \*对于 issue 和 pull request,不包括 issue/pull request 作者的评论以及机器人的评论。 要查找搜索查询的语法,请查看有关[搜索 issue 和 pull request](https://docs.github.com/en/issues/tracking-your-work-with-issues/filtering-and-searching-issues-and-pull-requests) 或 [搜索 discussion](https://docs.github.com/en/search-github/searching-on-github/searching-discussions) 的文档。 ## 报告示例 此 Action 的输出是 GitHub issue 形式的报告。 下面是一个此类 GitHub issue 的示例。 ![issue/metrics GitHub Action 创建的 GitHub issue 示例](https://static.pigsec.cn/wp-content/uploads/repos/cas/fa/fa74b12ef4e89a11135d514aa296e5adc8ede3a78bcc958b0765b29cc9e4e633.png) ## 快速开始 在您的仓库中创建一个包含以下内容的工作流文件(例如:`.github/workflows/issue-metrics.yml`): **注意**:`repo:owner/repo` 是您想要测量指标的目标仓库 ``` name: Monthly issue metrics on: workflow_dispatch: schedule: - cron: "3 2 1 * *" permissions: contents: read jobs: build: name: issue metrics runs-on: ubuntu-latest permissions: issues: write pull-requests: read steps: - name: Get dates for last month shell: bash run: | # Calculate the first day of the previous month first_day=$(date -d "last month" +%Y-%m-01) # Calculate the last day of the previous month last_day=$(date -d "$first_day +1 month -1 day" +%Y-%m-%d) #Set an environment variable with the date range echo "$first_day..$last_day" echo "last_month=$first_day..$last_day" >> "$GITHUB_ENV" - name: Run issue-metrics tool uses: github-community-projects/issue-metrics@v4 env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} SEARCH_QUERY: 'repo:owner/repo is:issue created:${{ env.last_month }} -reason:"not planned"' - name: Create issue uses: peter-evans/create-issue-from-file@v5 with: title: Monthly issue metrics report token: ${{ secrets.GITHUB_TOKEN }} content-filepath: ./issue_metrics.md ``` ## 示例用例 - 作为维护者,我希望查看我所维护仓库中 issue 和 pull request 的指标,以确保我对它们给予了足够的关注。 - 作为仓库的首席响应者,我希望确保用户能在合理的时间内得到我的回复。 - 作为 OSPO,我希望查看有多少开源仓库请求处于打开/关闭状态,以及完成开源流程所需时间的指标。 - 作为产品开发团队,我希望查看 pull request 审查所花费的时间指标,以便我们在回顾会议上分析这些数据。 ## 支持 如果您在使用此项目时需要支持或有任何疑问,请[在此仓库中创建一个 issue](https://github.com/github-community-projects/issue-metrics/issues)。直接向 GitHub 员工或支持团队提出的请求将被重定向到这里以创建 issue。GitHub 的 SLA 和支持/服务合同不适用于此仓库。 ### OSPO GitHub Actions 整体 关于我们 GitHub Actions 的所有反馈(作为一个整体),应通过[github-ospo 仓库上的 issue](https://github.com/github/github-ospo/issues/new) 进行沟通。 ## 作为 GitHub Action 使用 1. 创建一个仓库来托管此 GitHub Action,或选择一个现有仓库。如果与您想要测量指标的仓库相同,这是最简单的。 2. 从[示例目录](./docs/example-workflows.md) 中为您的用例选择最合适的工作流文件。 3. 将该示例复制到您的仓库(从第 1 步)中,并放入 GitHub Actions 的正确目录:`.github/workflows/` 目录下,文件扩展名为 `.yml`(例如:`.github/workflows/issue-metrics.yml`) 4. 使用您的信息编辑示例工作流中的值(`SEARCH_QUERY`、`assignees`)。有关如何配置搜索查询的更多信息,请参阅 [SEARCH_QUERY](./docs/search-query.md) 部分。 5. 如果您要在非工作流文件所在的其他仓库上运行指标,请更新 `GH_TOKEN` 的值。 - 通过创建一个具有读取仓库和写入 issue 权限的 [GitHub API token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token-classic) 来执行此操作。 - 然后获取您刚刚创建的 API token 的值,并[创建一个仓库 secret](https://docs.github.com/en/actions/security-guides/encrypted-secrets),其中 secret 名称为 `GH_TOKEN`,值为该 API token。 - 最后更新工作流文件以使用该仓库 secret,将 `GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}` 更改为 `GH_TOKEN: ${{ secrets.GH_TOKEN }}`。该 secret 的名称其实可以是任何名字。它只需要在您创建 secret 名称时与您在工作流文件中引用它时保持一致即可。 - 有关验证您的 token 对仓库访问权限的帮助,请参阅 [docs 目录](docs/verify-token-access-to-repository.md) 6. 如果您希望包含指标的生成 issue 出现在运行工作流文件所在仓库以外的其他仓库中,请使用您自己存储为仓库 secret 的 GitHub API token 更新 `token: ${{ secrets.GITHUB_TOKEN }}` 这一行。 - 此过程与上述步骤中描述的相同。有关创建 secret 的更多信息,请参阅[GitHub 文档中有关加密 secret 的安全指南](https://docs.github.com/en/actions/security-guides/encrypted-secrets)。 7. 将工作流文件提交到默认分支(通常是 `master` 或 `main`) 8. 等待 Action 根据 `schedule` 条目触发,或者按照[文档](https://docs.github.com/en/actions/using-workflows/manually-running-a-workflow) 中的说明手动触发工作流。 ### 配置 以下是允许的配置选项: #### 身份验证 此 Action 可配置为使用 GitHub App Installation 或 Personal Access Token (PAT) 进行身份验证。如果提供了所有配置选项,则 GitHub App Installation 配置具有优先权。您可以选择以下方法之一进行身份验证: ##### GitHub App 安装 | 字段 | 必填 | 默认值 | 描述 | | ---------------------------- | -------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `GH_APP_ID` | True | `""` | GitHub Application ID。有关更多详细信息,请参阅[文档](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/about-authentication-with-a-github-app)。 | | `GH_APP_INSTALLATION_ID` | True | `""` | GitHub Application Installation ID。有关更多详细信息,请参阅[文档](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/about-authentication-with-a-github-app)。 | | `GH_APP_PRIVATE_KEY` | True | `""` | GitHub Application Private Key。有关更多详细信息,请参阅[文档](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/about-authentication-with-a-github-app)。 | | `GITHUB_APP_ENTERPRISE_ONLY` | False | false | 如果您的应用程序是在 GHE 中创建并与 GHE 通信,请将此输入设置为 `true`。 | ##### Personal Access Token (PAT) | 字段 | 必填 | 默认值 | 描述 | | ---------- | -------- | ------- | --------------------------------------------------------------------------------------------------------------------- | | `GH_TOKEN` | True | `""` | 用于扫描仓库的 GitHub Token。必须对您有兴趣扫描的所有仓库具有读取权限。 | #### 其他配置选项 | 字段 | 必填 | 默认值 | 描述 | | ----------------------------- | -------- | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `GH_ENTERPRISE_URL` | False | `""` | 用于身份验证的 GitHub Enterprise 实例 URL,替代 github.com | | `HIDE_ASSIGNEE` | False | False | 如果设置为 `true`,生成的 Markdown 文件中将不会显示指派人。 | | `HIDE_AUTHOR` | False | False | 如果设置为 `true`,生成的 Markdown 文件中将不会显示作者。 | | `HIDE_ITEMS_CLOSED_COUNT` | False | False | 如果设置为 `true`,生成的 Markdown 文件中将不会显示已关闭项目的数量指标。 | | `HIDE_LABEL_METRICS` | False | False | 如果设置为 `true`,生成的 Markdown 文件中将不会显示标签停留时间指标。 | | `HIDE_TIME_TO_ANSWER` | False | False | 如果设置为 `true`,生成的 Markdown 文件中将不会显示 discussion 的回答时间。 | | `HIDE_TIME_TO_CLOSE` | False | False | 如果设置为 `true`,生成的 Markdown 文件中将不会显示关闭时间。 | | `HIDE_TIME_TO_FIRST_RESPONSE` | False | False | 如果设置为 `true`,生成的 Markdown 文件中将不会显示首次响应时间。 | | `HIDE_TIME_TO_FIRST_REVIEW` | False | False | 如果设置为 `true`,生成的 Markdown 文件中将不会显示首次审查时间。 | | `HIDE_STATUS` | False | True | 如果设置为 `true`,将不会显示状态列 | | `HIDE_CREATED_AT` | False | True | 如果设置为 `true`,生成的 Markdown 文件中将不会显示创建时间戳。 | | `HIDE_PR_STATISTICS` | False | True | 如果设置为 `true`,生成的 Markdown 文件中将不会显示 PR 评论统计信息(平均值、中位数、第 90 百分位数以及各 PR 的评论数)。 | | `HIDE_ITEMS_LIST` | False | False | 如果设置为 `true`,生成的 Markdown 文件中将不会显示单个 pull request、issue 和 discussion 的独立项目列表表格。仅显示汇总指标。 | | `DRAFT_PR_TRACKING` | False | False | 如果设置为 `true`,草稿 PR 将作为新列包含在指标和汇总统计中。 | | `IGNORE_USERS` | False | False | 计算指标时要忽略的以逗号分隔的用户列表。(例如:`IGNORE_USERS: 'user1,user2'`)。要忽略机器人,请在用户名后附加 `[bot]`(例如:`IGNORE_USERS: 'github-actions[bot]'`)。此列表中的用户其创建的 issue 和 pull request 也将从 Markdown 表格中移除。 | | `ENABLE_MENTOR_COUNT` | False | False | 如果设置为 'TRUE',计算用户在 discussion、issue 和 PR 上留下的评论数,并显示活跃导师的数量 | | `MIN_MENTOR_COMMENTS` | False | 10 | 计为导师的最低评论数 | | `MAX_COMMENTS_EVAL` | False | 20 | 评估导师统计信息的每个话题的最大评论数 | | `HEAVILY_INVOLVED_CUTOFF` | False | 3 | 超过此截断值后,导师在某个 issue 中的评论将不再计入其总分 | | `LABELS_TO_MEASURE` | False | `""` | 以逗号分隔的标签列表,用于测量应用该标签的时间长度。如果未提供,则不会测量标签的持续时间。目前不适用于 discussion。 | | `NON_MENTIONING_LINKS` | False | False | 如果设置为 `true`,将使用非提及 GitHub 链接,以避免从源仓库链接到生成的 issue。将使用 `https://www.github.com` 格式的链接。 | | `OUTPUT_FILE` | False | `issue_metrics.md` 或 `issue_metrics.json` | 输出文件名。 | | `REPORT_TITLE` | False | `"Issue Metrics"` | 显示在报告 issue 上的标题。 | | `SEARCH_QUERY` | True | `""` | 用于过滤 issue/PR 的查询,必须包含 `repo:`、`org:`、`owner:` 或 `user:` 条目。对于 discussion,请在查询中包含 `type:discussions`。 | | `GROUP_BY` | False | `""` | 按指定字段对报告中的项目进行分组。支持的值:`author`、`assignee`。设置后,项目将按所选字段分组到不同的部分中。 | | `SORT_BY` | False | `""` | 按指定字段对报告中的项目进行排序。支持的值:`time_to_close`、`time_to_first_response`、`time_to_first_review`、`time_to_answer`、`time_in_draft`、`created_at`。设置后,项目将按所选指标进行排序。 | | `SORT_ORDER` | False | `asc` | 项目的排序顺序。支持的值:`asc`(升序)、`desc`(降序)。仅在设置了 `SORT_BY` 时适用 | ## 更多文档 - [示例工作流](./docs/example-workflows.md) - [测量标签停留时间](./docs/measure-time.md) - [分配团队而非个人](./docs/assign-team-instead-of-individual.md) - [使用 JSON 输出而非 Markdown 输出的示例](./docs/example-using-json-instead-markdown-output.md) - [配置 `SEARCH_QUERY`](./docs/search-query.md) - [不使用 Docker 的本地使用方法](./docs/local-usage-without-docker.md) - [使用 GitHub App Installation 进行身份验证](./docs/authenticating-with-github-app-installation.md) - [处理大型 issue_metrics.md 文件](./docs/dealing-with-large-issue-metrics.md) ### 开发设置 - 安装 [uv](https://docs.astral.sh/uv/getting-started/installation/) - 克隆此仓库并进入 `issue-metrics` - 安装依赖项 `uv sync` - 运行测试 `make test` - 运行 linter `make lint` ## 许可证 [MIT](LICENSE) ## 更多 OSPO 工具 正在为您的开源项目办公室 (OSPO) 寻找更多资源?请查看 [`github-ospo`](https://github.com/github/github-ospo) 仓库,其中包含旨在满足您需求的各种工具。
标签:GitHub Action, Linux 内核安全, Python, 无后门, 研发度量, 社区运营, 请求拦截, 逆向工具, 项目管理