面向开发者的 Rake 任务
Rake 任务可供开发者及其他为极狐GitLab 做贡献的人员使用。
使用开发者种子设置数据库
如果你的数据库用户没有高级权限,你必须在运行此命令之前手动创建数据库。
shellbundle 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 任务填充包含里程碑/项目的子群组群组:
shellbin/rake "gitlab:seed:group_seed[subgroup_depth, username, organization_path]"
如果 极狐GitLab 实例具有史诗功能,群组还会额外填充史诗。
填充 Runner 集群测试环境
使用 gitlab:seed:runner_fleet 任务填充完整的 Runner 集群,特别是包含 Runner 和流水线的带有子群组和项目的群组:
shellbin/rake "gitlab:seed:runner_fleet[username, registration_prefix, runner_count, job_count]"
默认情况下,该 Rake 任务使用 root 用户名创建 40 个 Runner 和 400 个作业。
Rendering chart...
为监控仪表板填充自定义指标
监控仪表板支持多种不同类型的指标。
要导入这些指标,你可以运行:
shellbundle 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。
shellbundle 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_]"
为群组填充依赖项
shellbundle exec rake gitlab:seed:dependencies
填充 CI 变量
你可以为项目、群组或实例填充 CI 变量。
默认情况下,每个命令创建 10 个 CI 变量。变量名会以其默认前缀开头(项目级变量为 VAR_,群组级变量为 GROUP_VAR_,实例级变量为 INSTANCE_VAR_)。
实例级变量没有环境作用域。如果未提供 environment_scope,项目级和群组级变量使用默认的 "*" 环境作用域。如果 environment_scope 设置为 "unique",则每个变量都会使用其自己的唯一环境创建。
shell1# 为项目填充项目级 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 次提交)的项目。命令:
shellrake gitlab:seed:merge_trains:project
自动化
如果你非常确定要清除当前数据库并重新填充种子数据,你可以将 FORCE 环境变量设置为 yes:
shellFORCE=yes bundle exec rake setup
这会跳过操作确认/安全检查,使你无需手动回答 yes。
丢弃 stdout
由于脚本会打印大量信息,可能会降低终端速度,如果将其重定向到文件,将生成超过 20G 的日志。如果我们不关心输出,可以将其重定向到 /dev/null:
shellecho '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:unit、spec:integration 和 spec:system 任务。例如,bin/rake "spec:unit[--tag ~geo --dry-run]"。
对于 RSpec 测试,要运行单个测试文件,你可以运行:
shellbin/rspec spec/controllers/commit_controller_spec.rb
要在一个目录中运行多个测试:
- bin/rspec spec/requests/api/ 用于 RSpec 测试,如果你只想测试 API
在你的机器上运行合并请求流水线中失败的 RSpec 测试
如果你的合并请求流水线因 RSpec 测试失败而失败,你可以使用以下 Rake 任务在你的机器上运行所有失败的测试:
shellbin/rake spec:merge_request_rspec_failure
此 Rake 任务有一些注意事项:
- 你的机器上必须位于与合并请求源分支相同的分支上。
- 流水线必须已完成。
- 你可能需要等待测试报告被解析,然后重试。
此 Rake 任务依赖于单元测试报告功能,该功能仅在首次请求时才会被解析。
加速测试、Rake 任务和迁移
Spring 是一个 Rails 应用程序预加载器。它通过在后台保持应用程序运行来加速开发,因此你无需在每次运行测试、Rake 任务或迁移时都启动它。
如果你想使用它,必须将 ENABLE_SPRING 环境变量导出为 1:
shellexport ENABLE_SPRING=1
或者,你可以在每次 spec 运行时使用以下命令,
shellbundle exec spring rspec some_spec.rb
RuboCop 任务
生成初始 RuboCop TODO 列表
生成初始列表的一种方法是运行 Rake 任务 rubocop:todo:generate:
shellbundle exec rake rubocop:todo:generate
要为特定的 RuboCop 规则生成 TODO 列表,请将它们以逗号分隔作为参数传递给 Rake 任务:
shellbundle 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),都会被静默。
运行:
shellbundle exec rake 'rubocop:check:graceful' bundle exec rake 'rubocop:check:graceful[Gitlab/NamespacedClass]'
编译前端资产
在开发中你通常不需要手动编译前端资产,但如果你需要测试资产在生产环境中如何编译,可以使用以下命令:
shellRAILS_ENV=production NODE_ENV=production bundle exec rake gitlab:assets:compile
这会编译并压缩所有 JavaScript 和 CSS 资产,并将它们连同所有其他前端资产(图像、字体等)复制到 /public/assets 中,以便轻松检查。
Emoji 任务
要更新 Emoji 别名文件(用于 Emoji 自动补全),请运行以下命令:
shellbundle exec rake tanuki_emoji:aliases
要导入回退 Emoji 图像,请运行以下命令:
shellbundle exec rake tanuki_emoji:import
要根据当前可用的 Emoji 更新 Emoji 摘要文件(用于 Emoji 自动补全),请运行以下命令:
shellbundle exec rake tanuki_emoji:digests
要生成包含所有 Emoji 的精灵图文件,请运行:
shellbundle exec rake tanuki_emoji:sprite
有关详细说明,请参阅如何更新 Emoji。
更新项目模板
生成路由列表
要查看完整的 API 路由列表,你可以运行:
shellbundle exec rake grape:path_helpers
生成的列表包括完整的 API 端点列表和功能性的 RESTful API 动词。
对于 Rails 控制器,运行:
shellbundle exec rails routes
由于生成这些内容需要一些时间,因此将输出保存到文件以便快速参考通常很有帮助。
显示过时的 ignored_columns
要查看所有过时的 ignored_columns 定义列表,请运行:
shellbundle exec rake db:obsolete_ignored_columns
你可以随意从它们的 ignored_columns 定义中移除这些定义。
验证 GraphQL 查询
要检查一个或多个前端 GraphQL 查询的有效性,请运行:
shell1# 验证所有查询 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 来估算运行查询的成本。
用法:
shell1# 分析所有查询 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 文档,请运行:
shellbundle 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_schema 是 graphql-docs gem 期望可用的实例变量。Gitlab::Graphql::Docs::Helper 定义了我们使用的 object 方法。这也是你应该为想要显示的新类型实现任何新方法的地方。
更新机器可读的模式文件
要根据 极狐GitLab 模式生成 GraphQL 模式文件,请运行:
shellbundle exec rake gitlab:graphql:schema:dump
这使用 GraphQL Ruby 的内置 Rake 任务生成 IDL 和 JSON 格式的文件。
更新文档和模式定义
以下命令结合了更新 GraphQL 文档和模式定义和更新机器可读的模式文件的目的:
shellbundle exec rake gitlab:graphql:update_all
更新审计事件类型文档
有关更新审计事件类型文档的信息,请参阅生成文档。
为错误跟踪功能更新 OpenAPI 客户端
此 Rake 任务需要安装 docker。
要更新位于 gems/error_tracking_open_api 中的 OpenAPI 客户端生成代码,请运行以下命令:
shell1# 运行 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