Mercurial строится на толчке

Я хотел бы, чтобы сборка выполнялась (на сервере) каждый раз, когда нажимаем на наш центральный репозиторий Mercurial. Сборка обычно запускается на нашем сервере сборки, запустив файл Visual Build либо вручную, либо с помощью запланированной задачи.

Каковы способы достижения этого?

Предпочтительны простые, малоэффективные решения.

Ответ 1

Как предложил Пабло, вы можете сделать это с помощью крючка, но вам понадобится входящий крючок на стороне сервера. Этот крючок запускается "после того, как набор изменений был вытащен, вставлен или разделен в локальный репозиторий" (hgrc manpage).

Измените файл .hg/hgrc репозитория, расположенного на сервере, и определите свой крюк сборки следующим образом:

[hooks]
incoming = /path/to/executable-build-script

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

Обратите внимание, что входящий крючок запускается для каждого отдельного набора изменений при нажатии. Если вы этого не хотите, используйте крюк changegroup - он запускается только один раз для каждого нажатия, независимо от того, сколько изменений он выполняет.

Ответ 2

Другим способом, помимо перехватов, которые упоминает Пабло, является создание сервера непрерывной интеграции, такого как TeamCity. Затем вы можете попросить TeamCity отслеживать ваш репозиторий, вытаскивать новые изменения и запускать визуальную сборку script для вас.

Ответ 3

Отказ

Эти данные для клиента черепахового и меркуриального сервера за apache на win32.

Попробуйте # 1

Наивное решение будет заключаться в том, чтобы заставить ваш удар начать сборку.

В .hg\hgrc

[hooks]
incoming=.hg\build.py

В build.py

os.system('\Progra~2\Micros~2.0\Common7\IDE\devenv /build release project.sln > logfile')

Проблема

Что вы найдете, так это то, что после толчка клиент черепахи hg не вернется, пока не вернется ваш вызов os.system. Это может быть или не быть приемлемым. В моем магазине сборка заняла около 20 минут, и мой босс счел это неприемлемым.

Попробуйте # 2

Мое решение заключалось в том, что крючок сразу возвращается после создания файла REQUESTBUILD в корневой каталог.

В .hg\hgrc

[hooks]
incoming = .hg\write_buildrequest_file.bat

В .hg\write_buildrequest_file.bat

echo REQUESTBUILD > \REQUESTBUILD

Между тем у меня был python script, работающий в бесконечном цикле, проверяя наличие REQUESTBUILD.

В .hg\monitor_buildrequest_file.py

import popen2, time, os
import subprocess

while True:
    if os.path.exists("\REQUESTBUILD"):
        os.system("del \REQUESTBUILD")
        os.chdir("/yourrepo/.hg")
        retcode = subprocess.call("\python27\python.exe build.py")
    else:
        time.sleep(10)

build.py будет генерировать HTML файл результатов, который отправителю пришлось бы вытащить через свой веб-браузер.

Есть и другие проблемы (толкает, когда начинается сборка, сохраняя исторические результаты, строя из рабочего каталога и копируя в другом месте), но это общая идея.