如何在部署到暂存和生产的单个服务器上设置单个 git 源

How to set up a single git source on a single server deploying to both staging and production

作为一个项目的唯一开发人员,我正在尝试使用 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 存储库?我需要单独的回购协议吗?

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

的克隆

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

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

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

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。当 production 分支更新为 /var/www/vhosts/site.com.

时执行相同的操作

您可以使用外部工作树并更改它们 "on the fly" 用于裸回购。

在您的服务器上设置裸仓库,然后为它创建一个 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

这是改编自我使用的单分支部署脚本。 我没有测试它所以它可能需要调整。

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

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

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