{"id":16754324,"url":"https://github.com/fatedier/freebot","last_synced_at":"2025-03-21T22:32:16.202Z","repository":{"id":57657677,"uuid":"168158484","full_name":"fatedier/freebot","owner":"fatedier","description":"A simple github workflow bot.","archived":false,"fork":false,"pushed_at":"2019-03-04T11:43:43.000Z","size":590,"stargazers_count":48,"open_issues_count":8,"forks_count":15,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-03-18T05:51:16.620Z","etag":null,"topics":["bot","ci","github","github-bot","workflow"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fatedier.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-01-29T13:23:28.000Z","updated_at":"2025-02-03T09:39:18.000Z","dependencies_parsed_at":"2022-09-07T05:40:39.218Z","dependency_job_id":null,"html_url":"https://github.com/fatedier/freebot","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fatedier%2Ffreebot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fatedier%2Ffreebot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fatedier%2Ffreebot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fatedier%2Ffreebot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fatedier","download_url":"https://codeload.github.com/fatedier/freebot/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244880448,"owners_count":20525507,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bot","ci","github","github-bot","workflow"],"created_at":"2024-10-13T03:04:34.575Z","updated_at":"2025-03-21T22:32:15.789Z","avatar_url":"https://github.com/fatedier.png","language":"Go","readme":"# freebot\n\nfreebot 是一个帮助团队基于 github 的 issue 和 pull request 进行工作流管理的 bot。\n\n支持通过 comment 命令的方式执行一些经过前置检查的操作以及一些自动化的流程。\n\n## 目录\n\n\u003c!-- vim-markdown-toc GFM --\u003e\n\n* [简单示例](#简单示例)\n* [配置](#配置)\n* [功能](#功能)\n    * [插件](#插件)\n    * [别名](#别名)\n    * [角色](#角色)\n\n\u003c!-- vim-markdown-toc --\u003e\n\n### 简单示例\n\n通过示例的 [freebot.conf](./example/freebot.conf) 快速尝试。\n\n根据自己的需要修改 owner, repo 和 plugin 的相关配置。\n\n执行 `./freebot -c ./freebot.conf`\n\n在 github 上配置 repo 的 webhook 地址为 freebot 的监听地址。\n\n示例配置的简单工作流说明:\n\n1. 开发通过 `/status wip` 给 PR 加上 `status/wip` 的标签。\n2. 开发完成，开发执行 `/status wait-review` 将状态修改为待 review 且 `/cc @user1` 将 user1 指定为 reviewer。\n3. user1 如果 review 未通过，可以将状态修改为 `request-changes`。\n4. user1 如果 review 通过，`/status approved` 将状态修改为 `approved`。\n5. 开发执行 `/status testing` 并通过 `/cc @user2` 抄送 QA。\n6. QA 收到通知，开始测试，如果测试不通过，回到 `request-changes`，测试通过，则 `/status merge-ready`。\n7. 开发通过 `/merge` 将代码合并，进行后续的上线操作。\n\n### 配置\n\n由于 freebot 同时支持配置多个 repo，且每一个 repo 的 plugin 都可以有自定义的配置，为了避免单个配置文件过长，难以维护，支持将每一个 repo 的配置分散在一个指定目录中。\n\nfreebot 会用定期轮询的方式读取指定目录的配置，如果检测到配置有变化，会动态更新。\n\n在配置文件中配置 `repo_conf_dir` 来启用此功能，通过 `repo_conf_dir_update_interval_s` 指定轮询检测的间隔时间。\n\n`repo_conf_dir` 目录下的所有文件都会被解析为对应的 repo 的配置。\n\n格式如下:\n\n```json\n{\n    \"fatedier/freebot\": {\n        \"alias\": {},\n        \"roles\": {},\n        \"plugins\": {\n            \"assign\": {\n                \"enable\"\n            }\n        }\n    }\n}\n```\n\n### 功能\n\n#### 插件\n\n每一个插件提供了一些基础的能力，通过为每一个 repo 进行插件配置从而实现定制化的团队工作流。\n\n[插件详细说明](./plugin/README.md)\n\n#### 别名\n\n在 github 的 comment 中敲命令，没有自动补全是一件很繁琐的事，通过设置别名来简化这一操作。\n\n```\n{\n    \"alias\": {\n        \"cmds\": {\n            \"s\": \"status\"\n        },\n        \"labels\": {\n            \"wr\": \"wait-review\"\n        },\n        \"users\": {\n            \"aaa\": \"bbb\"\n        }\n    }\n}\n```\n\n可以给命令，标签和用户分别设置别名。\n\n原先需要添加评论 `/status wait-review`，使用别名后只需要输入 `/s wr` 即可。\n\n#### 角色\n\n可以为指定的用户分配指定角色，在之后的插件中的前置条件可以对 author 的角色有要求。例如限制只有 owner 角色的用户才能执行某些命令。\n\n还可以设置当存在某个 label 时某个用户为指定的角色。\n\n示例:\n\n```json\n{\n    \"roles\": {\n        \"owner\": [\"user1\", \"user2\"],\n        \"qa\": [\"qa1\"]\n    },\n    \"label_roles\": {\n        \"module/cmd\": {\n            \"owner\": [\"user3\"]\n        }\n    }\n}\n```\n\n上面的示例表示当 issue 或 PR 存在 `module/cmd` 的 label 时，user3 的角色是 owner。\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffatedier%2Ffreebot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffatedier%2Ffreebot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffatedier%2Ffreebot/lists"}