开发者的 Rake 任务
Rake 任务可供开发者和为 GitLab 做贡献的其他人员使用。
使用开发者种子设置数据库
如果您的数据库用户没有高级权限,在运行此命令之前必须手动创建数据库。
bundle exec rake setupsetup 任务是 gitlab:setup 的别名。
此任务调用 db:reset 创建数据库,并调用 db:seed_fu 填充数据库。
db:setup 调用 db:seed 但此操作不执行任何操作。
环境变量
MASS_INSERT: 创建数百万用户(200万)、项目(500万)及其关联关系。强烈建议在运行种子数据时使用此选项来捕获开发过程中的慢查询。预计此过程会额外花费最多 20 分钟。
另请参阅 批量插入 Rails 模型。
LARGE_PROJECTS: 从预定义的 URL 集合中创建大型项目(通过导入)。
填充数据
为所有项目或单个项目填充问题
您可以使用 gitlab:seed:issues 任务为所有或指定项目填充问题:
# 所有项目
bin/rake gitlab:seed:issues
# 特定项目
bin/rake "gitlab:seed:issues[group-path/project-path]"默认情况下,此操作为每个项目在过去 5 周内平均每周填充 2 个问题。
为 Insights 图表填充问题
- 版本:Ultimate
- 产品:GitLab.com、GitLab Self-Managed、GitLab Dedicated
您可以使用 gitlab:seed:insights:issues 任务专门为 Insights 图表 填充问题:
# 所有项目
bin/rake gitlab:seed:insights:issues
# 特定项目
bin/rake "gitlab:seed:insights:issues[group-path/project-path]"默认情况下,此操作为每个项目在过去 52 周内平均每周填充 10 个问题。所有问题还会随机标记有团队、类型、严重性和优先级标签。
填充包含子群组的群组
您可以使用 gitlab:seed:group_seed 任务填充包含里程碑/项目/问题的子群组:
bin/rake "gitlab:seed:group_seed[subgroup_depth, username, organization_path]"如果 GitLab 实例启用了 epics 功能,群组还会额外填充 epics。
填充运行器舰队测试环境
使用 gitlab:seed:runner_fleet 任务填充完整的运行器舰队,特别是包含运行器和管道的子群组和项目:
bin/rake "gitlab:seed:runner_fleet[username, registration_prefix, runner_count, job_count]"默认情况下,Rake 任务使用 root 用户名创建 40 个运行器和 400 个作业。
graph TD
G1[顶级群组 1] --> G11
G2[顶级群组 2] --> G21
G11[群组 1.1] --> G111
G11[群组 1.1] --> G112
G111[群组 1.1.1] --> P1111
G112[群组 1.1.2] --> P1121
G21[群组 2.1] --> P211
P1111[项目 1.1.1.1<br><i>70% 的作业,发送到前 5 个运行器</i>]
P1121[项目 1.1.2.1<br><i>15% 的作业,发送到前 5 个运行器</i>]
P211[项目 2.1.1<br><i>15% 的作业,发送到前 5 个运行器</i>]
IR1[实例运行器]
P1111R1[共享运行器]
P1111R[项目 1.1.1.1 运行器<br>20% 总运行器]
P1121R[项目 1.1.2.1 运行器<br>49% 总运行器]
G111R[群组 1.1.1 运行器<br>30% 总运行器<br><i>剩余作业</i>]
G21R[群组 2.1 运行器<br>1% 总运行器]
P1111 --> P1111R1
P1111 --> G111R
P1111 --> IR1
P1111 --> P1111R
P1121 --> P1111R1
P1121 --> IR1
P1121 --> P1121R
P211 --> P1111R1
P211 --> G21R
P211 --> IR1
classDef groups fill:#09f6,color:#000000,stroke:#333,stroke-width:3px;
classDef projects fill:#f96a,color:#000000,stroke:#333,stroke-width:2px;
class G1,G2,G11,G111,G112,G21 groups
class P1111,P1121,P211 projects
为监控仪表板填充自定义指标
监控仪表板支持多种不同类型的指标。
要导入这些指标,您可以运行:
bundle exec rake 'gitlab:seed:development_metrics[your_project_id]'用漏洞填充项目
您可以使用 安全漏洞 填充项目。
# 填充所有项目
bin/rake 'gitlab:seed:vulnerabilities'
# 填充特定项目
bin/rake 'gitlab:seed:vulnerabilities[group-path/project-path]'用环境填充项目
您可以使用 环境 填充项目。
默认情况下,此操作创建 10 个环境,每个环境都有前缀 ENV_。
运行此命令只需要 project_path。
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_]"用依赖关系填充群组
bundle exec rake gitlab:seed:dependencies填充 CI 变量
您可以使用 CI 变量 填充项目、群组或实例。
默认情况下,每个命令创建 10 个 CI 变量。变量名会以其默认前缀(项目级变量为 VAR_,群组级变量为 GROUP_VAR_,实例级变量为 INSTANCE_VAR_)作为前缀。
实例级变量没有环境作用域。如果没有提供 environment_scope,项目级和群组级变量使用默认的 "*" 环境作用域。如果 environment_scope 设置为 "unique",则每个变量都会创建其自己的唯一环境。
# 用项目级 CI 变量填充项目
# 运行此命令只需要 `project_path`。
bundle exec rake "gitlab:seed:ci_variables_project[project_path, seed_count, environment_scope, prefix]"
# 用群组级 CI 变量填充群组
# 运行此命令只需要 `group_name`。
bundle exec rake "gitlab:seed:ci_variables_group[group_name, seed_count, environment_scope, prefix]"
# 用实例级 CI 变量填充实例
bundle exec rake "gitlab:seed:ci_variables_instance[seed_count, prefix]"
# 示例
bundle exec rake "gitlab:seed:ci_variables_project[flightjs/Flight]"
bundle exec rake "gitlab:seed:ci_variables_project[flightjs/Flight, 25, staging]"
bundle exec rake "gitlab:seed:ci_variables_project[flightjs/Flight, 25, unique, CI_VAR_]"
bundle exec rake "gitlab:seed:ci_variables_group[group_name]"
bundle exec rake "gitlab:seed:ci_variables_group[group_name, 25, staging]"
bundle exec rake "gitlab:seed:ci_variables_group[group_name, 25, unique, CI_VAR_]"
bundle exec rake "gitlab:seed:ci_variables_instance"
bundle exec rake "gitlab:seed:ci_variables_instance[25, CI_VAR_]"为合并列车开发填充项目
填充配置了合并列车且包含 20 个合并请求(每个请求包含 3 个提交)的项目。命令:
rake gitlab:seed:merge_trains:project自动化
如果您非常确定要清空当前数据库并重新填充种子数据,可以将 FORCE 环境变量设置为 yes:
FORCE=yes bundle exec rake setup这将跳过操作确认/安全检查,让您无需手动回答 yes。
丢弃 stdout
由于脚本会打印大量信息,可能会减慢您的终端速度,如果您只是将其重定向到文件,将会生成超过 20G 的日志。如果我们不关心输出,可以将其重定向到 /dev/null:
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:unit、spec:integration 和 spec:system 任务。例如,bin/rake "spec:unit[--tag ~geo --dry-run]"。
对于 RSpec 测试,要运行单个测试文件,您可以运行:
bin/rspec spec/controllers/commit_controller_spec.rb要运行一个目录中的多个测试:
- 如果您只想测试 API,可以使用
bin/rspec spec/requests/api/运行 RSpec 测试
在您的机器上运行合并请求管道中失败的 RSpec 测试
如果您的合并请求管道因 RSpec 测试失败而失败,您可以使用以下 Rake 任务在您的机器上运行所有失败的测试:
bin/rake spec:merge_request_rspec_failure此 Rake 任务有几个注意事项:
- 您需要在您的机器上与合并请求的源分支处于同一分支。
- 管道必须已完成。
- 您可能需要等待测试报告被解析并重试。
此 Rake 任务依赖于 单元测试报告 功能,该功能仅在首次请求时才会被解析。
加速测试、Rake 任务和迁移
Spring 是一个 Rails 应用程序预加载器。 它通过保持您的应用程序在后台运行来加速开发,这样您就不需要在每次运行测试、Rake 任务或迁移时启动它。
如果您想使用它,必须将 ENABLE_SPRING 环境变量导出为 1:
export ENABLE_SPRING=1或者您可以在每次规范运行时使用以下命令,
bundle exec spring rspec some_spec.rbRuboCop 任务
生成初始 RuboCop TODO 列表
生成初始列表的一种方法是运行 Rake 任务 rubocop:todo:generate:
bundle exec rake rubocop:todo:generate要为特定的 RuboCop 规则生成 TODO 列表,将它们作为逗号分隔的参数传递给 Rake 任务:
bundle exec rake 'rubocop:todo:generate[Gitlab/NamespacedClass,Lint/Syntax]'
bundle exec rake rubocop:todo:generate\[Gitlab/NamespacedClass,Lint/Syntax\]某些 shell 要求括号被转义或引用。
请参阅 解决 RuboCop 异常 了解如何继续。
在优雅模式下运行 RuboCop
您可以在"优雅模式"下运行 RuboCop。这意味着所有启用了"宽限期"(通过 Details: grace period)的 cop 规则都将被静音。
运行:
bundle exec rake 'rubocop:check:graceful'
bundle exec rake 'rubocop:check:graceful[Gitlab/NamespacedClass]'编译前端资源
在开发中,您永远不需要手动编译前端资源,但如果需要测试资源如何在生产环境中编译,可以使用以下命令:
RAILS_ENV=production NODE_ENV=production bundle exec rake gitlab:assets:compile这将编译和压缩所有 JavaScript 和 CSS 资源,并将它们连同所有其他前端资源(图像、字体等)复制到 /public/assets,在那里可以轻松检查。
Emoji 任务
要更新 Emoji 别名文件(用于 Emoji 自动补全),请运行以下命令:
bundle exec rake tanuki_emoji:aliases要导入后备 Emoji 图像,请运行以下命令:
bundle exec rake tanuki_emoji:import要根据当前可用的 Emoji 更新 Emoji 摘要文件(用于 Emoji 自动补全),请运行以下命令:
bundle exec rake tanuki_emoji:digests要生成包含所有 Emoji 的精灵文件,请运行:
bundle exec rake tanuki_emoji:sprite有关详细说明,请参阅 如何更新 Emojis。
更新项目模板
请参阅 为 GitLab 团队成员贡献项目模板。
生成路由列表
要查看完整的 API 路由列表,您可以运行:
bundle exec rake grape:path_helpers生成的列表包括完整的 API 端点列表和功能完整的 RESTful API 动词。
对于 Rails 控制器,请运行:
bundle exec rails routes由于创建这些需要一些时间,通常将输出保存到文件中以便快速参考会很有帮助。
显示过时的 ignored_columns
要查看所有过时的 ignored_columns 定义列表,请运行:
bundle exec rake db:obsolete_ignored_columns可以随意从它们的 ignored_columns 定义中移除这些定义。
验证 GraphQL 查询
要检查我们前端 GraphQL 查询中的一个或多个是否有效,请运行:
# 验证所有查询
bundle exec rake gitlab:graphql:validate
# 验证一个查询
bundle exec rake gitlab:graphql:validate[path/to/query.graphql]
# 验证一个目录
bundle exec rake gitlab:graphql:validate[path/to/queries]这将打印一个报告,每个查询都有一个条目,解释如果查询未能通过验证,为什么无效。
我们在验证过程中会去除 @client 字段,因此使用 @client 指令标记客户端字段以避免误报非常重要。
分析 GraphQL 查询
类似于 SQL 中的 ANALYZE,我们可以运行 gitlab:graphql:analyze 来估计运行查询的成本。
用法:
# 分析所有查询
bundle exec rake gitlab:graphql:analyze
# 分析一个查询
bundle exec rake gitlab:graphql:analyze[path/to/query.graphql]
# 分析一个目录
bundle exec rake gitlab:graphql:analyze[path/to/queries]这将为每个查询打印一个报告,包括查询的复杂度(如果查询有效)。
在某些情况下,复杂度取决于参数,因此报告的复杂度是上限的最佳努力评估。
更新 GraphQL 文档和模式定义
要根据 GitLab 模式生成 GraphQL 文档,请运行:
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_schema 是 graphql-docs gem 期望可用的实例变量。
Gitlab::Graphql::Docs::Helper 定义了我们使用的 object 方法。这也是您应该实现任何新方法以显示新类型的地方。
更新机器可读的模式文件
要根据 GitLab 模式生成 GraphQL 模式文件,请运行:
bundle exec rake gitlab:graphql:schema:dump这使用 GraphQL Ruby 内置的 Rake 任务生成 IDL 和 JSON 格式的文件。
更新文档和模式定义
以下命令结合了 更新 GraphQL 文档和模式定义 和 更新机器可读的模式文件 的意图:
bundle exec rake gitlab:graphql:update_all更新审计事件类型文档
有关更新审计事件类型文档的信息,请参阅 生成文档。
更新错误跟踪功能的 OpenAPI 客户端
此 Rake 任务需要安装 docker。
要更新位于 gems/error_tracking_open_api 的 OpenAPI 客户端的生成代码,请运行以下命令:
# 运行 rake 任务
bundle exec rake gems:error_tracking_open_api:generate
# 审查和测试更改
# 提交更改
git commit -m 'Update ErrorTrackingOpenAPI from OpenAPI definition' gems/error_tracking_open_api更新被禁止的 SSH 密钥
您可以使用 gitlab:security:update_banned_ssh_keys Rake 任务从任何 Git 存储库中添加 被禁止的 SSH 密钥:
-
找到一个包含 SSH 公钥的公共远程 Git 存储库。 公钥文件必须具有
.pub文件扩展名。 -
确保
/tmp/目录有足够的空间来存储远程 Git 存储库。 -
要将 SSH 密钥添加到您的禁止密钥列表中,请运行以下命令,将
GIT_URL和OUTPUT_FILE替换为适当的值:# @param git_url - 远程 Git URL。 # @param output_file - 更新密钥到输出文件。默认是 config/security/banned_ssh_keys.yml。 bundle exec rake "gitlab:security:update_banned_ssh_keys[GIT_URL, OUTPUT_FILE]"
此任务克隆远程存储库,递归遍历文件系统查找以 .pub 结尾的文件,将这些文件解析为 SSH 公钥,然后将公钥指纹添加到 output_file。config/security/banned_ssh_keys.yml 的内容由 GitLab 读取并保存在内存中。不建议将此文件大小增加到超过 1 兆字节。
将当前导航结构输出为 YAML
此任务依赖于您当前的环境设置(许可证、功能标志、项目/群组),因此输出可能因运行次数或环境而异。我们可能会在未来的迭代中标准化输出。
产品、UX 和技术写作需要一种方法来审核整个 GitLab 导航,
但可能不习惯直接审查 lib/sidebars 中的代码。您可以通过 gitlab:nav:dump_structure Rake 任务将整个导航结构转储为 YAML:
bundle exec rake gitlab:nav:dump_structure