Help us learn about your current experience with the documentation. Take the survey.

开发者的 Rake 任务

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

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

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

bundle exec rake setup

setup 任务是 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:unitspec:integrationspec: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.rb

RuboCop 任务

生成初始 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_schemagraphql-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 密钥

  1. 找到一个包含 SSH 公钥的公共远程 Git 存储库。 公钥文件必须具有 .pub 文件扩展名。

  2. 确保 /tmp/ 目录有足够的空间来存储远程 Git 存储库。

  3. 要将 SSH 密钥添加到您的禁止密钥列表中,请运行以下命令,将 GIT_URLOUTPUT_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_fileconfig/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