У меня есть несколько трудоемких задач, которые я люблю распределять по нескольким компьютерам. Эти задачи требуют запуска идентичного сценария ruby или python (или серии сценариев, которые вызывают друг друга) на каждой машине. На машинах будет отдельный конфигурационный файл, сообщающий сценарию, какую часть задачи выполнить.

Я хочу выяснить, как лучше синхронизировать сценарии на этих машинах до их запуска. До сих пор я вносил изменения в копию скрипта на сетевом ресурсе, а затем копировал свежую копию на каждую машину, когда я хочу ее запустить. Но это громоздко и оставляет вероятность ошибки (например, отсутствует файл в копии или не нажимается "копировать и заменить").

Предположим, что системы являются стандартными компьютерами Windows, которые не предназначены для этой задачи, и мне не нужно постоянно запускать эти сценарии (поэтому я не хочу, чтобы решение работало 24/7 и всегда обновляло их, Я предпочел бы что-то, что толкает / тянет по команде).

Мои мысли о разных вариантах:

  • Простая адаптация моего текущего рабочего процесса: сохраняйте оригиналы на сетевом диске, но пишите командный файл, который копирует последнюю версию сценариев, чтобы все выполнялось одним щелчком мыши. Требует действий в каждой системе, но это еще не конец света (поскольку каждой из них обычно требуется, чтобы их конфигурационный файл тоже немного изменился).
  • Поместите все в хранилище Mercurial/Git и вытяните свежую копию на каждый узел. Переход к репо с каждой машины гарантировал бы текущую версию (и имел бы дополнительное преимущество, позволяя вносить изменения в сценарий с любой машины). Минусы могут заключаться в том, что для этого требуется, чтобы на каждом компьютере была установлена VCS, и могут возникнуть проблемы с аутентификацией, поскольку я бы не использовал публичное репо.
  • Откройте доступ для записи в общей папке и напишите сценарий, который будет использовать rsync (или аналогичный) для передачи изменений на все машины одновременно. Он получает текущую версию на каждой машине (хотя вам придется изменить скрипт, если вы хотите опустить машину или добавить новую). Возможная проблема заключается в том, что каждый компьютер должен иметь доступ для записи.
  • Dropbox - разумное предложение (и оно может хорошо работать), но я не хочу использовать внешний сервис, и я бы предпочел, чтобы Dropbox не работал 24/7 в системах, которые обычно не нуждаются в нем.

Есть что-то простое, что мне не хватает? Какой-то инструмент, разработанный специально для таких вещей? В противном случае я склоняюсь к тому, чтобы просто привязать все системы к Mercurial, поскольку, хотя для этого требуется дополнительное программное обеспечение, это немного более надежно, чем написание пакетного файла (например, если я разделю часть скрипта на отдельный модуль, Mercurial узнает, что делать в то время как я должен был бы добавить строку в командный файл).

2 ответа2

1

Я использую Jenkins (CI Server) и Capistrano 2 (сборка / развертывание Ruby). Вам не обязательно нужен Jenkins для этого, но CI-сервер отлично подходит для такой работы. Capistrano великолепен, потому что я могу легко сделать одну вещь / много машин и справиться с извлечением из SCM (git или mercurial, как вы просили), если хотите. Fabric (Python) также является хорошим фреймворком для развертывания.

Процедура:

  • Capistrano проверяет ветку git /master, содержащую скрипт на локальной машине
  • Capistrano передает файл скрипта на все машины через scp или sftp. (:deploy_via,:copy)
  • Capistrano выполняет сценарий на всех узлах "приложения", параллельно или последовательно, и сообщает об успехе или неудаче.

Вы можете заменить Capistrano на (Fabric | Bash | Chrome | Chef Recipe | Puppet config)

Теперь, если у вас есть сервер CI, вы можете управлять ключами SSH и администрацией из одной центральной точки.

Я могу с уверенностью предположить, что вы используете Windows для локальной разработки, если это также машины Windows, на которых вы развертываете ... вы можете рассмотреть команды Powershell, запускаемые из Capistrano, а не "unix", как я описал здесь. Сложность состоит в том, как X входит в блок Y и выполняет Z, это другой вопрос.

0

Просто имейте начальный скрипт "загрузчик", который захватывает последнюю версию всего из сети. Храните данные конфигурации вне этого дерева (что вы должны делать в любом случае). Загрузчик может быть чем угодно, от простого пакетного файла, вызывающего xcopy/robocopy, до извлечения DVCS или синхронизации DropBox/OwnCloud.

Таким образом, не имеет значения, как он выполняется, первым действием будет обновление до последней версии перед выполнением.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .