Создание пуленепробиваемой проверки Git в нашей работе CD - PullRequest
0 голосов
/ 04 июня 2019

Упрощенная история заключается в том, что у нас есть сайт, установленный на нескольких серверах (например, 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

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Я бы взял (не проверено):

GIT_CHECKOUT="${1:-develop}"
# cleanup *every* untracked file and dir
git clean --force -d -x --quiet
# undo every change to untracked files - might disturb update
git reset --hard HEAD
# now the working tree should be *pristine*
# update all tracking branches and tags
git fetch --all --tags
git checkout --detach
# delete any local branch
git for-each-ref --format="%(refname:strip=2)" refs/heads |xargs -r git branch -D
# checkout
git checkout $GIT_CHECKOUT
0 голосов
/ 04 июня 2019

Имеет смысл, что на 'detached HEAD' вы получаете ошибку при попытке pull ... потому что pull использует восходящую ветвь для слияния ... если вы находитесь на отсоединенном HEAD, у вас не будет восходящей ветки. Выполнение git fetch должно быть достаточно для обновления удаленной информации на локальном. Если вы действительно хотите оформить заказ и не хотите заботиться о том, есть ли у вас грязная среда или нет, вы можете вместо этого попробовать gir reset --hard.

Вот что я бы сделал:

git clean --force --quiet
git fetch --all
git checkout --detach # disconnect from whatever branch I was working on
git reset --hard $GIT_CHECKOUT

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

...