Rails 控制台

Rails 控制台提供了一种使用命令行与极狐GitLab 实例交互的方法,并且还允许访问 Rails 中内置的工具。

cautionRails 控制台直接与极狐GitLab 交互。在许多情况下,没有机制可以阻止您永久修改、破坏或破坏生产数据。如果您想在没有任何后果的情况下探索 Rails 控制台,强烈建议您在测试环境中进行。

Rails 控制台适用于正在对问题进行故障排除,或需要检索某些只能通过直接访问极狐GitLab 应用程序来完成的数据的系统管理员。

此功能需要 Ruby 的基本知识(尝试 30 分钟教程的快速介绍)。Rails 经验很有用,但不是必需的。

启动 Rails 控制台会话

Omnibus 安装实例

sudo gitlab-rails console

源安装实例

sudo -u git -H bundle exec rails console -e production

Kubernetes deployments

控制台位于 toolbox pod。

要退出控制台,请键入:quit

启用 Active Record 日志记录

您可以通过运行以下命令,在 Rails 控制台会话中启用 Active Record 调试日志的输出:

ActiveRecord::Base.logger = Logger.new($stdout)

显示有关由您可能在控制台中运行的任何 Ruby 代码触发的数据库查询的信息。要再次关闭日志记录,请运行:

ActiveRecord::Base.logger = nil

禁用数据库语句超时

您可以通过运行以下命令,禁用当前 Rails 控制台会话的 PostgreSQL 语句超时:

ActiveRecord::Base.connection.execute('SET statement_timeout TO 0')

此更改仅影响当前 Rails 控制台会话,不会保留在极狐GitLab 生产环境或下一个 Rails 控制台会话中。

输出 Rails 控制台会话历史记录

在 rails 控制台输入以下命令,显示您的命令历史记录。

puts Readline::HISTORY.to_a

然后,您可以将其复制到剪贴板并保存以备将来参考。

使用 Rails Runner

如果您需要在极狐GitLab 生产环境的上下文中运行一些 Ruby 代码,您可以使用 Rails Runner 来完成。 执行脚本文件时,该脚本必须可由 git 用户访问。

当命令或脚本完成时,Rails Runner 进程就完成了。 例如,它对于在其他脚本或 cron 作业中运行很有用。

Omnibus 安装实例

sudo gitlab-rails runner "RAILS_COMMAND"

# Example with a two-line Ruby script
sudo gitlab-rails runner "user = User.first; puts user.username"

# Example with a ruby script file (make sure to use the full path)
sudo gitlab-rails runner /path/to/script.rb

源安装实例

sudo -u git -H bundle exec rails runner -e production "RAILS_COMMAND"

# Example with a two-line Ruby script
sudo -u git -H bundle exec rails runner -e production "user = User.first; puts user.username"

# Example with a ruby script file (make sure to use the full path)
sudo -u git -H bundle exec rails runner -e production /path/to/script.rb

Rails Runner 不会产生与控制台相同的输出。

如果在控制台上设置变量,控制台将生成有用的调试输出,例如引用实体的变量内容或属性:

irb(main):001:0> user = User.first
=> #<User id:1 @root>

Rails Runner 不会这样做:您必须明确生成输出:

$ sudo gitlab-rails runner "user = User.first"
$ sudo gitlab-rails runner "user = User.first; puts user.username ; puts user.id"
root
1

Ruby 的一些基本知识将非常有用。尝试 这个 30 分钟的教程 快速介绍。 Rails 经验很有帮助,但不是必需的。

Rails Runner 故障排查

gitlab-rails 命令使用非 root 帐户和组执行 Rails Runner,默认情况下:git:git

如果非 root 帐户找不到传递给 gitlab-rails runner 的 Ruby 脚本文件名,您可能会收到语法错误,而不是无法访问文件的错误。

一个常见的原因是脚本已放在 root 帐户的主目录中。

runner 尝试将路径和文件参数解析为 Ruby 代码。

例如:

[root ~]# echo 'puts "hello world"' > ./helloworld.rb
[root ~]# sudo gitlab-rails runner ./helloworld.rb
Please specify a valid ruby command or the path of a script to run.
Run 'rails runner -h' for help.

/opt/gitlab/..../runner_command.rb:45: syntax error, unexpected '.'
./helloworld.rb
^
[root ~]# sudo gitlab-rails runner /root/helloworld.rb
Please specify a valid ruby command or the path of a script to run.
Run 'rails runner -h' for help.

/opt/gitlab/..../runner_command.rb:45: unknown regexp options - hllwrld
[root ~]# mv ~/helloworld.rb /tmp
[root ~]# sudo gitlab-rails runner /tmp/helloworld.rb
hello world

如果可以访问目录,但不能访问文件,则应生成有意义的错误:

[root ~]# chmod 400 /tmp/helloworld.rb
[root ~]# sudo gitlab-rails runner /tmp/helloworld.rb
Traceback (most recent call last):
      [traceback removed]
/opt/gitlab/..../runner_command.rb:42:in `load': cannot load such file -- /tmp/helloworld.rb (LoadError)

如果您遇到与此类似的错误:

[root ~]# sudo gitlab-rails runner helloworld.rb
Please specify a valid ruby command or the path of a script to run.
Run 'rails runner -h' for help.

undefined local variable or method `helloworld' for main:Object

您可以将文件移动到 /tmp 目录或创建一个由用户 git 拥有的新目录并将脚本保存在该目录中,如下所示:

sudo mkdir /scripts
sudo mv /script_path/helloworld.rb /scripts
sudo chown -R git:git /scripts
sudo chmod 700 /scripts
sudo gitlab-rails runner /scripts/helloworld.rb