GPG verificando as tags do git em um script de implantação

5

Gostaríamos que o nosso processo de implantação fosse retirado diretamente do nosso git repositório, mas só ative novas mudanças se elas estiverem assinadas (via git tag -s ) com uma assinatura GPG. Eu encontrei poucos exemplos por aí de fluxos de trabalho que usam a verificação GPG de tags git, então não tenho certeza se há uma "melhor prática" para esse tipo de coisa.

O que temos até agora é o seguinte:

# 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

Isso faz sentido? Em particular, para evitar erros Mudanças locais de hosing o processo de implantação, é git reset --hard HEAD a coisa certa a fazer? Além disso, lembrar FETCH_HEAD parece ser necessário, outras tags subsequentes a HEAD não aparecem em a saída de git describe . Existe outra maneira de fazer isso?

Como alternativa, se você tiver um fluxo de trabalho de implantação documentado que use tags assinadas para verificação eu estaria interessado em um link para isso.

    
por larsks 31.07.2012 / 06:09

1 resposta

2

O título da pergunta é sobre tags assinadas em um fluxo de trabalho de implantação, mas o que você está perguntando tem muito pouco a ver com as tags assinadas. E, na realidade, o único passo que seria diferente é a verificação das tags, e você já está fazendo isso.

git reset --hard HEAD não limpará arquivos locais não rastreados, o que pode muito bem arruinar seu processo de criação. Depois de git reset --hard você pode querer também executar git clean -d -x -f .

git fetch pode buscar várias ramificações, ou pode não buscar o que você espera que ela obtenha. Todas as ramificações buscadas serão adicionadas a .git/FETCH_HEAD , para evitar surpresas ao usar o FETCH_HEAD ref, recomendo buscar explicitamente seu ramo de lançamento. Algo como git fetch $remote $branch .

Você está perguntando se existe uma maneira "melhor" de fazer isso, mas pessoalmente acho que isso é bom o suficiente. Se o seu objetivo é evitar a busca desnecessária, você pode jogar com a saída de git ls-remote , mas não vale a pena o esforço.

Pessoalmente, para compilações reproduzíveis eu simplesmente começaria a compilação em um diretório limpo toda vez. dir=$(mktemp -d); cd $dir; git init; git remote add ... e assim por diante. Dessa forma, você também pode mover facilmente esse script para uma máquina diferente. Para acelerar a busca inicial, você pode dizer ao diretório temporário para encontrar objetos git do diretório local permanente com um echo $permanent_git_directory/.git/objects > .git/objects/info/alternates ( man gitrepository-layout para mais informações).

    
por 01.01.2013 / 06:54