<pre name="code" class="plain">今天尝试使用jenkins来实现rails程序的自动化部署。
项目代码使用git@osc托管
利用git@osc提供的push hook功能去触发远程构建
一、安装jenkins
1.先保证有Java1.5以上
2. jenkins官网下载最新的war包。在官网也可以找到直接安装的方法。个人觉得使用war更简单。
有tomcat,jboss等容器,把war放进去就可以了。没有的话可以使用jenkins自带的jetty。
3.执行下面的命令可以让jenkins在后台运行 (注意结尾有一个&符合)
nohup java -jar jenkins.war --httpPort=7000 &
二、进去jenkins的管理页面
新建一个多配置项目
勾选触发远程构建,即访问提供的URL即可触发构建
http://xxxx:xxx/job/test/build?token=xxx
这个是能触发远程构建最简配置方式。
选择execute shell 。这里需要提前写好自动部署的脚本
#!/usr/bin/env bash
git pull
rake assets:precompile
ps -ef|grep rails|grep -v grep|grep -v sh|grep 3030|awk '{print $2}'|xargs kill -9
rails s -p 3030 -e production -d
设置hook
这里有两个坑!
第一 git@osc hook用的是post方式提交,不能去触发到jenkins的远程构建,需要通过第三方通过get方式去触发
eg:
<pre name="code" class="ruby"> #测试环境的自动化部署
#get xx/autodeploy
def autodeploy
hook = Oj.load(params["hook"])
if hook["password"] == 'bigbang_server'
Rails.logger.info "[autodeploy] 测试环境自动化部署启动 #{hook["push_data"]["user_name"]}"
redirect_to "http://xxxxx:7000/job/test/build?token=xxxx"
else
render nothing: true and return
end
end
第二、jenkins在执行shell之后会自动kill子进程,会导致重启好的rails服务器被kill。这里jenkins做的安全性的一个保证。
解决方法之一
通过修改BUILDID让jenkins不能杀死创建的子进程。但是这样做的话开发者就做好构建失败的异常处理
OLD_BUILD_ID=$BUILD_ID
echo $OLD_BUILD_ID
BUILD_ID=dontKillMe
#执行脚本
./autodeploy.sh
BUILD_ID=$OLD_BUILD_ID
echo $BUILD_ID
这样触发逻辑就变成了 代码push -> git@osc的push hook -> 重定向到jenkins的远程构建触发器->触发构建