如何在部署到暂存和生产的单个服务器上设置单个 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
这是改编自我使用的单分支部署脚本。 我没有测试它所以它可能需要调整。
本质上,裸仓库运行挂钩并检查推送是主推送(并部署生产)还是开发推送(并部署暂存)。
您还可以扩展此挂钩以在签出更改以编译资产等之后调用构建工具。我通常会在一切完成后删除所有开发包、源和构建工具。
编辑:如果您需要将单个分支推送到多个部署位置,这将不起作用。不确定可以通过推送发送哪些参数,或者是否可以以某种方式使用远程名称。
作为一个项目的唯一开发人员,我正在尝试使用 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
这是改编自我使用的单分支部署脚本。 我没有测试它所以它可能需要调整。
本质上,裸仓库运行挂钩并检查推送是主推送(并部署生产)还是开发推送(并部署暂存)。
您还可以扩展此挂钩以在签出更改以编译资产等之后调用构建工具。我通常会在一切完成后删除所有开发包、源和构建工具。
编辑:如果您需要将单个分支推送到多个部署位置,这将不起作用。不确定可以通过推送发送哪些参数,或者是否可以以某种方式使用远程名称。