2010-12-14 5 views
11

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

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

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

ответ

2

Необходимо, чтобы handle repository events with hooks.

Итак, после события commit вам необходимо запустить скрипт, который будет выполнять вашу сборку соответствующим образом.

+0

Из вашей ссылки: «и команда запускает крюк, который запускается в вашей системе». Это проблема, потому что я хочу, чтобы сборка была сделана на сервере сборки, а не на машине человека, который нажал изменения. – CiscoIPPhone

5

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

15

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

Редактирование .hg/hgrc файла хранилища, расположенные на сервере и определить вашу сборку крюк следующим образом:

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

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

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

+0

Я попробую это. Мне просто интересно, как сделать push на сервер может фактически выполнить процесс на сервере. Я был под впечатлением, что Mercurial был основан на файлах и что на нашем сервере фактически не было сервиса Mercurial. – CiscoIPPhone

+3

Не действительно сервис, но простая команда 'hg' выполняется на сервере всякий раз, когда вы разговариваете с ним. В случае доступа * HTTP * веб-сервер запускает несколько сценариев, которые затем запускают установку Mercurial на стороне сервера. В случае * SSH *, ваш локальный 'hg' использует SSH для входа на сервер и таким образом запускает удаленную установку Mercurial. Обобщенный, единственный сервис, запущенный на удаленном сайте, представляет собой веб-сервер или SSH-сервер, который запускает «hg», как это делается локально. –

+0

Спасибо за объяснение. – CiscoIPPhone

4

Отказ

Эти данные для TortoiseHG клиента и сервера ртутный позади апача на win32.

Try # 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') 

Проблема

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

Try # 2

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

В .hg\hgrc

[hooks] 
incoming = .hg\write_buildrequest_file.bat 

В .hg\write_buildrequest_file.bat

echo REQUESTBUILD > \REQUESTBUILD 

В то же время, у меня был питон скрипт работает в бесконечном цикле, проверка на наличие 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-файл результатов, которые заявитель должен был бы тянуть через свой веб-браузер.

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