【问题标题】:Making a bullet-proof Git checkout in our CD job在我们的 CD 工作中进行防弹的 Git 检出
【发布时间】: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 pullgit fetchgit 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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我的看法是这样的(未经测试):

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      相关资源
      最近更新 更多