Упрощенная история заключается в том, что у нас есть сайт, установленный на нескольких серверах (например, QA, Prod).
Git настроен на другую ветку / тег для каждой среды, и у нас есть сценарии развертывания, которые являются общими для всех сред, чтобы упростить задачу. Сценарии получают нужную ветку / тег, а затем запускают следующие команды:
GIT_CHECKOUT="${1:-develop}"
git clean --force --quiet
git fetch --all
git pull --all
git checkout $GIT_CHECKOUT
У нас есть несколько проблем с этим:
- Так как мы хотим поддерживать как ветку, так и теги, мы используем
git pull
и git fetch
, а git pull
терпит неудачу в режиме отсоединенной головы, который работает, но он выдает несущественные ошибки в наши журналы
- Иногда проверка завершается неудачно из-за грязной среды (обычно это происходит без того, чтобы мы не знали, что именно вызвало это, поскольку никто не менял файлы вручную в этих средах)
Я посмотрел, как Дженкинс делает это, и это выглядит примерно так:
> git fetch --tags --progress https://myrepo.com/repo.git +refs/heads/*:refs/remotes/origin/*
> git rev-parse origin/mytag^{commit}
> git rev-parse mytag^{commit}
> git config core.sparsecheckout
> git checkout -f hash-of-commit
> git rev-list --no-walk hash-of-commit
Наконец, вопросы:
Должны ли мы работать только в режиме отсоединенной головки при развертывании? Это звучит как более стабильное решение.
Есть ли «рецепт» для этой задачи? Это очень распространенная задача, и, несмотря на это, я не смог найти онлайн-рецепт, чтобы сделать это с вашим собственным скриптом bash