Поиск по сайту:

Как начать работу с консолью GitLab Rails для расширенного администрирования


Консоль Rails GitLab предоставляет интерактивный терминал, который позволяет вам напрямую манипулировать данными в вашем экземпляре GitLab. Вы можете использовать его для извлечения информации, устранения неполадок и выполнения сложных задач администрирования, которые не поддерживаются в веб-интерфейсе или API GitLab.

Для доступа к консоли у вас должен быть запущен собственный сервер GitLab с самостоятельным управлением. Вам потребуются привилегии суперпользователя на компьютере, на котором размещена ваша среда. Консоль обеспечивает беспрепятственный контроль над GitLab и вашими данными, поэтому использовать ее должны только доверенные администраторы. Действия могут переопределить обычные меры безопасности и привести к непреднамеренному уничтожению данных.

Запуск консоли

Метод, используемый для запуска консоли, зависит от типа используемой установки GitLab. Дистрибутивы Omnibus, установленные из менеджера пакетов, поддерживают следующую команду:

$ sudo gitlab-rails console

Используйте этот вариант, если вы вручную установили GitLab из исходного кода:

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

Консоль также доступна для облачных инстансов GitLab, работающих в Kubernetes. Используйте Kubectl, чтобы подключиться к поду GitLab toolbox и начать сеанс консоли:

$ kubectl --namespace gitlab exec -it toolbox -- /srv/gitlab/bin/rails console

Версии GitLab старше 14.2 будут иметь модуль task-runner вместо toolbox. Замените task-runner в команде, показанной выше, если вы используете один из этих выпусков.

Запуск консоли Rails может занять несколько секунд. Он отобразит сводку ваших версий Ruby, GitLab и PostgreSQL, а затем перенаправит вас в командную строку терминала.

$ sudo gitlab-rails console
--------------------------------------------------------------------------------
 Ruby:         ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-linux]
 GitLab:       15.0.0 (8a186dedfc1) FOSS
 GitLab Shell: 14.3.0
 PostgreSQL:   12.10
------------------------------------------------------------[ booted in 22.48s ]
Loading production environment (Rails 6.1.4.7)
irb(main):001:0>

Вы можете начать вводить команды Ruby, когда увидите приглашение.

Основное использование

Консоль обеспечивает доступ к среде GitLab Ruby on Rails. Объекты в области действия позволяют извлекать, обновлять и запрашивать данные в вашей базе данных GitLab. Базовое понимание Ruby и Rails поможет вам начать работу.

Rails использует шаблон Active Record для предоставления статических методов сопоставления данных с объектами. Вы можете вызвать следующий метод, чтобы получить пользователя по его имени пользователя:

$ demo = User.find_by_username("demo")
# <User id:1 @demo>

Вы можете просмотреть свойства извлеченного объекта, проверив его атрибуты:

$ pp demo.attributes
{"id"=>1,
 "email"=>"demo@example.com",
...

Чтобы получить конкретное свойство, обратитесь к нему по имени:

$ demo.email
demo@example.com

Вы можете использовать методы Rails для удобного извлечения нескольких экземпляров объекта, соответствующих запросу:

$ admins = User.where(admin: true).where('email like ?', '%@example.com')

Это извлекает всех пользователей example.com с правами администратора GitLab.

Вы можете изменить свойства экземпляра объекта, назначив новые значения и вызвав save:

$ demo.email = "example@example.com"
$ demo.save

Метод save проверит допустимое состояние объекта перед его сохранением в базе данных. Вы можете явно отключить проверку в ситуациях, когда вы хотите принудительно применить конкретное изменение:

$ demo.save!(validate: false)

Это следует использовать только для исследования проблем, когда веб-интерфейс или API GitLab неожиданно отклоняет данные.

Общие задачи

Консоль GitLab Rails имеет безграничное количество приложений, так как вы можете работать с любым аспектом вашего экземпляра GitLab. Вот несколько полезных операций, с которых можно начать.

Откройте для себя методы, доступные для объекта

Опыт работы с консолью может быть пугающим для новичков, особенно если вы не очень хорошо знакомы с Rails. Документация по консоли относительно скудна, но вы можете открыть для себя функциональность, изучив список методов, связанных с каждым объектом:

$ User.methods
[:before_add_for_closed_issues, :before_add_for_closed_issues=, :after_add_for_closed_issues, ...]

Вы можете комбинировать это с grep, чтобы быстро отфильтровать методы с определенным корнем:

$ Project.methods.grep(/find/)
[:find_by_runners_token, :find_by_url, :find_by_full_path, ...]

Это показывает, что вы можете получить проект по его пути с помощью следующей команды:

$ Project.find_by_full_path("/user/project")

Получить проект с его проблемами и запросами на слияние

Сначала используйте объект Project, чтобы получить проект, сопоставив уникальный атрибут, такой как его идентификатор, путь или URL-адрес:

$ project = Project.find_by_full_path("/user/project")

Теперь вы можете получить доступ к задачам проекта и запросам на слияние через его свойства отношения:

# Get all issues
$ project.issues.all

# Get the first issue
$ project.issues.first

# Get a specific merge request by its project-level ID
$ project.merge_requests.find_by(iid: 10)

Получение конвейера непрерывной интеграции

Объект Pipeline вложен в пространство имен CI:

# Get the pipeline with ID 100
$ pipeline = Ci::Pipeline.find(100)

# Get builds (jobs) associated with the pipeline
$ jobs = pipeline.builds

Сбросить пароль администратора

Консоль может спасти вас, если вы когда-нибудь заблокируете свою учетную запись. Получите затронутый объект пользователя, а затем сбросьте его пароль:

$ user = User.find_by_username("demo")
$ user.password = "abc123"
$ user.password_confirmation = "abc123"
$ user.save

Сделать проект доступным только для чтения

GitLab поддерживает проекты только для чтения, которые сохраняют доступ к репозиторию, но предотвращают внесение изменений. Режим только для чтения должен быть включен с помощью консоли:

$ project = Project.find_by_full_path("/user/project")
$ project.repository_read_only = true
$ project.save

Запуск расписания конвейера вручную

Запланированные конвейеры можно запускать сразу с помощью консоли. Иногда это может помочь отладить проблемы, о которых не сообщается полностью в пользовательском интерфейсе и API.

Сначала извлеките объект PipelineSchedule:

$ schedule = Ci::PipelineSchedule.find_by(id: 10)

Затем выберите пользователя, для которого вы хотите выполнить конвейер, как:

$ user = User.find_by_username("demo")

Теперь используйте эту команду, чтобы запустить прогон по расписанию:

$ Ci::CreatePipelineService.new(schedule.project, user, ref: schedule.ref).execute!(:schedule, ignore_skip_ci: true, save_on_errors: false, schedule: schedule)

Он создает новый конвейер из расписания и начинает его выполнение.

Включить флаги функций

Некоторые предварительные версии функций GitLab закрыты флажками функций. Флаги также иногда используются для разрешения временной повторной активации устаревших возможностей.

Консоль — это единственный механизм, с помощью которого можно активировать флаги функций. Передайте идентификатор флага функции в функцию Feature.enable():

$ Feature.enable(:certificate_based_clusters)

Изменение вступает в силу немедленно, без перезапуска GitLab. В этом примере повторно активируется поддержка кластеров Kubernetes на основе сертификатов в GitLab 15.0.

Вы можете проверить, включен ли флаг, с помощью вызова Feature.enabled?():

$ Feature.enabled?(:certificate_based_clusters)
=> true

Чтобы отключить флаг функции, передайте его идентификатор методу Feature.disable():

$ Feature.disable(:certificate_based_clusters)

Тестовая доставка электронной почты

Консоль позволяет напрямую отправлять тестовые сообщения, чтобы убедиться, что ваша система исходящей электронной почты работает:

$ Notify.test_email("example@example.com", "Test subject", "Test body").deliver_now

Электронное письмо будет отправлено немедленно с использованием того же механизма, что и сообщения, созданные функциями приложения GitLab.

Запуск скриптов Ruby с помощью Rails Runner

Сеанс интерактивной консоли не всегда необходим. Rails Runner — это альтернатива, упрощающая запуск скриптов Ruby в контексте вашей среды GitLab.

Используйте команду gitlab-rails runner, чтобы выполнить некоторый код Ruby. Ваш сценарий может ссылаться на те же переменные и объекты GitLab, которые доступны для сеанса консоли Rails.

$ sudo gitlab-rails runner "puts User.find_by_username('demo').email"

Rails запустит предоставленный вами скрипт, а затем завершит процесс. Показанный выше пример выдает адрес электронной почты пользователя GitLab с именем demo. Эта альтернатива запускает код Ruby, представленный в виде файла:

$ sudo gitlab-rails runner /scripts/gitlab-rails-script.rb

Скрипты, сохраненные в виде файлов Ruby, должны быть доступны пользователю git Unix. GitLab Rails всегда выполняется как git:git, поэтому скрипты, принадлежащие другим пользователям, могут привести к ошибке. Недопустимые пути к файлам будут интерпретироваться как код Ruby для запуска, что приведет к синтаксической ошибке, которая может замаскировать истинную проблему:

$ sudo gitlab-rails runner /scripts/invalid-file.rb
Please specify a valid ruby command or the path of a script to run.
Run 'rails runner -h' for help

Краткое содержание

Консоль GitLab Rails — это мощная утилита для прямого взаимодействия с вашим экземпляром GitLab. Это может быть бесценным инструментом отладки, когда у вас возникают проблемы с установкой. Консоль также позволяет создавать сценарии административных задач, используя простой код Ruby, вместо того, чтобы полагаться на GitLab API. Некоторые операции, такие как включение флага функции, можно выполнить только с помощью консоли.

С властью приходит ответственность. Консоль способна игнорировать ограждения и принимать операции в контекстах, для которых они не предназначены. Неправильное использование может привести к потере данных и неожиданному поведению. Используя консоль, вы открываете кодовую базу GitLab и ее внутренние операции. Доступные методы и их эффекты не имеют гарантии поддержки и могут быть изменены без предупреждения.