svn的post-commit末能执行

在开发一个后台系统,用svn管理代码。以前用做过同样的事情,希望commit代码后能自动更新网站。

用的是centos 64bit。原理很简单,就是在depot下的hook目录有个post-commit.tmpl, 文件里有详细的使用说明,拷贝成post-commit,增加需要的命令(同步服务器的部属目录)。
一些有坑的地方:

  1. 执行post-commit时是没有环境变量的,如需要环境变量,得自己重头设置。
  2. 脚本对svn damon的所有者(譬如apache)有可执行权限 744。
  3. 目标目录对svn update的执行者(譬如apache)要有可写权限 chown -R apache:apache。

遗憾的是,commit后,脚本没有执行成功。 查找原因时,祭出日志大法, 把结果输出到日志文件。结果显示”svn update”命令末执行。 进一步测试,脚本本身是执行的。 突然想起来,可能是error没有输出到output, 于是在 “svn update >> $log 2>&1″, 果然有error: “….. Store password unencrypted (yes/no)? svn: Can’t read stdin: End of file found”。命令里面其实是有用户名密码的,但是apache用户没能存成临时文件(用root用户测试脚本没问题)。 最后的解决方法是,在”svn update –username xxx –password yyyy” 后面加上参数 ” –no-auth-cache –non-interactive” , 网站在commit后终于自动更新了。 ; )

小技巧:

  1. post-commit执行败的话,commit也会失败,并在客户端显示出错。
  2. 测试post-commit时,可以直接运行这个脚本,不用每次在客户端上传一次文件。

[脚本]
/usr/bin/svn update /***/***/***/ –username ***** –password ***** –no-auth-cache –non-interactive –force

[环境]
CentOS release 6.2 (Final)
svn, version 1.6.11 (r934486)

Leave a Reply

Your email address will not be published. Required fields are marked *