Shell封装linux命令--代码同步

今天解决第一个问题:服务器在异地,在Win上使用SI(SourceInsight)同步代码比较麻烦。

当前使用的方案:

  将code复制到Win并创建SI工程。这意味着,在SI上对代码的任何修改,都需要手动copy到服务器替换指定路径下的文件。由于路径层次比较深,每次改动的文件又可能在不同的目录下,这将是一个比较耗时的麻烦事。

  看到这里,大家脑海里应该会浮现出使用samba映射服务器路径”的方法。实践发现,这个方案并不可行,因为这会导致SI上切换不同文件速度太慢。

解决方案:

  由于程序员是一群了不起的实践者,我决定践行这个自己编造的谣言。我想用“在Win上搭建虚拟机”的方法解决这个问题。

  Step1:Win上搭建虚机。

  Step2:服务器发送代码到虚机。

  Step3:samba映射虚机指定目录到Win,SI创建工程。

  Step4:将SI上的代码改动同步到服务器。

Step1略。

  很简单,相信大家自己可以搞定。后面有机会再补充虚机的搭建。

Step2:服务器发送代码到虚机。请注意,所有命令都是在服务器执行的,不要登录虚机去执行,不利于脚本实现。

  <1> 将代码备份,将备份代码中.c .h 文件保留,其他文件,全部删除。

    # cp code_lsv/ code_tmp/ -rf
    # find code_tmp/ -not -name "*.c" -not -name "*.h" -exec rm {} \; >/dev/null 2>&1 

  <2> 将清理后的备份代码打包压缩。

    # tar czvf code.tar.gz code_tmp/

  <3> 将压缩包发送到虚机。

    # scp code.tar.gz binbin@ip:

  <4> 将压缩包在虚机解压。

    # ssh binbin@vbox_ip "tar xvfcode.tar.gz -C /code/path/"

  <5> 将解压后的代码做初始化操作以方便后续代码同步:将每个.c .h 文件映射一个.c.last .h.last。

    a. 将所有.c .h的文件名找出来放到一个文件中(.pcode.conf)

      # find . -name '*.c' > ~/.pcode.conf

      # find . -name '*.h' >> ~/.pcode.conf

    b. 循环读取该文件,将该文件复制备份。(cp file.c file.c.last)

      while read i
           do
                   cp $i ${i}.last
                   cp $i  ~/.pcodechange/
           done < ~/.pcode.conf

    这一步操作要解释下:想一下,如何同步代码呢?

      方法一:同步时,将所有文件都发送回服务器,然后依次替换编译路径下的相应文件。文件有几十万,我怕把服务器累死啊!

       方法二:同步时,将改动文件发送回服务器,然后依次替换编译路径下的相应文件。我想,这会仁慈很多。

    那么,如何把SI上修改的文件找出来?

      方法一:在把代码发送到虚机之后,在虚机上代码路径下的每个文件都备份一下。

          同步时,就比较该文件和备份文件是否一致,如果是,说明文件没有被改动;

          如果不一致,即该文件被改动过,需要同步到服务器。

          同步完成后,将当前文件覆盖备份文件,以方便下次比较。

       方法二:用stat可以看到文件的修改时间。所以,代码发送完毕之后,将每个文件的修改时间保存。同步时,判断修改时间是否改变,如果改变,需要同步到服务器。同步完成后,更新其修改时间。

     方法三:用哈希判断。可以用md5给每个文件生成一个哈希值。同步时,判断文件的哈希是否改变,如果改变,需要同步到服务器。同步完成后,更新哈希。

     我选择方法一,不要问为什么,我不想告诉你,是因为当时脑残。

   所以,代码被发送到虚机后,我们对每个文件做备份文件以方便比对该文件是否被修改过。

代码的发送已经搞定。

Step3:samba映射到Win,创建SI工程。

  太简单,略过。

Step4:代码同步回服务器并替换指定文件。请注意,所有命令都是在服务器执行的,不要登录虚机去执行,不利于脚本实现。

  <1> 将虚机上修改过的代码找出来。

    # find . -name '*.c' > ~/.pcode.conf

    #find . -name '*.h' >> ~/.pcode.conf

    while read i
         do
             diff $i ${i}.last > /dev/null
             if [ $? -ne 0 ] 
             then
                 cp $i ${i}.last
                 cp $i  ~/.pcodechange/
             fi 
         done < ~/.pcode.conf

  <2> 发送到服务器。

    #scp binbin@ip_vbox:.pcodechange/* .

  <3> 将各个文件替换掉编译路径的相应文件。

    for i in $(ls $file_dir)
           do   
              file_name=`basename $i ${suffix}`
       find . -iname "$file_name"
              cp -f $i $filex  
          done 

代码的同步已经搞定了。


现在,我们可以通过以下方法实现代码的同步:

  psend /the/code/path#代码发送到虚机。

  SI编辑代码。

  /the/code/path # psync#修改的代码自动同步到服务器。

看下效果:


Shell封装linux命令--代码同步_第1张图片

以上只是大概的思路。如果真的要做成一套工具,还有很多问题需要解决:

  <1> 为了方便功能的扩展,如何设计整个框架?

  <2> 如果代码分支有很多,如何避免用户将REL_164的代码同步到了REL_171的代码?

  <3> 在scp的时候,默认是有交互的,如何跳过交互自动执行?

  <4> 如何方便用户使用?如何能尽可能简单明了?

  <5> 如何实现同步完成之后,revert回原来的版本?

  <6> 如何能让用户更方便的记得你工具的名字?

  <7> 随着功能越来越复杂,如何有效维护?如何有效调试?必要的打印一定要有。

  <8> 如何实现多个功能的自由组合?

    比如,同步代码是psync,编译代码是pmake,将镜像传递到路由器是cpimg,发送邮件是pmail,

    如何设计才能实现一条龙?psync && pmake && cpimg && pmail;

    需要尽可能减少交互 + 每个cmd实现单独功能。

  <9> 如何处理各种异常?比如,scp时候权限不够退出了怎么办?查找的文件不存在怎么办?你如何第一时间找到出错原因?

   如何提高执行的效率?


代码实现可以在这里下载到,欢迎查阅:

  https://git.oschina.net/powerbinbin/shell_esson_pwater





你可能感兴趣的:(技术类)