loveky的流水账

Travis是一个众所周知的持续集成服务提供商,免费为开源项目提供持续集成服务。但是对于闭源项目/private repo需要购买travis pro服务才能使用。对于小团队,每月129刀的最低消费实在是一笔不小的开支,因此便有了本文。 为什么要做这件事? 首先,我们是一群有情(jie)节(cao)的程序猿。我们要对自己的代码负责,保证所有上线的代码都是经过测试的。所有Pull Request的code要经过team member的revew并跑通测试。 其次,我们是一群节(diao)俭(si)的程序猿。Travis Pro每个月129刀的最低消费让我们望(xia)而(niao)却(le)步(!)。 要搭建这样一台持续集成服务器,需要哪些东西? 一台linux主机 (本文中使用的是linode上的Ubuntu 12.04) 一个GitHub账号 (加为你repo的collaborator或是team的member) 如何配置? Step1 安装Jenkins,非Ubuntu系统安装Jenkins请参考Jenkins官方文档 wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add - sudo echo 'deb http://pkg.jenkins-ci.org/debian binary/' >> /etc/apt/sources.list sudo apt-get update sudo apt-get install jenkins Setp2 为jenkins用户安装rvm sudo su - jenkins curl -L https://get.rvm.io | bash -s stable --ruby=1.9.3 Setp3 安装Xvfb。(如果你的测试不需要用模拟的DISPLAY,那你可以忽略此步骤) 我们测试Rails时需要用capybar跑feature spec。有js相关的测试需要启动一个浏览器来执行测试代码,但是linode上的Ubuntu都是没有display的,因此跑feature spec的时候会遇到无法启动浏览器而报错的情况。Xvfb就是用来创建一个虚拟的Display供启动浏览器用的。 sudo apt-get install xvfb Xvfb :99 -screen 0 1024x768x16 >> /tmp/Xvfb. ... Read More
rerere 是啥的缩写? rerere = reuse recorded resolution rerere是干啥用的? 它会让Git记住你是如何解决某个文件的两个版本之间的conflict,这样在下次Git遇到同样的文件在相同的两个版本间发生冲突时,可以自动帮你使用相同的方法解决冲突。 如何启用rerere? git config --global rerere.enabled true 或是 在repo目录里mkdir .git/rr-cache 不过推荐前者。 能举例说明吗? 参考inline的注释。 $ git init git-rerere-test Initialized empty Git repository in /cygdrive/e/test/git-rerere-test/.git/ $ cd git-rerere-test $ git config rerere.enabled true # 开启rerere功能 $ echo "What fruit do you like?" >> question $ git add . && git commit -m "initial drop" [master (root-commit) af9fdf9] initial drop 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 question $ git branch test # 创建test分支 $ echo "I like orange" >> question $ git add . ... Read More

sidekiq初体验
15 June 2013

今天Kevin讲了background job,提到了Resque和Sidekiq,并推荐我们使用Sidekiq。于是初步体验了一下。 Sidekiq在其项目主页上写到: What if 1 Sidekiq process could do the work of 20 Resque or DelayedJob processes? 口气不小啊…⊙﹏⊙b 安装 只需在Gemfile里添加 gem 'sidekiq' 然后执行bundle install即可。 使用 这里拿课程中的一段真实code举例说明。在该项目中有一个UserController在新用户注册时会发送欢迎邮件,但是此处发送邮件是一个同步的操作,如果你的网络不稳定则用户在点击注册后可能会等很长时间才能看到注册成功的页面,我们要把发送欢迎邮件的操作转换成一个异步的后台任务。使用Sidekiq前的code如下: if @user.save AppMailer.send_welcome_email(@user.id).deliver 要把它转为后台任务,只需改为: if @user.save AppMailer.delay.send_welcome_email(@user.id) 测试 改完之后在开发环境中测试正常,接着跑rspec发现有3个spec失败,这三个spec内容如下: it "sends out email" do expect { post :create, user: Fabricate.attributes_for(:user) }.to change{ ActionMailer::Base.deliveries.size }.by(1) end it "sends to the right recipient" do post :create, user: Fabricate.attributes_for(:user) email = ActionMailer::Base. ... Read More