Ruby Redmine SVN пост-фиксация крюк очень медленно - PullRequest
3 голосов
/ 06 июня 2011

Я использую следующий хук post-commit для svn:

"path\to\ruby.exe" "path\to\redmine\script\runner" "Repository.fetch_changesets; Rails.logger.flush" -e production

Работает правильно, но занимает около 1-2 минут. Я также подумал, что для первого коммита требуется много времени, но последующий коммит занимает столько же времени.

Можно ли улучшить такое поведение?

Я знаю о медленном поведении Ruby в Windows, примерно в 3 раза, но в моем случае это намного дольше.

Конфигурация следующая: Windows Vista, redmine 1.1.1, Ruby 1.8.7 с RubyGems 1.8.7, все пакеты установлены и тестирование выполняется на одном компьютере.

1 Ответ

3 голосов
/ 08 июня 2011

Проблема в том, что script/runner запускает новый процесс Rails с нуля при каждом его запуске, что заставит вашу приостановку коммита. Итак, 3 коммита == 3 стартапа и 3 остановки.

Есть несколько вещей, которые вы можете сделать, чтобы улучшить это:

  1. Запустите процесс скрипт / бегун в фоновом режиме, чтобы он не замедлял ваш коммит. В Linux вы можете сделать это, добавив & в конце команды, но я не помню, как это сделать в Windows

  2. Вместо того, чтобы извлекать наборы изменений при каждом коммите, вы можете запускать его регулярно через cron или запланированное задание. Для этого построена задача rake redmine:fetch_changesets, она будет проходить через каждый проект и запускать fetch_changesets для вас.

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

    script\runner "Project.find('your-project').try(:repository).try(:fetch_changesets); Rails.logger.flush"

    Замените 'your-project' на идентификатор проекта (встречается в большинстве URL-адресов в Redmine). try части используются, чтобы убедиться, что вы не получите пустую запись.

  4. Используйте веб-сервис для получения наборов изменений вместо script/runner. Веб-служба будет использовать существующий процесс Ruby, поэтому он должен быть уже загружен, и единственное замедление будет происходить, пока Redmine загружает и обрабатывает изменения. Это также может быть использовано с первой опцией (то есть фоновым запросом веб-службы). Документы: http://www.redmine.org/projects/redmine/wiki/HowTo_setup_automatic_refresh_of_repositories_in_Redmine_on_commit

Лично я просто запускаю cronjob каждый час (# 2). Наличие текущего представления в репозитории не так важно для меня. Надеюсь, что это дает вам некоторые идеи.

...