极狐 GitLab

面向开发者的 Rake 任务

Rake 任务可供开发者及其他为极狐GitLab 做贡献的人员使用。

使用开发者种子设置数据库#

如果你的数据库用户没有高级权限,你必须在运行此命令之前手动创建数据库。

shell
bundle exec rake setup

setup 任务是 gitlab:setup 的别名。 该任务调用 db:reset 创建数据库,并调用 db:seed_fu 填充数据库。 db:setup 调用了 db:seed,但没有任何作用。

环境变量#

MASS_INSERT:创建数百万用户(2m)、项目(5m)及其关系。强烈建议在开发时使用它运行种子数据,以捕获慢查询。预计该过程需要额外 20 分钟。

另请参见批量插入 Rails 模型

LARGE_PROJECTS:从预定义的 URL 集合创建大型项目(通过导入)。

填充数据#

为所有项目或单个项目填充议题#

你可以使用 gitlab:seed:issues 任务为所有项目或指定项目填充议题:

shell
# 所有项目 bin/rake gitlab:seed:issues # 特定项目 bin/rake "gitlab:seed:issues[group-path/project-path]"

默认情况下,这会为每个项目在过去 5 周内每周平均填充 2 个议题。

为洞察图表填充议题#

Tier: 旗舰版

Offering: JihuLab.com,私有化部署

你可以使用 gitlab:seed:insights:issues 任务专门为洞察图表填充议题:

shell
# 所有项目 bin/rake gitlab:seed:insights:issues # 特定项目 bin/rake "gitlab:seed:insights:issues[group-path/project-path]"

默认情况下,这会为每个项目在过去 52 周内每周平均填充 10 个议题。所有议题还会随机标记团队、类型、严重性和优先级。

填充带有子群组的群组#

你可以使用 gitlab:seed:group_seed 任务填充包含里程碑/项目的子群组群组:

shell
bin/rake "gitlab:seed:group_seed[subgroup_depth, username, organization_path]"

如果 极狐GitLab 实例具有史诗功能,群组还会额外填充史诗。

填充 Runner 集群测试环境#

使用 gitlab:seed:runner_fleet 任务填充完整的 Runner 集群,特别是包含 Runner 和流水线的带有子群组和项目的群组:

shell
bin/rake "gitlab:seed:runner_fleet[username, registration_prefix, runner_count, job_count]"

默认情况下,该 Rake 任务使用 root 用户名创建 40 个 Runner 和 400 个作业。

Rendering chart...

为监控仪表板填充自定义指标#

监控仪表板支持多种不同类型的指标。

要导入这些指标,你可以运行:

shell
bundle exec rake 'gitlab:seed:development_metrics[your_project_id]'

为项目填充漏洞#

你可以为项目填充安全漏洞

shell
# 填充所有项目 bin/rake 'gitlab:seed:vulnerabilities' # 填充特定项目 bin/rake 'gitlab:seed:vulnerabilities[group-path/project-path]'

为项目填充环境#

你可以为项目填充环境

默认情况下,这会创建 10 个环境,每个环境的前缀为 ENV_。运行此命令只需要 project_path

shell
bundle exec rake "gitlab:seed:project_environments[project_path, seed_count, prefix]" # 示例 bundle exec rake "gitlab:seed:project_environments[flightjs/Flight]" bundle exec rake "gitlab:seed:project_environments[flightjs/Flight, 25, FLIGHT_ENV_]"

为群组填充依赖项#

shell
bundle exec rake gitlab:seed:dependencies

填充 CI 变量#

你可以为项目、群组或实例填充 CI 变量

默认情况下,每个命令创建 10 个 CI 变量。变量名会以其默认前缀开头(项目级变量为 VAR_,群组级变量为 GROUP_VAR_,实例级变量为 INSTANCE_VAR_)。

实例级变量没有环境作用域。如果未提供 environment_scope,项目级和群组级变量使用默认的 "*" 环境作用域。如果 environment_scope 设置为 "unique",则每个变量都会使用其自己的唯一环境创建。

shell
1# 为项目填充项目级 CI 变量 2# 仅需 `project_path` 即可运行此命令。 3bundle exec rake "gitlab:seed:ci_variables_project[project_path, seed_count, environment_scope, prefix]" 4 5# 为群组填充群组级 CI 变量 6# 仅需 `group_name` 即可运行此命令。 7bundle exec rake "gitlab:seed:ci_variables_group[group_name, seed_count, environment_scope, prefix]" 8 9# 为实例填充实例级 CI 变量 10bundle exec rake "gitlab:seed:ci_variables_instance[seed_count, prefix]" 11 12# 示例 13bundle exec rake "gitlab:seed:ci_variables_project[flightjs/Flight]" 14bundle exec rake "gitlab:seed:ci_variables_project[flightjs/Flight, 25, staging]" 15bundle exec rake "gitlab:seed:ci_variables_project[flightjs/Flight, 25, unique, CI_VAR_]" 16 17bundle exec rake "gitlab:seed:ci_variables_group[group_name]" 18bundle exec rake "gitlab:seed:ci_variables_group[group_name, 25, staging]" 19bundle exec rake "gitlab:seed:ci_variables_group[group_name, 25, unique, CI_VAR_]" 20 21bundle exec rake "gitlab:seed:ci_variables_instance" 22bundle exec rake "gitlab:seed:ci_variables_instance[25, CI_VAR_]"

为合并列车开发填充项目#

填充一个配置了合并列车以及 20 个合并请求(每个包含 3 次提交)的项目。命令:

shell
rake gitlab:seed:merge_trains:project

自动化#

如果你非常确定要清除当前数据库并重新填充种子数据,你可以将 FORCE 环境变量设置为 yes

shell
FORCE=yes bundle exec rake setup

这会跳过操作确认/安全检查,使你无需手动回答 yes

丢弃 stdout#

由于脚本会打印大量信息,可能会降低终端速度,如果将其重定向到文件,将生成超过 20G 的日志。如果我们不关心输出,可以将其重定向到 /dev/null

shell
echo 'yes' | bundle exec rake setup > /dev/null

由于你无法看到来自 stdout 的问题,你可能只想 echo 'yes' 以使其继续运行。它仍会在 stderr 上打印错误,因此不必担心遗漏错误。

额外的项目种子选项#

你可以传递一些环境标志来更改项目的填充方式。

  • SIZE:默认为 8,最大:32。要创建的项目数量。
  • LARGE_PROJECTS:默认为 false。如果设置,会克隆 6 个大型项目以帮助测试。
  • FORK:默认为 false。如果设置为 true,会派生 torvalds/linux 五次。也可以设置为现有项目的 full_path 以派生该项目。

运行测试#

要运行测试,你可以使用以下命令:

  • bin/rake spec 运行 RSpec 套件
  • bin/rake spec:unit 仅运行单元测试
  • bin/rake spec:integration 仅运行集成测试
  • bin/rake spec:system 仅运行系统测试

bin/rake spec 需要大量时间才能通过。与其在本地运行完整的测试套件,不如运行与你的更改相关的单个测试或目录,这样可以节省大量时间。提交合并请求后,CI 会为你运行完整的测试套件。合并请求中的绿色 CI 状态表示完整的测试套件已通过。

你不能运行 rspec .,因为这会尝试运行它能找到的所有 _spec.rb 文件,包括 /tmp 中的文件。

你可以将 RSpec 命令行选项传递给 spec:unitspec:integrationspec:system 任务。例如,bin/rake "spec:unit[--tag ~geo --dry-run]"

对于 RSpec 测试,要运行单个测试文件,你可以运行:

shell
bin/rspec spec/controllers/commit_controller_spec.rb

要在一个目录中运行多个测试:

  • bin/rspec spec/requests/api/ 用于 RSpec 测试,如果你只想测试 API

在你的机器上运行合并请求流水线中失败的 RSpec 测试#

如果你的合并请求流水线因 RSpec 测试失败而失败,你可以使用以下 Rake 任务在你的机器上运行所有失败的测试:

shell
bin/rake spec:merge_request_rspec_failure

此 Rake 任务有一些注意事项:

  • 你的机器上必须位于与合并请求源分支相同的分支上。
  • 流水线必须已完成。
  • 你可能需要等待测试报告被解析,然后重试。

此 Rake 任务依赖于单元测试报告功能,该功能仅在首次请求时才会被解析。

加速测试、Rake 任务和迁移#

Spring 是一个 Rails 应用程序预加载器。它通过在后台保持应用程序运行来加速开发,因此你无需在每次运行测试、Rake 任务或迁移时都启动它。

如果你想使用它,必须将 ENABLE_SPRING 环境变量导出为 1

shell
export ENABLE_SPRING=1

或者,你可以在每次 spec 运行时使用以下命令,

shell
bundle exec spring rspec some_spec.rb

RuboCop 任务#

生成初始 RuboCop TODO 列表#

生成初始列表的一种方法是运行 Rake 任务 rubocop:todo:generate

shell
bundle exec rake rubocop:todo:generate

要为特定的 RuboCop 规则生成 TODO 列表,请将它们以逗号分隔作为参数传递给 Rake 任务:

shell
bundle exec rake 'rubocop:todo:generate[Gitlab/NamespacedClass,Lint/Syntax]' bundle exec rake rubocop:todo:generate\[Gitlab/NamespacedClass,Lint/Syntax\]

某些 Shell 需要对括号进行转义或引号。

请参阅解决 RuboCop 异常了解如何继续。

以优雅模式运行 RuboCop#

你可以在“优雅模式”下运行 RuboCop。这意味着所有启用的 cop 规则,如果激活了“宽限期”(通过 Details: grace period),都会被静默。

运行:

shell
bundle exec rake 'rubocop:check:graceful' bundle exec rake 'rubocop:check:graceful[Gitlab/NamespacedClass]'

编译前端资产#

在开发中你通常不需要手动编译前端资产,但如果你需要测试资产在生产环境中如何编译,可以使用以下命令:

shell
RAILS_ENV=production NODE_ENV=production bundle exec rake gitlab:assets:compile

这会编译并压缩所有 JavaScript 和 CSS 资产,并将它们连同所有其他前端资产(图像、字体等)复制到 /public/assets 中,以便轻松检查。

Emoji 任务#

要更新 Emoji 别名文件(用于 Emoji 自动补全),请运行以下命令:

shell
bundle exec rake tanuki_emoji:aliases

要导入回退 Emoji 图像,请运行以下命令:

shell
bundle exec rake tanuki_emoji:import

要根据当前可用的 Emoji 更新 Emoji 摘要文件(用于 Emoji 自动补全),请运行以下命令:

shell
bundle exec rake tanuki_emoji:digests

要生成包含所有 Emoji 的精灵图文件,请运行:

shell
bundle exec rake tanuki_emoji:sprite

有关详细说明,请参阅如何更新 Emoji

更新项目模板#

请参阅为 极狐GitLab 团队成员贡献项目模板

生成路由列表#

要查看完整的 API 路由列表,你可以运行:

shell
bundle exec rake grape:path_helpers

生成的列表包括完整的 API 端点列表和功能性的 RESTful API 动词。

对于 Rails 控制器,运行:

shell
bundle exec rails routes

由于生成这些内容需要一些时间,因此将输出保存到文件以便快速参考通常很有帮助。

显示过时的 ignored_columns#

要查看所有过时的 ignored_columns 定义列表,请运行:

shell
bundle exec rake db:obsolete_ignored_columns

你可以随意从它们的 ignored_columns 定义中移除这些定义。

验证 GraphQL 查询#

要检查一个或多个前端 GraphQL 查询的有效性,请运行:

shell
1# 验证所有查询 2bundle exec rake gitlab:graphql:validate 3# 验证一个查询 4bundle exec rake gitlab:graphql:validate[path/to/query.graphql] 5# 验证一个目录 6bundle exec rake gitlab:graphql:validate[path/to/queries]

这会打印一份报告,其中包含每个查询的条目,解释每个查询未通过验证的原因。

我们在验证过程中会去除 @client 字段,因此务必使用 @client 指令标记客户端字段,以避免误报。

分析 GraphQL 查询#

类似于 SQL 中的 ANALYZE,我们可以运行 gitlab:graphql:analyze 来估算运行查询的成本。

用法:

shell
1# 分析所有查询 2bundle exec rake gitlab:graphql:analyze 3# 分析一个查询 4bundle exec rake gitlab:graphql:analyze[path/to/query.graphql] 5# 分析一个目录 6bundle exec rake gitlab:graphql:analyze[path/to/queries]

这会为每个查询打印一份报告,包括查询的复杂度(如果有效)。

在某些情况下,复杂度取决于参数,因此报告的复杂度是对上限的尽力评估。

更新 GraphQL 文档和模式定义#

要根据 极狐GitLab 模式生成 GraphQL 文档,请运行:

shell
bundle exec rake gitlab:graphql:compile_docs

在当前状态下,该 Rake 任务:

  • 为 GraphQL 对象生成输出。
  • 将输出放置在 doc/api/graphql/reference/_index.md

这使用了 graphql-docs gem 的一些功能,如其模式解析器和辅助方法。文档生成器代码来自我们这边,提供了更大的灵活性,例如使用 Haml 模板和生成 Markdown 文件。

要编辑内容,你可能需要编辑以下内容:

  • 模板。你可以在 tooling/graphql/docs/templates/default.md.haml 编辑模板。实际的渲染器位于 Tooling::Graphql::Docs::Renderer
  • 代码中适用的 description 字段,该字段会更新机器可读的模式文件,然后由前面描述的 rake 任务使用。

@parsed_schemagraphql-docs gem 期望可用的实例变量。Gitlab::Graphql::Docs::Helper 定义了我们使用的 object 方法。这也是你应该为想要显示的新类型实现任何新方法的地方。

更新机器可读的模式文件#

要根据 极狐GitLab 模式生成 GraphQL 模式文件,请运行:

shell
bundle exec rake gitlab:graphql:schema:dump

这使用 GraphQL Ruby 的内置 Rake 任务生成 IDL 和 JSON 格式的文件。

更新文档和模式定义#

以下命令结合了更新 GraphQL 文档和模式定义更新机器可读的模式文件的目的:

shell
bundle exec rake gitlab:graphql:update_all

更新审计事件类型文档#

有关更新审计事件类型文档的信息,请参阅生成文档

为错误跟踪功能更新 OpenAPI 客户端#

此 Rake 任务需要安装 docker

要更新位于 gems/error_tracking_open_api 中的 OpenAPI 客户端生成代码,请运行以下命令:

shell
1# 运行 rake 任务 2bundle exec rake gems:error_tracking_open_api:generate 3 4# 审查并测试更改 5 6# 提交更改 7git commit -m 'Update ErrorTrackingOpenAPI from OpenAPI definition' gems/error_tracking_open_api

</a