Назад | Перейти на главную страницу

GPG проверяет теги git в сценарии развертывания

Мы хотели бы, чтобы процесс развертывания происходил непосредственно из нашего репозитория git, но активировал новые изменения только в том случае, если они подписаны (через git tag -s) с подписью GPG. Я нашел очень мало примеров рабочих процессов, в которых используется проверка тегов git GPG, поэтому я не уверен, есть ли «лучшая практика» для такого рода вещей.

То, что у нас есть, выглядит так:

# discard erroneous local changes
git reset --hard HEAD

# get changes
git fetch
start=$(git rev-parse FETCH_HEAD)

# get new tags
git fetch --tags

# find most recent release tag
tag=$(git describe --abbrev=0 --match "release-*" $start)

if git tag -v $tag; then
  git checkout $tag
  ...do stuff...
fi

Имеет ли это смысл? В частности, чтобы избежать ошибочных локальных изменений в процессе развертывания, git reset --hard HEAD что делать? Кроме того, вспоминая FETCH_HEAD кажется необходимым, другие мудрые теги после HEAD не отображаются в выводе git describe. Есть другой способ сделать это?

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

Заголовок вопроса касается подписанных тегов в рабочем процессе развертывания, но то, что вы спрашиваете, имеет очень мало общего с подписанными тегами. И на самом деле единственный шаг, который будет отличаться, - это проверка тегов, и вы уже это делаете.

git reset --hard HEAD не будет удалять неотслеживаемые локальные файлы, которые вполне могут испортить ваш процесс сборки. После git reset --hard Вы можете также захотеть запустить git clean -d -x -f.

git fetch может получить несколько ветвей или не получить то, что вы ожидаете получить. Все выбранные ветки будут добавлены в .git/FETCH_HEAD чтобы избежать сюрпризов при использовании FETCH_HEAD ref, я бы рекомендовал явно получить вашу ветку выпуска. Что-то вроде git fetch $remote $branch.

Вы спрашиваете, есть ли «лучший» способ сделать это, но лично я думаю, что этого достаточно. Если ваша цель - избежать ненужной выборки, вы можете поиграть с выводом git ls-remote но это действительно не стоит усилий.

Лично для воспроизводимых сборок я бы просто каждый раз запускал сборку в чистом каталоге. dir=$(mktemp -d); cd $dir; git init; git remote add ... и так далее. Таким образом, вы также можете легко перенести этот скрипт на другой компьютер. Чтобы ускорить начальную выборку, вы можете указать временному каталогу найти объекты git из постоянного локального каталога с echo $permanent_git_directory/.git/objects > .git/objects/info/alternates (man gitrepository-layout для получения дополнительной информации).