在我们的CD作业中进行防弹Git检出

时间:2019-06-04 09:53:44

标签: bash git jenkins pipeline continuous-deployment

简化的故事是,我们在多个服务器(例如QA,Prod)上安装了一个站点。 对于每个环境,Git都设置为另一个分支/标签,并且我们拥有针对所有环境通用的部署脚本,以简化操作。脚本正在获取所需的分支/标记,然后运行以下命令:

GIT_CHECKOUT="${1:-develop}"
git clean --force --quiet
git fetch --all
git pull --all
git checkout $GIT_CHECKOUT

我们对此有一些疑问:

  • 由于我们要同时支持分支和标记,因此在分离头模式下使用git pullgit fetchgit pull均会失败,虽然可以,但是会向日志中引发无关的错误< / li>
  • 有时结帐是由于肮脏的环境而导致的(通常情况下,由于没有人手动在这些环境中手动更改文件,因此首先我们不知道是什么原因导致结帐)

我看了詹金斯的做法,看起来像这样:

 > 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 :(得分:0)

有意义的是,在“分离的HEAD”上尝试拉时会出现错误...因为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

唯一的事情是您没有在本地移动任何东西(例如,没有本地分支与远程分支一起移动)。

答案 1 :(得分:0)

我的看法是这样(未品尝):

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