Monocle 旨在为开发团队提供:
它帮助团队和个人更好地组织日常工作,并检测变更生产和审查方式中的异常。
Monocle 支持 GitHub、GitLab 和 Gerrit。
如何开始使用 Monocle:
活动视图:
<img src="https://yellow-cdn.veclightyear.com/0a4dffa0/20b061b8-257b-4499-b6fc-91d6a75a60dc.png" width="70%" height="70%" />开发者看板:
<img src="https://yellow-cdn.veclightyear.com/0a4dffa0/b682cd7c-b614-433e-93c8-a898d6c8268b.png" width="70%" height="70%" />同行实力视图:
<img src="https://yellow-cdn.veclightyear.com/0a4dffa0/46cb96bc-ccfb-4ee6-82d2-bf9fbb552660.png" width="70%" height="70%" />以下过程描述了如何从 GitHub 仓库索引变更,然后如何启动 Web UI 来浏览指标。
部署基于 Docker,通过 docker-compose 定义。
此外,还支持以下部署方法:
git clone https://github.com/change-metrics/monocle.git cd monocle # 用默认的 API 密钥初始化 .secrets 文件,用于爬虫进程 echo CRAWLERS_API_KEY=$(uuidgen) > .secrets
crawler 和 api 服务使用 config.yaml
文件。
要爬取 GitHub 公共仓库,你必须在 https://github.com/settings/tokens 生成一个个人访问令牌(无需任何特定权限)。
然后创建配置文件 etc/config.yaml
。这里有一个你可以开始使用的示例。
确保在 .secrets
文件中写入 GITHUB_TOKEN=<github_token>
:
--- workspaces: - name: monocle crawlers: - name: github-tektoncd provider: github_organization: tektoncd github_repositories: - operator - pipeline update_since: '2021-01-01'
要爬取整个 tektoncd GitHub 组织,请从文件中删除 github_repositories
条目。
查看工作区部分,了解完整的配置说明。
docker-compose 文件设置为使用 Monocle 最新稳定版本(1.11.1)的容器镜像。建议使用最新的稳定版 Monocle。
然而,由于我们的 CI 发布最新(开发)容器镜像,因此可以运行最新版本。要做到这一点,请在 .env
文件中将 COMPOSE_MONOCLE_VERSION
设置为 latest
。
请参阅环境变量部分。
启动 Monocle:
docker-compose up -d
确保服务正在运行且健康:
docker-compose ps
检查服务日志:
docker-compose logs -f
你应该能够在 http://localhost:8080 访问 Web UI。
如有需要,请参阅故障排除部分。
Monocle 配置分为配置文件和各种环境变量。
环境变量配置系统设置和密钥。任何更改都需要重启 Monocle API。
配置文件包含非敏感数据,可以暴露在 Git 仓库中。 可以在 Git 仓库之上启用 CI/CD 流程,允许 Monocle 用户提出配置更改。Monocle API 会在配置更改时自动重新加载。
对于本地部署,默认设置就可以了。
以下设置可在 .env
文件中使用(参见 .env.sample
示例文件):
COMPOSE_ES_XMS
和COMPOSE_ES_XMX
用于更改ElasticSearch JVM堆大小。默认为512m。COMPOSE_MONOCLE_VERSION
用于指定特定版本。默认使用最新稳定版本。COMPOSE_MONOCLE_API_ADDR
用于设置容器暴露Monocle API的绑定地址。COMPOSE_MONOCLE_API_PORT
用于设置容器暴露Monocle API的绑定端口。COMPOSE_MONOCLE_PUBLIC_URL
用于配置访问UI和API的公共URL。
认证过程中进行用户重定向时需要此URL。默认为http://localhost:8080
COMPOSE_MONOCLE_WEBAPP_TITLE
用于更改Web应用程序的标题。默认为Monocle
。.secrets
文件中可用以下设置:
MONOCLE_JWK_GEN_KEY
用于设置本地JWT发行者密钥。密钥长度必须至少为64个字符。
默认情况下会自动生成密钥。MONOCLE_OIDC_<PROVIDER_NAME>_CLIENT_SECRET
用于设置Monocle请求ID令牌时使用的密钥(默认未设置)。MONOCLE_ADMIN_TOKEN
用于设置访问管理端点的令牌。
默认未设置且端点停用。Monocle配置文件由API和爬虫进程使用。文件格式为YAML。
该文件配置以下内容:
您可能想使用Dhall来管理它或更好地理解其架构(dhall-monocle)。
工作区使用专用的ElasticSearch索引。工作区定义了:
Monocle提供两种爬虫:
.secrets
文件用于存储爬虫向提供商进行身份验证时使用的凭据和API密钥。
crawlers
值是爬虫列表。每个爬虫由以下部分组成:
name
:用于标识爬虫的任意名称。update_since
:爬虫将获取自该日期以来创建/更新的变更。provider
:提供商设置workspaces: - name: demo crawlers: - name: spinnaker update_since: "2020-01-01" provider: {}
GitHub提供商设置
provider: github_organization: spinnaker # 可选设置 github_repositories: - pipeline github_url: https://github.com/api/graphql github_token: GITHUB_TOKEN
github_organization
是唯一必需的键。如果未指定github_repositories
,则
爬虫将爬取整个组织的仓库。如果指定了,则只会爬取
列出的仓库。要爬取个人GitHub帐户的仓库,您需要将
github_organization
设置为您的帐户名,并在github_repositories
键下列出仓库。
如果使用替代URL,可以指定github_url
。默认为"https://github.com/api/graphql"。
可以指定github_token
以使用替代环境变量名来查找
令牌值。默认为"GITHUB_TOKEN"
关于GitHub令牌(经典):
关于GitHub细粒度令牌(新):
GitHub提供商还可以配置为爬取特定GitHub用户创建的Pull-Requests。 例如,以下爬虫的提供商将获取john和jane用户的Pull-Requests和相关事件:
provider: github_users: - john - jane # 可选设置 github_url: https://github.com/api/graphql github_token: GITHUB_TOKEN
Gerrit提供商设置
provider: gerrit_url: https://review.opendev.org gerrit_repositories: - openstack/nova - openstack/neutron # 可选设置 gerrit_login: monocle gerrit_password: GERRIT_PASSWORD gerrit_prefix: opendev/
gerrit_url
是必需的,必须是Gerrit提供商的URL。
gerrit_repositories
是必需的,是爬虫将从中获取Reviews的仓库列表。
可以指定gerrit_login
以在提供商API上进行身份验证。
可以指定gerrit_password
以使用替代环境变量名来查找
密码。默认为"GERRIT_PASSWORD"
可以设置gerrit_prefix
以配置爬虫在仓库名称前添加前缀。
GitLab提供商设置
provider: gitlab_organization: redhat/centos-stream/ci-cd/zuul # 可选设置 gitlab_repositories: - jobs-config gitlab_url: https://gitlab.com/api/graphql gitlab_token: GITLAB_TOKEN
gitlab_organization
是唯一必填的键。如果未指定 gitlab_repositories
,爬虫将爬取整个组织的仓库。如果指定了,则只会爬取列出的仓库。
如果使用其他URL,可以指定 gitlab_url
。默认值为 "https://gitlab.com/api/graphql"。
可以指定 gitlab_token
来使用其他环境变量名查找令牌值。默认为 "GITLAB_TOKEN"。
要爬取私有仓库,你必须生成一个具有 "read_api" 权限的个人访问令牌。
Monocle 提供额外的爬虫,通过匹配 change_url
将任务/问题/RFE 附加到变更上。然后,变更会被增强,包含相关任务的信息,如 priority
或 score
。
对于 GitHub:
GitHub 任务数据爬虫会在 GitHub 变更爬虫 定义中指定仓库时自动运行。
使用"精细"令牌访问私有仓库时,请确保选择"Issues"权限。
对于 Bugzilla:
Bugzilla 提供者设置
provider: bugzilla_url: https://redhat.bugzilla.com bugzilla_products: - Awesome product # 可选设置 bugzilla_token: BUGZILLA_TOKEN
必须指定 bugzilla_product
。爬虫将爬取列出的产品中包含外部错误引用 ext_bz_bug_id
的 bug。爬虫假定外部引用用于链接到变更(拉取请求/审查)。
可以指定 bugzilla_token
来使用其他环境变量名查找令牌值。默认为 "BUGZILLA_TOKEN"。
注意,此爬虫由 crawler
容器管理。
可以在工作区配置中定义项目。项目由名称标识,并允许设置以下筛选属性:
以下是配置示例。
workspaces: - name: example crawlers: - name: openstack provider: gerrit_url: https://review.opendev.org gerrit_repositories: - ^openstack/.* update_since: "2021-01-01" projects: - name: compute repository_regex: ".*nova.*" - name: compute-tests file_regex: "test[s]/.*" repository_regex: ".*nova.*" - name: deployment repository_regex: ".*tripleo.*|.*puppet.*|.*ansible.*" branch_regex: "master"
可以查询 Monocle API 端点 api/1/get_projects
以获取给定工作区的已定义项目列表。参见 Monocle OpenAPI。
Monocle 查询端点处理查询参数:project
。
Monocle 能够从多个代码审查系统索引变更。一个贡献者可能在不同的代码审查系统中有不同的身份。因此,Monocle 提供了一个配置部分来为贡献者定义别名。
假设 Monocle 工作区配置为从 github.com 和 review.opendev.org(Gerrit)获取变更,我们希望 John 的指标在 John Doe
身份下合并。
workspaces: - name: example idents: - ident: John Doe aliases: - github.com/john-doe - review.opendev.org/John Doe/12345 - AuthProviderUID:jdoe crawlers: - name: github-containers provider: github_organization: containers github_token: <github_token> update_since: '2000-01-01' - name: gerrit-opendev provider: gerrit_url: https://review.opendev.org gerrit_repositories: - ^openstack/.* update_since: '2000-01-01'
github.com 或 GitHub 企业实例上的贡献者 ID 格式为 <域名>/<登录名>
。
Gerrit 实例上的贡献者 ID 格式为 <域名>/<全名>/<gerrit-用户-id>
。
必须更新数据库对象以反映配置。更新 config.yaml
后,运行以下命令:
docker-compose run --rm --no-deps api monocle janitor update-idents --elastic elastic:9200 --config /etc/monocle/config.yaml
Monocle 中的群组允许将变更作者分组,并从 Web 界面对其进行筛选。
群组成员资格通过配置的 idents 部分定义。
以下是一个示例:
workspaces: - name: example idents: - ident: John Doe aliases: - github.com/john-doe - review.opendev.org/John Doe/12345 groups: - devs - ident: Jane Doe aliases: - github.com/jane-doe groups: - devs - ptl
Monocle 配置文件提供了一种方法来定义可在搜索查询中使用的别名。一个用例可能是将 bot
作者分组,以便轻松地从搜索结果中排除它们。
以下是一个示例:
workspaces: - name: example search_aliases: - name: bots alias: '(author:"github-actions" or author:"bedevere-bot")'
然后查询可以是:"from:now-3weeks and not bot"。
本节配置WEB应用程序在"关于"模态框中显示的信息。
以下是一个示例:
about: links: - category: 社区 name: Monocle配置 url: https://github.com/change-metrics/demo-node-config
本节配置全局爬虫设置。
注意,
crawlers
是配置文件根级别的参数。
以下是一个示例:
crawlers: # 每次迭代间隔一小时 loop_delay_sec: 3600
Monocle支持通过OIDC(OpenID Connect)提供程序进行用户身份验证。
一旦通过身份验证,Monocle能够显示个性化内容,如解析查询中的self值,例如查询:author: self。
Monocle一次只支持一个提供程序。
请注意,默认情况下,如果未配置或配置错误身份验证系统,Monocle提供一个未认证登录机制,允许用户输入其作者名称。
以下是配置示例:
auth: auth_provider: oidc_client_id: my_client_id oidc_issuer_url: https://accounts.google.com oidc_provider_name: my provider oidc_user_claim: email enforce_auth: false
需要在OIDC提供程序上配置的重定向URI是:<MONOCLE_PUBLIC_URL>/api/2/auth/cb
。
此外,还需要两个额外的设置(环境变量)来启用身份验证提供程序:
当身份验证提供程序正确设置时,Monocle API会生成以下日志行:
2022-10-11 10:39:11 INFO Monocle.Main:149: AuthSystemReady {"provider":"my provider"}
Monocle向WEB应用程序用户发放自己的JWT。OIDC提供程序发放的JWT用于获取已认证用户的信息,如通过oidc_user_claim获取其唯一uid。Monocle使用(来自OIDC提供程序的)UID通过idents设置发现匹配的Monocle Ident。匹配的ident定义了一个别名,格式为AuthProviderUID:<user_unique_id>。如果没有匹配的ident,则使用用户声明值。
Monocle JWT的有效期为24小时,过期后用户必须再次登录OIDC提供程序。
Monocle可以发放服务令牌,供使用Monocle API的应用程序使用。要请求令牌,您需要执行以下调用:
curl -XPOST -d '{"token": "<admin_token>"}' -H "Content-type: application/json" <monocle_public_url>/auth/get {"jwt":"eyJhbGciOiJIUzUxMiJ9.eyJkYXQiOnsiYURlZmF1bHRNdWlkIjoiYm90IiwiYU11aWRNYXAiOnt9fX0.bmj5vcxXxz2LmkrVKxX8jd-aYzHeTng_QBzR_9YZwCb9ToKA59TVlN1wZf6hhPlUX1VU82Y94gVCREDifintZg"}
然后设置Authorization头以访问Monocle API:
curl -XPOST -d '{"void": ""}' -H "Content-type: application/json" -H 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJkYXQiOnsiYURlZmF1bHRNdWlkIjoiYm90IiwiYU11aWRNYXAiOnt9fX0.bmj5vcxXxz2LmkrVKxX8jd-aYzHeTng_QBzR_9YZwCb9ToKA59TVlN1wZf6hhPlUX1VU82Y94gVCREDifintZg' <monocle_public_url>/auth/whoami
必须设置MONOCLE_ADMIN_TOKEN
才能启用此端点。
以下是需要添加到.secrets
文件中的预期环境变量:
CRAWLERS_API_KEY
: 爬虫用于索引数据的任意API密钥。GITHUB_TOKEN
: GitHub爬虫的API密钥。GITLAB_TOKEN
: GitLab爬虫的API密钥。打开示例config.yaml。
ElasticSearch可能需要一些功能才能在容器模式下运行。查看日志以确认它是否正确启动:
$ docker-compose logs elastic
例如,您可能需要增加此系统参数:
$ sudo sysctl -w vm.max_map_count=262144
或使数据目录对其他用户可写:
$ chmod o+w data
要删除一个工作区(工作区是一个elasticsearch索引):
# 使用以下命令列出索引: docker-compose run --rm --no-deps api curl http://elastic:9200/_aliases?pretty=true # 使用以下命令删除索引: docker-compose run --rm --no-deps api curl -XDELETE http://elastic:9200/<索引名称>
ElasticSearch 为新索引设置默认设置。基于正则表达式的查询的默认设置值可能不适合您的使用,特别是当您的项目定义使用超过该限制的正则表达式时。但是,可以使用以下命令增加限制:
docker-compose run --rm --no-deps api curl \ -XPUT http://localhost:9200/monocle.changes.1.<索引名称>/_settings \ -H "Content-Type: application/json" -d '{"index": {"max_regex_length": 50000}}'
爬虫默认的加密套件可能较为严格,无法与某些远程服务器负载均衡器公布的不受支持的加密套件配合使用。如果您在爬虫容器中遇到"wrong signature type"错误,应考虑在docker-compose配置文件中使用TLS_CIPHER
环境变量更改加密套件。您可以在Fedora更新日志中找到额外信息。
要禁用TLS验证,请将TLS_NO_VERIFY
环境变量设置为1
。