交待下背景。。。公司开发组只有技术经理有服务器和数据库权限,还只是开发环境的。。因为工作安排和权限限制,测试同学上线的时候,需要本人帮开发组的部分同事review代码并把代码提交到trunk。一开始手动diff文件review没问题后copy上传,时间久了,同事间建立了牢固的信任,非重要文件也就不需要review了。嫌麻烦写了个shell脚本(trunk.sh),把需要传的文件和comment分别放在俩文件里(fileList和comment),手动执行脚本,脚本对文件校验处理后copy到trunk目录,然后svn commit到trunk。最近开发同学频繁改动上线,测试同学拼命的向我发文件,严重影响本人的开发工作,终于让我有动力写了一个小系统。在开发服务器上弄了个登录后可以提交需要上传的文件的表单,给测试同学分配了账号密码,测试同学登录后填写文件列表和改动说明提交后过滤重要文件后保存到memcached。我在本地写了个脚本(getTask.php)用crontab定时每分钟请求开发服务器的task.php(task.php的作用是查到memcached的新任务就输出并删除此任务),getTask.php请求到新任务就把文件和coment写在之前的fileList(fileList一行写一个文件名,这里有个坑,当只有一个文件时,如果不在文件名后面加个换行,shell read line读不出来,和手动复制的diff会显示No newline at end of file)和comment,并把时间戳写在current_task_time文件里。另外一个脚本(autosvn.sh)每分钟比较current_task_time和last_task_time,如有不同就执行`cp current_task_time last_task_time`并执行trunk.sh,如果current_task_time和last_task_time相同不执行任何操作。
背景交代完毕,下面就说一下crontab 定时提交svn遇到的坑。首先是trunk.sh手动执行可以(当然,一年内都用了无数次了)。但是用crontab定时执行,收到了报错邮件。百度搜到的两个错误都让我遇到了。
1. 脚本中用了相对路径。脚本中确实为了方便用了一些相对路径。解决方法脚本中统一用绝对路径。
2. 中文乱码问题,在脚本开始加入export LANG=en_US.UTF-8。
3. crontab环境变量和手动执行运行的环境变量不一样。在脚本用加入env,发现确实输出不一样。解决办法:在定时脚本前面加入source ~/.bash_profile,这种方法很大程度上也能解决前面的两个问题。
解决了这俩问题。
发现又报了俩svn的错误
svn: E170013: Unable to connect to a repository at URL 'https://svn.*****.com:10443/******'
svn: E215004: No more credentials or we tried too many times.
Authentication failed
网上搜了很多都找不到解决办法。最后问了下大神同学说我手动执行的时候输入过账号密码并缓存了下来。crontab没有帮我输入账号密码,问我crontab是用的当前登陆用户吗,我说是啊。同学也没辙,让我搜一下svn免登录。没搜到。尝试带上--username和--password,执行成功了。我以为我终于大功告成了。。。
但是我自己要提交代码时,手动svn up竟然也要输入密码了。搞不清svn账号密码的缓存机制。猜想应该crontab执行时输入了账号密码但是没有保存密码,所以把我之前缓存的密码冲掉了。
思路进入两难的境地,定时svn脚本免密了能成功,我自己提交却要输入密码。自己输入完密码并记住后,定时脚本又记不住。。。
后来搜到了 --no-auth-cache 然后我故意svn up --no-auth-cache 不输密码,连按三个回车.报了错。
svn: E215004: No more credentials or we tried too many times.
Authentication failed
恍然大悟,原来crontab即使和手动执行svn一样的用户,也不会此用户之前缓存的密码,而且由于无法输入账号密码,继续往下运行,所以会报svn: E215004的多次输入错误的报错。这里有俩疑惑:
第一,为啥crontab不用我缓存的密码。
第二。如何让crontab支持我手动输入密码并缓存下来(网上有用expect脚本可以替用户输入账号密码)。
最后尝试trunk.sh 里svn命令都带上--username myaccount --password mypassword 以及 --no-auth-cache,执行成功,然后手动执行svn也没再让我输入账号密码。
但我还是觉得脚本里带上svn账号密码不舒服,等有时间再好好找找如何配置svn使得crontab执行svn免登录吧。