GPG 在部署脚本中验证 git 标签

lar*_*sks 5 deployment git

我们希望我们的部署过程直接从我们的 git 存储库中提取,但只有在签名时才激活新的更改(通过 git tag -s在使用 GPG 签名)签名。我发现很少有使用 GPG 验证 git 标签的工作流示例,所以我不确定是否有此类事情的“最佳实践”。

到目前为止,我们所拥有的看起来是这样的:

# 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
Run Code Online (Sandbox Code Playgroud)

这有意义吗?特别是,为了避免在部署过程中进行错误的本地更改git reset --hard HEAD,这样做是正确的吗?此外,记住FETCH_HEAD似乎是必要的,其他明智的标签随后HEAD不会出现在git describe. 有没有另一种方法可以做到这一点?

或者,如果您有一个使用签名标签进行验证的文档化部署工作流程,我会对指向它的链接感兴趣。

chu*_*utz 2

问题的标题是关于部署工作流程中的签名标签,但您所问的问题与签名标签关系不大。实际上,唯一不同的步骤是验证标签,而您已经在这样做了。

git reset --hard HEAD不会清除任何未跟踪的本地文件,这很可能会破坏您的构建过程。之后git reset --hard你可能还想跑git clean -d -x -f

git fetch可能会获取多个分支,或者可能无法获取您期望它获取的内容。所有获取的分支都会被添加到其中,.git/FETCH_HEAD以避免使用FETCH_HEAD引用时出现任何意外,我建议显式获取您的发布分支。就像是git fetch $remote $branch

您问是否有“更好”的方法来做到这一点,但我个人认为这已经足够好了。如果您的目标是避免不必要的获取,那么您可以使用 的输出,git ls-remote但这确实不值得付出努力。

就个人而言,对于可重现的构建,我每次都会简单地在干净的目录中启动构建。dir=$(mktemp -d); cd $dir; git init; git remote add ...等等。这样您还可以轻松地将此脚本移动到另一台计算机。echo $permanent_git_directory/.git/objects > .git/objects/info/alternates为了加快初始提取速度,您可以使用(man gitrepository-layout了解更多信息)告诉临时目录从永久本地目录中查找 git 对象。