Rails 控制台
Rails 控制台提供了一种使用命令行与极狐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