how to pre-test before checkin

对代码高质量的追求从来都是不停歇的,对于如何保证提交代码的质量,可以划分两种:

(1)事后处理式:提交代码后,“通知”测试;
(2)事前预防式:提交代码前,“通知”测试;

方式(1)的缺点在于,如果测试发现问题时,代码已提交,如果期间其他人进行测试或基于已提交代码进行其他开发必然深受其害。

所以在实践中,方式(1)虽然最常见,但是效果并不好,因为只是发生错误后的处理,所以大多更倾向于方式(2)。

于是对于方式(2)的实现又衍生出两方式:

(1)同步方式:提交代码时->同步执行测试->测试通过允许提交,测试失败,拒绝提交。这种方式很容易成为程序员的噩梦,因为特别对于喜欢频繁提交的人来说,随着测试用例耗时的增加,同步等待的时间越长,所以为了减少同步等待时间,只能做些简单的编译检查或者极少的测试用例。

(2)异步方式:基于方式(1)的分析,从最佳实践上,果断选择异步方式,异步方式最常见实践是:提交代码到非产品库->通知测试->测试通过,自动将非产品库代码Merge到产品库,测试不通过不Merge。
其实这种方式如果不采取全自动化的方式更像大多程序员的“私有包实践”:checkout代码->修改代码build出“私有包”->测试->测试通过,将代码提交,否则不提交。相信做过这样的事情的人都能体会其中的繁琐,不言而喻,只要任何一项不是自动化,必将降低效率,同时也容易出错。所以自动化全异步方式是必然趋势。

如何实现:

目标: 可参考《持续交付》

source

核心思想:创建一个中间repo,所有代码提交只能进中间repo,一旦有代码提交到repo,通过预先配置好的hook通知jenkins中事先配置好的job,job接受到通知后,首先拿出repo的最新代码与产品代码master进行merge,然后基于结果代码做测试,如果成功,则push代码进master,如果失败,则不提交进master。这样一个过程使得master的代码一直都是经过测试考验的随时可部署的。

示例工具: Jenkins + GitLab

流程:CI Pre-test flow

 

要点:(1)  禁止直接提交代码到主库master

具体执行:

(1)创建专门为测试而用的branch,例如test;

(2)为test branch设置web hook: 这里可以定制监听的事件,一般默认push即可

Jian Fu  test-ci  GitLab - Google Chrome

http://bkci.qa.com/jenkins/git/notifyCommit?url=http://gitlab.qa.com/jiafu/test-ci.git&branches=test

(3)设置jenkin job:

这里有3个地方要设置:

3.1  SCM: 注意Merge Before Build

SCM-1

3.2  Build Trigger: 勾选Poll  Scm,否则通知能收到,但是执行不了。

scm2

3.3  Git Publisher:  勾选Push only if build success

SCM3

 

经过以上几步简单操作,即可实现:再也不用担心产品代码因为自己的小失误而搞乱,始终保持产品库的整洁。

 

 

several practices relate with git

1 How to install git by “make”

编译基础环境环境和依赖的包


yum -y install gcc make

yum install -y curl curl-devel zlib-devel openssl-devel perl perl-devel cpio expat-devel gettext-devel

对于定制的一些系统,找不到依赖时,可能要修改repo源:http://mirrors.163.com/.help/centos.html:


wget http://mirrors.163.com/.help/CentOS6-Base-163.repo

如果遇到下载不了的,可以手工下载至/var/cache/yum/i386/6/base/packages类似目录

下载和安装:


wget   http://www.codemonkey.org.uk/projects/git-snapshots/git/git-latest.tar.xz

xz -d git-latest.tar.xz

tar -xvf git-latest.tar

cd git-2015-09-07/

autoconf

./configure

make && make install

 ln -s /usr/local/bin/git /usr/bin/git

批处理命令为:


wget   http://www.codemonkey.org.uk/projects/git-snapshots/git/git-latest.tar.xz; xz -d git-latest.tar.xz; tar -xvf git-latest.tar; cd git-2015-09-07; autoconf; ./configure; make && make install; ln -s /usr/local/bin/git /usr/bin/git

 2 Jenkins download git repository timeout error:

Jenkins使用git作为scm时,默认N多操作使用的都是10分钟作为timeout时间的设置,当git clone的repo太大,例如超过1G或下载速度太慢时,会download不了代码:

08:36:53 ERROR: Timeout after 10 minutes

所以要求助git jenkins插件的”Additional Behaviours“修改下timeout的时间以解决timeout问题:

1111111111nfig [Jenkins] - Google Chrome

3 How to download sub folder for GIT in jenkins:

当一个repository太大时,N个JOB如果没有共享workspace,则占用磁盘的空间为N*repo大小,而实际中,我们确实只需要git里面的某一个子目录而已,所以可以使用sparse checkout来解决,同样求助于Additional Behaviours来设置:

2222222222222

 

4  How to limit git scm poll change path limit:

使用GIT(Github.Gitlab,etc)的web hook的通知,可以让有代码改动时,通知到Jenkins job去自动执行,但是如果想限制某个目录的代码改动才触发Jenkins job,可以同样求助于Additional Behaviours:

hi

 

 5  Git Merge with remote host.


1006  git clone  https://jiafu@stash-eng-chn-sjc1 /git/stach.git

1023  git remote add remotename https://jiafu@stash-eng-chn-sjc1/git-fork/stach.git

1034  git fetch remotename /feature/930

1045  git merge remotename /feature/930

1046  git status

1061  git checkout -b gate/20161202

1051   fix conflict

1052  git add/commit

1053  git push remotename gate/20161202

6 保存密码

  $ git config --global credential.helper cache
  # 默认缓存密码15分钟,可以改得更长, 比如1小时
  $ git config --global credential.helper 'cache --timeout=3600'

Jenkins’ remote build methods

某些场景下,我们需要远程执行一个job, 例如和其他工具做集成时,符合某个条件之时立即触发job。涉及远程执行的帮助文档可以随意寻找一个job的url然后加上/api(例如http://[jenkins dns]/job/jobName/api)来获取帮助,按照是否启动security可以划分为两类情况:

1 未启动security

直接发Post请求    POST  http://[jenkins dns]/job/jobName/build

可使用工具curl来执行POST:

curl -X POST http://[jenkins dns]/job/jobName/build

2 启动security

2.1   不带用户名:令牌方式

(1)  在Build Trigger设置授权Token:例如设置为1234567890

111_2

(2) 使用POST请求  POST  http://[jenkins dns]/job/jobName/build?token=1234567890

 

 2.2  带用户名:curl等工具方式:

上面的方式无法看到是具体哪个用户执行的build, 所以可以采用curl的方式执行(类似的工具还有wget,但是本文未尝试),不过缺点是curl不定在每个操作系统上都配备(Windows默认没有)

加上用户名和密码使用方式如下:

curl -X POST http://username:password@ci.jenkins.com/job/jobName/build

执行之后可以看到由具体用户start.
Started by user jiafu
[EnvInject] - Loading node environment variables.
Building remotely on TA-Win7-64-07 in workspace c:/autotest/workspace/jobName
Finished: SUCCESS
2.3  带用户名:代码方式

可参考:https://wiki.jenkins-ci.org/display/JENKINS/Authenticating+scripted+clients

 

远程执行还有很多其他特性,比如设置过多久之后的delay,带参数等等,本文不一一列举。

 

 

Translate: JBoss开发者框架:JBoss技术文档中心

 

最近,JBoss发布了JBoss开发者框架(JDF)的1.0版本,不同于软件版本使用名称和版本号,JSF其实是Jboss及JBoss AS所有相关技术的文档中心。此项举措使开发者使用不同技术时不用再四处查找文档(例如,之前Hibernate和Seam指南不存在一处)而只需关注一份文档。

JDF的重点是向开发者展示所有层面(例如:用户界面和持久化层)上的软件的使用。 当用户仅仅使用JBoss的某项技术(例如Hibernate)时。用户可以很容易找到它的相关文档(例如Hibernate指南)。但是很难直接从官方站点找到如何在开发运行程序时纵览全局的权威信息。

为此,JDF包含了以Maven项目形式呈现了50个快速入门,有趣的是大多“快速入门”都涵盖多个软件层次(使用了相应的JBoss技术)。这些可以作为开发更复杂项目的基础或指南。 一些“快速入门”如下:

“快速入门”清晰地划分成三类:初级、中级和高级。除了依赖Maven,还需要JBoss Developer Studio (或Eclipse插件JBoss Tools)。毫无疑问,部署是要依赖Jboss AS的。部分安装指导可参考RedHat/Jboss的PaaS OpenShift。目前所有“快速入门”源文件放在GitHub上。

快速入门给用户提供了一个很好的起点,但是它们都不是一个带有完整功能的应用程序。为此JDF提供了一个称为TickerMonster的项目及细节作为真实案例。它使用了最新Java EE6技术(用Jboss相关技术实现),包含的模块不局限于单一架构视角,使用了不同的技术,例如:

Jboss给企业应用开发推荐的平台是Java EE 6。所以JDF的一部分文档解释了SpringSeam和Java EE5用户的项目迁移路径Seam使用的路径很重要,因为现在已经不做基于它的新开发。目前,用户已被明确告知Seam3将废弃,必须将相关项目迁移到CDI/DeltaSpike上。同时JDF鼓励用户分享一些项目迁移的故事。

JDF最后一部分包含了一套Maven BOM文件(材料清单)用来定义基于JBoss AS的完整应用程序套件。Maven的BOM文件是一种特殊的POM文件,包含了所有的依赖,通过Maven2.0.9引入的“import” scope 应用在项目中。“JBoss stacks”分组下的BOM文件定义了你所选择技术实现(例如Errai/GWT 应用程序)的推荐项目结构的需要依赖。Jboss AS的BOM可以自由下载,但是Jboss EAP的BOM下载要先有一个Redhat帐号。 JDF现在放在GitHub上,虽然现在有了正式的发布路线图,但也接受外部贡献。交流支持可以通过两个讨论版及IRC聊天进行。

查看英文原文:JBoss Developer Framework: A Documentation Hub For JBoss Technologies

Translate: 语义变焦(Semantic Zoom)改善用户体验

 

语义变焦(Semantic Zoom)是Windows8上一个新的触摸优化功能,它用新的视角来呈现和导航大量数据内容,利用延时加载来控制数据的展示。因此,它可以作为大批量数据的容器,用来展示单一或大数据集。通过语义变焦,用户可以使用“放大”来关注单一记录,使用“缩小”用其他想要的视角来查看一组数据。从这个意义上,用户能够选择数据组或部分、“放大”然后自动导航到选中的记录。

实现ISemanticZoomInformation IZoomableView的接口才能使用语义变焦。截至本文写作之时,仅GridView和ListView两种视图实现。此外,这两种视图可以根据用户操作来互相切换。

微软开发者布道师Jerry Nixon指出:“语义变焦只是通过两种视角来展示数据,并没有改变数据范围”。用触摸式界面提供的捏放手势和鼠标滑轮结合Control键都可以执行语义变焦,作为可选的,也可用Ctrl+和Ctrl-两个组合键。

语义变焦不同于排列图像时为让图像局部放大而用鼠标滑轮做的缩放操作。另外一方面,它也不同于为放大特别位置(例如Bing地图)上某些内容用鼠标做的光学变焦。

Developer Express公司软件工程师Mehul Harry指出“语义变焦是很酷的功能, Windows 8平台一定会让我们兴奋不已”。

英文原文:http://www.infoq.com/news/2012/08/Semantic-Zoom