代码 8:编译源码的 STAX 脚本

    <stafcmd>
      <location>'buildserver'</location>
      <service>'process'</service>
      <request>'start command "/root/build/build.sh" username "root" password "password"
        workdir "/root/build" wait stdout /root/build/build.log'</request>
    </stafcmd>

代码 8 指定以用户 root 的身份来运行编译脚本 build.sh,并且将输出重定向到文件 build.log 中,以便分析编译运行的过程和结果。另外如果编译脚本 build.sh 用到某些和路径相关的命令,比如相对路径,则需要指定工作目录。 workdir 指定工作目录为 build.sh 所在的目录,这相当于在 /root/build 目录中运行 build.sh 命令。

3.4 部署测试

更新包编译完成后,需要将编译之后的更新包分发到部署服务器和测试服务器,然后部署服务器部署程序,测试服务器调用测试程序来测试更新包。将更新包分发到部署和测试服务器的 STAX 脚本如代码 9 所示。

代码 9:更新包分发

    <script> serverList = ['deployServer', 'testServer'] </script>
    <iterate var = "server" in="serverList">
      <testcase name = "'buildCopy'">
        <if expr="server != 'deployServer'">
          <stafcmd>
            <location>'buildserver'</location>
            <service>'fs'</service>
            <request>'copy DIRECTORY /root/build/result TODIRECTORY /root/build/result
              TOMACHINE %s RECURSE KEEPEMPTYDIRECTORIES'  % server </request>
          </stafcmd>
        <else>
          <stafcmd>
            <location>'buildserver'</location>
            <service>'fs'</service>
            <request>'copy DIRECTORY /root/build/result TODIRECTORY C:/build/result
              TOMACHINE %s RECURSE KEEPEMPTYDIRECTORIES'  % server </request>
          </stafcmd>
        </else>
        </if>
      </testcase>
    </iterate>

代码9使用了判断语句来判断目标机器的平台,根据目标机器的平台选择不同的文件路径。当只有两台机器时,使用 if-else 的好处并不明显,甚至还不如分别向 windows 和 linux 机器上单独拷贝方便。 但考虑如下的情况,环境中有大量的部署服务器和测试服务器,这时一台一台的拷贝显然很难维护,而使用 if-else 加上循环的方式则要方便的多。

部署测试的 STAX 脚本如代码 10 所示。

代码 10:部署测试

    <sequence>
      <stafcmd>
        <location>'deployServer'</location>
        <service>'process'</service>
        <request>'start command "C:/build/deploy.bat > deploy.log" username "Administrator"
          password "password" workdir "C:/build" wait '</request>
      </stafcmd>
      <stafcmd>
        <location>'testServer'</location>
        <service>'process'</service>
        <request>'start command "/root/build/runtest.sh" username "root" password "password"
          workdir "/root/build" wait stdout /root/build/runtest.log'</request>
      </stafcmd>
    </sequence>

代码 10 中在 Windows 和 Linux 平台运行命令的方式有细微的区别,在 Windows 中我们使用> deploy.log来重定向输出,而在 Linux 中我们使用 stdout 来重定向输出。具体的原因将在经验教训中说明。

至此,我们已经完成了更新包下载、分发、编译、部署和测试的整个过程,根据本节提供的示例代码,读者应该能够根据自己的环境编写出适合环境的STAX脚本。 另外,读者也可以自定义一些附加的操作,比如在更新代码之前,先把原有的代码删除;在测试完毕后,把分散于各个服务器上的日志汇总到一台集中的机器上;甚至和 CruiseControl 结合实现定时或者基于 CVS 上的代码更新来运行,以及将测试的日志发布到某台服务器上。