【问题标题】:How to set up a single git source on a single server deploying to both staging and production如何在部署到登台和生产的单个服务器上设置单个 git 源
【发布时间】:2015-11-05 05:12:05
【问题描述】:

作为一个项目的唯一开发人员,我正在尝试使用 git 制定一个简单的开发和部署工作流程,并受限于使用单个服务器进行登台和生产。

生产路径为/var/www/vhosts/site.com

暂存路径是/var/www/vhosts/staging.site.com

我了解如何为暂存创建一个分支,并且最好在服务器上拥有prime (live site code) and hub (clone codebase) repos,然后从集线器创建一个本地工作克隆。但是如何在/var/www/vhosts/ 中创建一个同时服务于生产和登台的 git 存储库?我需要单独的仓库吗?

【问题讨论】:

  • prime repo 和 hub repo 是什么意思?
  • @HBHB 嘿,我已经更新了这个问题,提供了一篇关于 Prime 和 Hub 的文章的链接。我认为这只是命名通用配置的一种方式

标签: git server staging dev-to-production


【解决方案1】:

您可以使用外部工作树并“即时”更改它们以用于裸存储库。

在您的服务器上设置裸存储库,然后创建一个 post-receive 挂钩以进行部署。

#!/bin/bash
# post-receive
# deploy production and staging to vhost dirs

# Directory we are deploying to. Should be the directory where the repo's root .gitignore would exist in.
PRODDEST="/path/to/destination/of/production"
STAGDEST="/path/to/destination/of/staging"

while read oldrev newrev refname; do
    # Grab the name of the branch that was pushed.
    branch=$(git rev-parse --symbolic --abbrev-ref $refname)

    if [ "master" = "$branch" ]; then
        echo "Master push, deploy production..."
        GIT_WORK_TREE=$PRODDEST git checkout -f master
        GIT_WORK_TREE=$PRODDEST git clean -fd

    elif [ "develop" = "$branch" ]; then
        echo "Develop push, deploy staging..."
        GIT_WORK_TREE=$STAGDEST git checkout -f develop
        GIT_WORK_TREE=$STAGDEST git clean -fd
    fi
done

这改编自我使用的单分支部署脚本。 我没有对其进行测试,因此可能需要对其进行调整。

基本上,裸仓库运行钩子并检查推送是主推送(并部署生产)还是开发推送(并部署暂存)。

您还可以扩展此钩子以在签出更改后调用构建工具来编译资产等等。我通常会在一切完成后删除所有开发包、源代码和构建工具。

编辑:如果您需要将单个分支推送到多个部署位置,这将不起作用。不确定可以通过推送发送哪些参数,或者是否可以以某种方式使用远程名称。

【讨论】:

  • 我想我已经几乎可以使用您的脚本了。为了测试它,我在/var/www/vhosts 中创建了两个新文件夹。我可以将我的更改推送到这些虚拟生产+暂存文件夹中的任何一个。但是,当我将 STAGDEST 切换到那里有现有代码的正版文件夹时,我在尝试推送时收到很多 remote: warning: failed to remove ... 错误
  • 我想这就是你在最后几句话中的意思?有没有办法可以将它冲洗掉或其他东西(git clean)并允许我重新部署?
  • 哎呀,我忘了在脚本示例中将master 更改为develop。开发部分应该检查开发,而不是掌握。如果部署目标中有现有文件,则脚本可能无法正常工作,因此可能需要进行清理。
  • 清理是指从生产中删除文件吗?因为它是一个实时站点,所以它不能有停机时间。在这种情况下,我假设我需要找到一种替代方法来为这种部署设置 git
  • 是的,从生产中删除所有现有文件。在这种情况下,我建议将生产的内容复制到其他地方并将虚拟主机文档根指向那里或将旧目录符号链接到新目录。这样,您至少可以测试部署系统并将新部署符号链接到虚拟主机位置,同时保持当前工作的生产系统随时可用,以防出现问题。
【解决方案2】:

从本文中,您有一个名为“hub”的主要裸存储库。 “prime”存储库和您计算机上的存储库是“hub”的克隆。

在您的情况下,您有两个“主要”存储库:一个是您的暂存区(“prime-staging”),一个是您的生产区(“prime-production”)。

结合使用文章中描述的钩子和here 描述的钩子(根据推送的分支采取特定操作),您的“prime-staging”或“prime-production”存储库将被更新.

'hub 存储库应该有两个分支:master(或 staging)与您的暂存站点相关联,production 与您的生产站点相关联。您将在master 上完成所有工作,并将这些更改推送到“集线器”,从而允许 git 挂钩更新暂存存储库。您将在实时环境中查看这些更改,在master 上进行任何需要的更改,然后再次推送到“集线器”。一旦暂存站点看起来不错,您将执行以下操作:

git checkout production
git reset --hard master
git push origin production

现在,git 挂钩将看到生产分支已更新,并相应地更新您的生产站点。 (注意:假设 hub 只是命名法,标准的做法是调用您的主存储库 origin

所以我想在服务器上的设置是:

mkdir -p /path/to/site.git
cd /path/to/site.git                          #// hub
git init --bare
cd /var/www/vhosts
git clone /path/to/site.git site.com          #// prime-production
git clone /path/to/site.git staging.site.com  #// prime-staging

你把钩子放在site.git。当staging 分支更新时,更改为/var/www/vhosts/staging.site.com 并执行git pull。在为/var/www/vhosts/site.com 更新production 分支时执行相同操作。

【讨论】:

  • 非常清楚,我仍在阅读 git,尽量保持谨慎。当我在var/www/vhosts 中运行git init 然后git add . 时,将有site.comstaging.site.com 在一个主要回购的顶层。我使用什么命令来创建两个主要存储库(暂存和生产),因为它们位于同一个文件夹中?
  • @kaska 我在评论中用您的问题的答案更新了答案,因为答案中的降价比评论中提供的要好。
  • @kaska 还注意到 ojrask 的解决方案也可以。这是做事的“gittier”方式。我选择了上面的解决方案,因为它似乎与您原始问题中的文章很相配。您选择的解决方案取决于您。
  • 我尝试了 ojraks 的解决方案,如果我部署到空目录中它会起作用,但这有现有代码(一个实时站点)。当我运行上面的 git clone 命令时,我得到fatal: destination path 'staging.site.com' already exists and is not an empty directory
  • 嗯,当然。我提供的设置是从头开始设置。为了解决这个问题,在选择推送production 分支时要做什么的钩子部分,您应该将需要的文件复制到staging.site.com,保持原样(回想一下当前钩子变为staging.site.com 并执行 git pull)。当然,最干净的解决方案是让staging.site.com 成为一个 git 存储库,这意味着您必须将其从当前的非 git 形式切换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
相关资源
最近更新 更多