注:感谢我的同事新宇想出的这个点子,没有他的这个点子,也就没有这篇文章。

引子

在开发过程中,你有没有碰到这样的场景:
“功能完成,该提交代码了。”
“Hold on,得先跑下local build。”,你的pair叫起来了。
“啊,是啊”,你恍然大悟。敲下bundle exec rake dev
“local build一般至少得运行十分钟吧, 抽空看看邮件吧”。
5分钟过去了,你回过神来,看看测试跑得怎么样了。
啊,测试在第二分钟时就悄无声息地废了。白白浪费了3分钟时间。。。。
“要是测试在废掉的时候能够提醒一下我就好了。”你心想。

做为一名自诩动手能力很强的程序员,有什么理由不自己试一试呢?

要达到上述目标,我们需要解决以下几个问题:

  1. 如何判断local build是否成功?
  2. 如何播放声音提示?

我们首先来看第一个问题,bundle exec rake dev实际上是在执行一个shell命令,如何判断一个shell命令是否执行成功, google之,得知可以通过退出状态码(Exit Code)进行判断,非零退出状态码表示shell脚本执行失败。于是我们创建一个脚本run_test.sh,脚本内容如下:

	#!/bin/bash -e
	bundle exec rake dev
	if [ $? == 0 ]; then
		#TODO 播放成功声音
	else
		#TODO 播放失败声音
	fi

接下来我们来看第二个问题,Mac OSX自带了一个命令行工具say,可以把单词转换为语音输出,例如执行say "Hello World",你就会听到Mac 说话了。 于是,我们的脚本就变成了:

	#!/bin/bash -e
	bundle exec rake dev
	if [ $? == 0 ]; then
		say "Good, build passed"
	else
		say "Boom, build failed"
	fi

俩问题都解决了,该伸个懒腰休息休息了吧。“Hold on”, 你的pair又说话了,“难道这么好用的功能,你只想用它来执行local build吗?能否让所有的rake task失败都有声音提示呢?” 。真是个难缠的pair。

不管怎样,第三个问题来了,如何使run_test.sh变得更加通用? 把要被执行的命令做为参数传给这段脚本,然后在脚本中执行,恩,是个不错的选择。于是脚本变成如下的样子:

	#!/bin/bash -e
	$@
	if [ $? == 0 ]; then
		say "Good, build passed"
	else
		say "Boom, build failed"
	fi

执行sh ./run_test.sh bundle exec rake dev,当bundle exec rake dev执行成功时,你就可以听到悦耳的声音提示了。

还能再改进吗?每次都要敲这么长的命令,好烦啊。加个alias吧,编辑/.rvmrc,加入如下alias:

	alias be="sh ./script/run_test.sh bundle exec"

下次只要执行be rake dev,你就可以可以放心地看邮件了,等着听声音提示吧。

后记

mac也提供了另外一个命令行工具afplay,可以用来播放音频文件,我们选用了卡巴斯基那个惨绝人寰的杀猪声做为build失败提示音,够惊悚吧。下面是我的项目中这个脚本的最终版本。

	#!/bin/bash -e
	$@
	if [ $? == 0 ]; then
	  afplay fixture/success.wav
	else
	  afplay fixture/fail.wav
	fi

想说的话

上面的故事是从今天我和同事pair的场景里抽象提炼出来的,从提出点子到最后实现也就用来个把小时,代码量很小,难度也不大,然而带给每个team member的好处却是显而易见的。让平日里的工作变得有趣的正是这些点子,以及实现它的过程,更大的乐趣是把它分享给更多的人。我们已经分享了,你呢?

AI Assistants Do Not Make Good Code

AI Assistants Do Not Make Good CodeIntroductionAI-powered coding assistants churn out code fast, but speed isn’t everything. They lack st...… Continue reading

using pyinvoke for task automation

Published on November 25, 2024

Implementing CorrelationID In Kafka Stream

Published on October 20, 2024