【发布时间】:2019-06-06 02:23:00
【问题描述】:
简单来说,我们在多台服务器(例如 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在分离头模式下失败,这可行,但它会向我们的日志抛出不相关的错误 - 有时结帐失败是因为环境脏(通常在我们不知道是什么原因导致的情况下发生,因为没有人在这些环境中手动更改文件)
我看了一下 Jenkins 的做法,看起来是这样的:
> 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 脚本来完成此任务
【问题讨论】:
-
为什么不每次都检查一个原始克隆?
-
它要求我们将它放在真实目录之外,然后我们会将所有VC文件同步到真实目录。我们确实尝试了几个月的流程,但对我们来说效果更糟,所以我们现在重新尝试在实际目录中使用 Git。
-
这没有意义。
cd /tmp; git clone http://repo.url/reponame.git; cd reponame在临时目录中为您提供全新的 Git 签出,您可以在测试完成后将其删除。
标签: bash git jenkins pipeline continuous-deployment