Archive for May, 2010

Skip changelog computation on Hudson

2010-5-27 20:52 | by 2ndboy

  Hudson 的 changelog computation 功能其实是个很有用的功能,但是如果你的项目是用 CVS 做 SCM 的,而且项目又特别大,那么这个 changelog computation 做起来那可是耗时巨大!就拿工作上的项目来说,CVS update + changelog computation + clean build 耗时 3 个多小时,其中居然有 2 个多小时是在做 changelog computation!!!所以即便是 local daily build 出了错,留给开发的反应时间太短。关于如何禁用这个 feature,在 Hudson 的 Wiki 上找到一篇文档。按照文档所述如法炮制,修改 Hudson home 目录下的 hudson.xml(这是 Hudson service 的配置文件),在 节点下加一句:

  1. <env name="hudson.scm.CVSSCM.skipChangeLog" value="true"/>

  但是试过以后发现根本没效果,所以看来文档上说的“In general, these switches are often experimental in nature, and subject to change without notice.”不是在忽悠:) 这么看来,不存在 disable changelog computation 一说,顶多也只能 skip。

  今天尝试的一个方法可以达到绕过 changelog computation 的目的——建个新 job,workspace 设定成跟真正需要 build 的 job 一样。这个新 job 只做 SCM 部分的工作,然后早于需要 build 的 job 运行,这样等真正需要 build 的 job 运行起来的时候,changelog computation 的时间会大大缩短,现在用了这招后,我们的项目全程 build 时间减少到了正常的 1 小时左右。

[Update: 2010/7/8]
实践中发现上面这一招还是有玩儿不转的时候,比如在第一次和第二次 update 之间有过大量 code commit 的情况下,这个更新过程还是会长的让人崩溃。所以今天又换了个思路,干脆绕过 Hudson 的 SCM update 机制,用命令行自己来 update code。

方法是在所有的 build step 之前再加一个 Execute Windows batch command,示例内容如下:
@echo off
echo Updating src …
cd %WORKSPACE%\src
cvs -d :pserver:username:password@cvs_server_address:module update -P -d

由于 Hudson 在每次执行批处理的时候都会把 current path 设置在 workspace 下,所以命令序列里不用加切换盘符的内容,只需要按照实际需要切换路径就可以了。

shell in Hudson

2010-5-26 22:34 | by 2ndboy

  以下内容说的是 Windows 平台,在 *nix 下用 shell 没什么好说的:)

  在 Hudson 的系统设置里可以设置“Shell executable”,在 Windows 下,最好的选择是 Cygwin。不改 Cygwin 的默认安装路径的话,这里可以设置成“C:\cygwin\bin\sh.exe”,然后就可以在 job 设置里 add 一个“Execute shell”的 build step 了。这种情况下取 Hudson 预设环境变量的话可以在变量名前加“$”,比如 job 的 workspace 路径——$WORKSPACE。

  如果不想装 Cygwin,或者觉得 shell 脚本太弱的话,Hudson 还支持用 Python 做 shell。这种情况下不用在系统设置里对“Shell executable”做什么设置,而是用 *nix 下 shell 脚本惯用的首行注释来指明 Python 解释器的位置。在 job 设置里用“Add build step”加一个“Execute shell”,然后在“Command”里直接写 Python 代码,比如第一行写:

  1. #!E:\Python26\python.exe

就可以用 Windows 风格的路径来指示 Python 解释器所在的位置。这这种情况下,取 Hudson 预定义的环境变量要用库函数:

  1. import os
  2.  print( os.getenv('WORKSPACE') )

  还有一种情况是你的 Windows 系统里没装 Python,而是把 Python 装在了 Cygwin 里,这种情况下要配置系统设置里的“Shell executable”,然后 Python 脚本可以放在磁盘文件里。Command 里可以写成形如:

  1. /bin/python /cygdrive/E/foo/2ndboy.py

或者:

  1. /bin/python E:/foo/2ndboy.py

但不能写成:

  1. /bin/python E:\foo\2ndboy.py

第一种“/cygdrive/E/foo/2ndboy.py”的形式是 Cygwin 里用于访问其它分区的语法形式,因为“/”只能访问到 Cygwin 的安装路径而已。

学车手记之——倒反库、移库、侧方停车

2010-5-23 15:26 | by 2ndboy

  教练曰:开弓没有回头箭,所以倒桩一学起来就连续教一串。5/13 倒正库,5/18 倒反库,5/21 移库,5/23(今天)侧方停车。今天是头一回在周末去学车,人没有我想象中的那么多。在场地里发现高尔夫球若干,居然有人在场地边上运动场的草坪上打高尔夫O_O

倒反库:
1. 左前窗门销跟(3)(6)号杆快成一条直线时左一圈半(到底)
2. (2)号杆在左后窗小三角中间时右回半圈
3. (2)号杆与左后窗立柱重合时再左打半圈(到底)
4. 注意右反光镜,(1)(6)号杆都能看到时回正(右转一圈半)

移库:
1. 一进:原地右打一圈,一档先前,左径对准(2)号杆时左打两圈,在(2)号杆前停下
2. 一倒:原地右打两圈,后退,左径对准(3)号杆时左打两圈,停在停车线
3. 二进:原地右打一圈半,一档向前,车左角过(2)号杆右侧一圈时左打一圈半(回正),在(2)号杆前停下
4. 二倒:原地右打两圈,后退,左后门把过中线时左打两圈,左前轮完全过中线后马上停车(否则容易出线)

倒正库、倒反库和移库全学完后就是一套完整的倒桩移库,全套动作的顺序是:
1. 从库的右前方倒正库倒入乙库(这时方向盘是回正状态)
2. 从乙库移库到甲库(结束时方向盘是向左一圈的状态,出库时不动方向,前进到车头在(2)(3)号杆中间时回正,从两根杆中间穿过,车左角到达黄底线时左打一圈半来到倒反库的位置)
3. 倒反库进入甲库,车完全进库后就可以开出的初始位置了

侧方停车:
1. 开左转向灯,倒档,车动起来后关左转向灯
2. (1)号杆与右后窗粗立柱重合时右打一圈半(到底)
3. 注意左后视镜,刚刚能看到(4)号杆时左打一圈半(回正)
4. (1)号杆刚刚出现在前挡风玻璃右边时左打一圈半(到底)
5. 继续倒车至车前左角对到(1)号杆时马上刹车(这时方向盘还是左打一圈半的位置),拉手刹
出停车位:
1. 开左转向灯,一档,放手刹,鸣笛,车动起来后关左转向灯
2. 车前左角挡住左边黄线时右打一圈半(回正)
3. 右后视镜完全过(1)号杆时右打一圈(打早了车右侧容易擦(1)号杆)
4. 车身摆正时左回一圈(回正)
侧方停车

发现没上手之前背动作没什么效果,还不如实地操作两把记得快。教练说现在九选四改成了九选三,如果必考项跟以前一样还是侧方停车和定点停车的话,随机抽取项就只有一项了。

学车手记之——倒正库

2010-5-16 21:23 | by 2ndboy

  周四学了倒正库,貌似网上也有人叫倒桩。说实话看其他人练的时候感觉动作挺复杂的,但是自己上去练了两把也就会了。虽然第一次转弯时离合器放得太快熄火,不过后来的几把就特别顺。教练说我们练的车跟几个月前的人不一样,他们那时候是两圈打死,我们现在用的车是一圈半就打死。今天网上查了一下,貌似是今年一月份以后教练车的方向盘改了助力方向盘,所以就不一样了。

  回来之后根据教练教的方法做了个能放在 iPT 看的图,方便万一忘了的时候看看:)
倒正库