如何让 svn 查找是否每分钟更新一次以及是否调用某个脚本?

如何让 svn 查找是否每分钟更新一次以及是否调用某个脚本?

我正在开发一个服务器应用程序。我有一台装有 Debian 的远程计算机,用于测试。目前,当每个新的 svn 版本出现时,我都会手动更新服务器。它只是一个测试服务器,其上的流量对我来说是免费的。我创建了一个简单的脚本,用于下载最新的 svn ( HEAD) 修订版并重新编译我的服务器。

我想知道是否可以创建一个 .sh 脚本(与 Debian 兼容),普通用户(不是 SU)可以从类似的内容开始,nohup ./superScript.sh >& /dev/null &并且每分钟查看一次 SVN,找出当前版本,如果有更新,运行如下命令:

kill `ps aux | grep -F 'ServerAPP' | grep -v -F 'grep' | awk '{ print $2 }'` 
./server_automated_net_setup.sh
cd server/install-dir/
export LD_LIBRARY_PATH=./:~/server/install-dir/lib_boost:~/server/install-dir/lib_openSSL
nohup ./ServerAPP >& /dev/null &

这将终止当前正在运行的应用程序,运行我们在用户主页 ( ~) 中已有的一些自动更新脚本,然后再次运行它。

是否可以创建这样的脚本以及如何创建?

答え1

好吧,任何脚本都可以编写,但我首先想到监控和更新的方法略有不同(我每分钟连接到仓库)

  1. 如果您可以管理存储库,则将通知从存储库推送到服务器,而不是从服务器提取存储库(存储库中的提交后挂钩可以执行此操作)几乎所有东西
  2. 在“提交发生”事件服务器上运行脚本,其中
    • svn up代码到本地工作副本
    • svn export从 WC 到某个位置的代码
    • ...执行所有其他步骤

如果您无法使用存储库挂钩,请添加svn up | grep + some code用户的 crontab。

需要使用 grep for svn up 来区分有数据的更新和无数据的更新。

真实更新(示例)

>svn up
Updating '.':
U    index.html
Updated to revision 9012.

空更新

>svn up
Updating '.':
At revision 9012.

受影响物体前面的字母显示动作

A  Added
D  Deleted
U  Updated
C  Conflict
G  Merged
E  Existed
R  Replaced

答え2

您可以将所有这些命令合并到一个.sh文件中,如下所示:

#!/bin/bash
kill `ps aux | grep -F 'ServerAPP' | grep -v -F 'grep' | awk '{ print $2 }'` 
/full/path/to/server_automated_net_setup.sh
export LD_LIBRARY_PATH=./:~/server/install-dir/lib_boost:~/server/install-dir/lib_openSSL
nohup /full/path/to/ServerAPP >& /dev/null &

将其全部粘贴到文件中yourname.sh并使其可执行:

chmod +x yourname.sh

此外,还可以直接从 script 结帐svn co url://,并且您将能够自动化整个过程。

答え3

要回答有关普通用户的问题,如果您的程序(假设基于网络的服务器)使用非特权端口(大于 1000),则用户无需 su/sudo 即可运行它。

采取不同的看法。

if ./server_automated_net_setup.sh; then
    kill `ps x --no-header --format=pid,cmd | awk '!/awk/&&/ServerAPP/{print $1}'` 2>&-
    cd $HOME/server/install-dir
    nohup env LD_LIBRARY_PATH=./:$HOME/server/install-dir/lib_boost:$HOME/server/install-dir/lib_openSSL ./ServerAPP >& /dev/null &
fi

如果更新和重建了某些内容,则需要更改server_automated_net_setup.sh为返回成功( ) ,如果没有任何更改,则返回失败()。01

然后在每个周期从 cron 调用这个脚本。如果您有每一分钟的时间,则更新和重建软件之间可能会出现过多的磁盘抖动。也没有什么可以阻止您自己调用脚本。

对于server_automated_net_setup.sh,我会做一些接近的事情:

wcdir=$HOME/source/myworkingcopy
if [ -n `svn status -qu $wcdir | awk '/^........\*/'` ]; then
        gmake -C $wcdir svn-update rebuild deploy
    echo $?
else
    exit 1
fi

gmake在部分构建之前执行 svn+update 并将工件复制到安装目录(部署)。

関連情報