#mercurial #tags #fabric
#mercurial #Теги #структура
Вопрос:
Я использую Mercurial и Fabric для развертывания своего сайта. Я никогда раньше не использовал Fabric, поэтому я скопировал пример файла fab онлайн, а затем изменил переменные, чтобы они соответствовали моему собственному сайту.
Вот строки кода:
def prod():
env.hosts = ['kevinburke.webfactional.com']
env.user = 'kevinburke'
def deploy():
require('hosts' , provided_by=[prod])
local ("hg tag --local --force production")
local ("hg push --remotecmd /home/kburke/bin/hg") # this works fine
run ("cd /my/web/directory; hg update -C production")
и это вызывается из командной строки как
fab prod deploy
Когда я был единственным человеком, развертывающим сайт, это работало без проблем. Но недавно я добавил двух коммиттеров, которые используют один и тот же fabfile, и когда они пытаются развернуть сайт, удаленная версия сайта не обновляется до последней версии — она обновляется только до последней версии, которую я пометил как рабочую, а не ту, которую они пометили.
Я ожидаю, что он будет использовать их «производственный» тег для обновления файла. Почему это происходит? Как я могу заставить программу вести себя так, как я ожидаю в будущем?
Спасибо, Кевин
Ответ №1:
Вы не можете публиковать локальные теги. Это означает, что либо ваш первый шаг уже выполнен в /my/web/directory
репозитории, либо там уже есть production
вызванная ревизия (вы можете проверить с помощью hg tags
, hg branches
и hg bookmarks
).
У вас есть несколько способов исправить ваш рабочий процесс (в порядке предпочтения):
- используйте теги с общим префиксом, чтобы различать различные производственные версии, такие как
production-23
илиproduction-42
, которые вы можете проанализировать в рабочем окне. - Создайте
production
ветку, в которой каждая версия для доставки объединяется с этой веткой. Я рекомендую это, если у вас уже есть опыт работы с ветвями. - Используйте расширение bookmark и создайте
production
закладку, чтобы отслеживать вашу развернутую версию. Это похоже на решение, которое вы в настоящее время хотите установить. Когда вы хотите использовать закладки, вам нужно включить их как на сервере, так и на всех клиентах, и использоватьhg push -B production
для отправки текущего состояния вашей закладки на сервер. Одним из недостатков этого процесса является то, что вы никогда не увидите, отправил ли кто-либо другую закладку на сервер, поскольку передача закладки автоматически перезаписывает закладку на сервере. - Используйте обычные теги для отслеживания рабочей версии. С одной стороны, кажется неправильным использовать теги для такого рода отслеживания, поскольку теги должны быть статическими. С другой стороны, у вас будет отслеживание того, какие ревизии были активны в какой-то момент времени. Но первое решение выполняет работу по отслеживанию намного лучше.
Ответ №2:
Может быть, это элементарно, но вы видели, что это действительно что-то делало? Возможно, ничего не произошло, и развернутый был вашим «производственным» тегом, когда вы его запускали.
Поскольку hg tag --local
означает, что тег предназначен только для вашего локального репозитория и не имеет версии, я не могу придумать никакой другой причины. Другие пользователи даже не смогут узнать об этом теге.
Комментарии:
1. Я не уверен, что понимаю. Если тег ничего не делал, то что происходило, когда я писал «hg update -C production» на сервере? Когда другие коммиттеры запускали файл fab, он обновлялся до последней версии, которую я загрузил на сервер, а не в tip. Зачем это делать?
2. То есть люди используют свои собственные пути для
/home/kburke/bin/hg
и/my/web/directory
или один и тот же fab-файл буквально означает один и тот же fab-файл?3. Они используют буквально один и тот же fab-файл (разные люди развертывают на одном сайте со своих локальных компьютеров). Все в репозитории находится в одном и том же месте.
4. Можете ли вы обновить свой вопрос со всей задачей и командной строкой, используемой для ее вызова?
5. Хорошо, я обновил вопрос. Все три приложения используют один и тот же файл и одну и ту же команду на наших собственных ноутбуках. Существует только один веб-сервер.