Вопрос

Я переношу непрерывное тестирование на выделенный сервер (автотест слишком сильно замедляет работу моего локального ноутбука).Мне бы хотелось, чтобы мой тестовый сервер (на котором работает CruiseControl.rb) постоянно получал мои последние (зафиксированные) изменения через Git — в идеале, без каких-либо изменений в моем собственном рабочем процессе.Я единственный разработчик, работающий над этим проектом.

До приобретения тестового сервера у меня было:

  • Мой ноутбук как моя основная система разработки
  • Несколько веток в моем локальном репозитории.
  • Локальная рабочая копия, указывающая на одну из ветвей.Я часто переключаюсь между ветками (обычно для новых функций).
  • Учетная запись GitHub, на которую я часто пересылаю локальные ветки в зеркальные удаленные ветки.(В основном это используется для резервного копирования вне офиса;Я не делюсь кодом своего текущего проекта).Я стараюсь отправлять сообщения на GitHub хотя бы в конце каждого рабочего дня, хотя иногда забываю.

Мне хотелось бы сохранить все это в неприкосновенности.Помимо этого, у меня теперь есть:

  • Тестовый сервер
  • ...запуск CruiseControl.rb
  • Клон репозитория моего ноутбука на тестовом сервере.(В настоящее время GitHub не клонирует)
  • Локальная рабочая копия на тестовом сервере, с которой CC собирает/тестирует.
  • Эта рабочая копия указывает на одну конкретную ветку Git (разумеется).

Я пытался заставить мой тестовый сервер автоматически получать любую ветку, над которой я работаю, на рабочей копии моего ноутбука и строить на ее основе.(Это будет имитировать непрерывное тестирование автотеста, не потребляя при этом системные ресурсы).

Вещи, которые я пробовал без успеха:

  • git checkout origin/HEAD:это позволяет получить файлы нормально, но нарушает работу CruiseControl, поскольку ему не нравится рабочая копия без ветвей.
  • git checkout --track -b a_branch origin/a_branch:это отлично работает для получения файлов, и CC это нравится, но привязывает тестовый сервер к определенной ветке.При переключении веток на ноутбуке я фактически прекращаю тестирование своей текущей работы.
  • git checkout --track -b my_testing_branch origin/HEAD:это также получает файлы для сборки, но имеет ту же проблему, что и команда выше.Создание ветки из origin/HEAD получает только HEAD для ветки «по умолчанию», поэтому она также закреплена.

Есть ли способ получить хорошую систему непрерывного удаленного тестирования (с ветками git или без них), которая не потребует серьезных изменений в моем рабочем процессе?

Это было полезно?

Решение

Другой вариант — написать крюк который уведомляет тестовый сервер о новом коде, который нужно получить.В частности, post-commit крюк, вероятно, лучший маршрут.Затем каждый раз при фиксации вы можете сообщить тестовому серверу, что и из какой ветки нужно извлечь.

Другие советы

У вас может быть выделенная ветка тестирования, в которую вы объединяете свою текущую работу ветки.
Вы можете принудительно заменить содержимое этой ветки фиксацией текущей рабочей ветки (см. git merge -s наш, а как насчет «их» вопрос).

Затем на сервере CI вы инициализируете его с помощью:

 $ git fetch laptopRepo
 $ git checkout -b testingBranch laptopRepo/testingBranch

Это подразумевает первый шаг со стороны ноутбука — публикацию текущих работ для тестирования.

Это не самое лучшее решение, но это что-то...

Тестовый сервер может работать git remote show origin чтобы увидеть, какая ветка в данный момент активна на вашем ноутбуке.Например.,

$ git remote show origin
* remote origin
  Fetch URL: blade:/var/scratch/code
  Push  URL: blade:/var/scratch/code
  HEAD branch: foo
  Remote branches:
    foo tracked
    bar tracked
    qux tracked

Итак, исходный репозиторий в настоящее время находится на foo ветвь.

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

$ b=$(git remote show origin | grep "HEAD branch" | awk -F: '{print $2}')
$ echo $b
foo

Теперь, поскольку origin/foo будет действовать аналогично origin/HEAD (нет локальной ветки), и вашему CruiseControl это не нравится, вам, вероятно, следует просто создать локальную ветку на тестовой машине и просто выполнить ее полный сброс в последнее местоположение:

$ b=$(git remote show origin | grep "HEAD branch" | awk -F: '{print $2}')
$ git reset --hard origin/$b

Обратите внимание: это немного хрупко, поскольку HEAD я не всегда буду тем, кем ты думаешь.Например, во время перебазирования HEAD будет двигаться вперед и назад.Если ваш тестовый сервер проверяет HEAD на вашем ноутбуке во время перебазирования может оказаться недопустимое или нежелательное местоположение.

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

Сначала я добавляю пульт в репозиторий ноутбука:

git remote add testing <url of testing server>

Затем, когда у меня есть код для тестирования, я делаю push:

git push -f testing HEAD:master

Это будет работать в любой ветке, в которой я сейчас нахожусь.-f гарантирует, что я удалю все, что уже есть в этой ветке;Мне не придется беспокоиться о каком-либо происхождении.

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

Вероятно, я захочу добавить в скрипт или псевдоним комбинированную команду commit+push;это даст мне фиксацию и тестирование одной командой.Если по какой-то причине я хочу выполнить коммит без тестовой отправки (или наоборот), у меня тоже есть такие варианты.

Размещайте их на GitHub и используйте их крючки после получения.Вот как такие сервисы Деввер и ВыполнитьКодВыполнить сделай это.

Я подумывал пропустить git и перейти к решению общей папки/NFS/rsync, но здесь есть одна серьезная проблема:он не запускается / не ограничивается коммитами, поэтому я в конечном итоге получаю ложноположительные неработающие сборки, пока что-то печатаю.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top