Одно и то же имя тега из другого расположения приводит к проблемам

#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. Хорошо, я обновил вопрос. Все три приложения используют один и тот же файл и одну и ту же команду на наших собственных ноутбуках. Существует только один веб-сервер.