svn部署问题

svn如何部署成 同一个站点 两个域名 一个为正式域名 一个为测试域名 然后通过提交自动更新到 测试域名可测 正式域名需要进入服务器进行update才可以上线到正式域名 是如何实现的呢?现在遇到的问题就是 现在只有一个站点 但是要进行二次开发 开发过程不想影响线上代码。

阅读 1.7k
2 个回答

同一份代码部署成不同的服务, 通过配置划分测试和正式,然后测试和正式的域名解析到相应的服务地址就可以了, 测试环境可以使用脚本触发自动部署.

SVN 也有钩子 hook,比如 post-commit 就是在 commit 的时候触发的。你的问题也就是钩子如何触发拉取操作。

根据你的问题描述,如果 SVN SERVER 与 测试站点 在同一服务器上,那么 post-commit 可很方便的解决,大致即:

在项目库的 hooks/ 目录下新建 post-commit 文件,内容大致为:
export LANG=en_US.UTF-8
SVN=/usr/bin/svn            #这里配置的是svn安装bin目录下的svn文件
WEB=/var/www/html/test      #要更新的目录
$SVN update $WEB --username cqh --password 123456
chown -R www:www  $WEB

另一种情况,即 SVN SERVER 与 测试站点 不在一台机器上。那么 post-commit 的脚本就改成 CURL 请求一个 URL。该 URL 为测试站点所提供,URL 内容即接收 SVN 的钩子请求,并调用本机的脚本执行 update 操作。

此方式与 Git 的 Web hook 是一样的。以下是我使用过的代码,仅供参考:

提供给 hook 请求的 URL 文件:

<?php

$baseDir = dirname(__DIR__);
$rawData = file_get_contents("php://input");
$payLoad = json_decode($rawData, true);

//以下为 Git 的请求,并对请求合法性进行校验,换成 SVN 大致也是一样的,自己在 hook 中请求该 URL 时附带校验参数即可
//监测请求来源合法性
if ($_SERVER['HTTP_X_GOGS_SIGNATURE'] != hash_hmac('sha256', $rawData, '123456')) {
    exit('Signature authentication failed');
}
//检查是否为 master 分支
if ($payLoad["ref"] != "refs/heads/master") {
    exit('"ref" requires the "master" branch');
}

$scriptPath = $baseDir . '/script/pull.sh';

$handle = popen("sh {$scriptPath} 2>&1", 'r');
echo stream_get_contents($handle);
pclose($handle);

执行 UPDATE 操作的 SHELL 脚本:

#!/usr/bin/env bash

set -e

SITE_PATH=$(dirname $(dirname "$0"))
USER=$(whoami)
cd $SITE_PATH
git reset --hard origin/master
git clean -f
git pull
git checkout master
chown -R $USER $SITE_PATH
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题