Capistrano/Jenkins在Java Web构建部署中的实践盛大在线 - 唐力群
调查
软件构建Construction
软件构建远不是编译版本控制集成测试变更控制单元测试环境配置代码静态分析打包部署代码覆盖率检查编译
今天我们关注软件构建的最后一个环节版本控制集成测试变更控制单元测试环境配置代码静态分析部署打包代码覆盖率检查编译
选择合适的构建工具组快速、敏捷全生命周期自动化,尽可能少的人工干预支持集群环境开源产品优先
Capistrano & Jenkins
关于部署Web应用程序
谁亲自玩过这个游戏?
发布三宝
Geek
崇尚一件事情有多种方式但总希望找到最快的捷径
生活看上去很简单
但你要面对不同的人
而且是一群人
一百遍啊一百遍
当然,你是一个聪明的程序员
程序员的解决方法shell script + sftp + expectrsync + sshant
问题重复,事必亲为,冗余工作多不够灵活不易管理动态增长的集群别人看不懂!
天才程序员的解决之道Jamis Buck
Capistrano
安装Capistranosudoapt-get install rubysudogem install capistrano
限制只能用于类Unix系统SSHRuby
为什么是Ruby
简单如果只是使用,你不需要去完整的学习ruby,就可以修改capistrano配置文件易于扩展不只是继承,可以动态扩展所有对象可以重用已有的策略For rails -> for java application -> for all product
Hello, world!#!/usr/bin/rubyload'deploy'role:app,"10.241.12.44","10.241.12.45","10.241.12.46"set:user,"tangliqun"namespace:hellodotask:worlddorun"echo Hello, world!"run"cat /etc/passwd"endend执行:cap hello:world
现实例子#!/usr/bin/rubyload'deploy'require'cap_recipes/tasks/tomcat'set :application, "message-admin"set :war, File.dirname(__FILE__)+"/message/target/message-admin.war"role :webserver, "10.241.12.44","10.241.12.45","10.241.12.46"set :user, "tomcat6"set :tomcat_home, "/usr/local/apache-tomcat-6.0.29"set :tomcat_ctrl, "/etc/init.d/tomcat"set :deploy_dir, "/srv/applications"
用法
配置文件运行cap,将查找当前目录的Capfile,并加载它
或者通过cap –f 参数指定配置文件默认发布过程之三部曲cap deploy:setupcap deploycap deploy:rollback
翻墙进院set :gateway, “root@202.96.xx.xx”
还可以做什么?
扩展Plugin可以扩展capistrano的功能https://github.com/crazycode/cap-recipes
安装服务器环境通过capistrano recipes扩展,可以在一群服务器上重复进行类型的操作Mysql
MongoDB
 Tomcat
 Apache2/Nginx安装tomcatCapistrano::Configuration.instance(true).loaddo  _cset :tomcat_home, "/usr/local/apache-tomcat-6.0.29"  _cset :tomcat_ctrl, "/etc/init.d/tomcat"  namespace :tomcat do    desc "install tomcat"    task :install dodir = File.dirname(tomcat_home)      basename = File.basename(tomcat_file)      basectl = File.basename(tomcat_ctrl)      utilities.sudo_upload"#{tomcat_file}", "#{dir}/#{basename}"      sudo "tar -zvxf #{dir}/#{basename} -C #{dir} && chown #{user}:root #{tomcat_home} -R"      put utilities.render("tomcat", binding), "tomcat.tmp"      sudo "cp tomcat.tmp #{tomcat_ctrl} "      sudo "chmod a+x #{tomcat_ctrl}"      sudo "/sbin/chkconfig --add #{basectl}"      run "rm tomcat.tmp"      sudo "rm #{dir}/#{basename}"endendend
监视多个服务器上的文件stream模式,合并多台机器上的tail -fdesc"tail :tomcat_home/logs/catalina.out"task :tail dostream "tail -f #{tomcat_home}/logs/catalina.out"end
管理集群服务器上的服务desc "start tomcat"task :start dosudo "#{tomcat_ctrl} start"enddesc "stop tomcat"task :stop dosudo "#{tomcat_ctrl} stop"enddesc "stop and start tomcat"task :restart dotomcat.stoptomcat.startend
发布文件包问题Java Web应用程序动则几十M,多模块时可能到几百M,如何快速部署到集群?如何应对系统扩容?
通过FTP/SFTP上传?
Twitter的解决方法用BT,BitTorrentTwitter将之开源,即Murder:http://github.com/lg/murder
换个思路:只传输变更部分
把war/ear解开,只传递更新的部分rsync?Subversion?
Git  !!!
git-deployhttps://github.com/smtlaissezfaire/fast_git_deploy  https://github.com/apinstein/git-deploymenthttps://github.com/crazycode/cap-recipes
配置todo
发布过程cap deploy -s tag=staging-YYYY-MM-DD.X
自动化 Automation
如何把构建过程自动串联起来?
另一类人
喜欢简单、有趣的事物
Jenkins (Hudson)简单、友好的持续集成工具
Jenkins吸收了很多持续集成服务的优点容易安装,容易配置Svn等多种SCM集成,构建后打tag丰富的测试报告分布式构建上百个插件支持
我们用Jenkins做什么?持续自动化测试跟踪工程健康状况强制性单元测试,验收测试用例等静态代码检测,生成测试报告
Jenkins – Jobs & Task
Jenkins
SCM集成
与Maven紧密集成
依赖关系不同构件之间存在依赖关系,即一个组件的更改,可能影响另一个组件Jenkins可以在设置使某个job构建成功时,触发另一个构建也可以在Maven Repository Snapshot更新时触发构建
基于依赖进行不同环境构建测试环境构建JobIf build success开发环境构建JobSubversion revision生产环境构建Job
通过邮箱或gtalk反馈状态
与常见的应用服务器集成部署至Tomcat/Weblogic等应用服务器重新启动服务但相对简单,对集群支持不好,不适合于生产环境
当他们相遇时
目标构建过程自动化可回溯快速发布支持大批量的服务器
不同环境不同处理持续集成/开发环境持续向涉众展示可用的产品测试环境相对稳定生产环境集群、大量的机器版本稳定
持续集成环境基于scm变更触发构建构建成功后,通过Jenkins发布
SubversionGit Repositorygit pushJenkinsgit pullcap git:updatecap tomcat:restartServer1Server2Server3
版本化
copy_to_dir $BUILD_DIR/message-web/target/message-web.war applications/message-webcopy_to_dir $BUILD_DIR/message-admin/target/message-admin.war applications/message-admincd$GIT_DIRgit add .git commit -m"Build $VERSION"git tag "$VERSION"git push --tags origin $GIT_BRANCHcd$CUR_DIRcap -f$CUR_DIR/cap/capgit git:updatecap -f$CUR_DIR/cap/captomcat1 tomcat:restartsleep15cap -f$CUR_DIR/cap/captomcat2 tomcat:restart
SubversionGit Repositorygit pushJenkinsgit pullcap git:updatecap tomcat:restartServer1Server2Server3
测试环境基于tag过程触发http://fluri.computerscience.ch/2009/09/let-subversion-trigger-your-Jenkins-build-job/通过svn post-commit触发构建成功后发布到git,通过capistrano执行git deploy
正式环境类似测试环境,但是不同的tag只需要告知配置管理人员tag,即可在目标服务器上使用git切换到新版本通过capistrano执行:  cap deploy –s tag=xx.xx.xxRollback  cap rollback –s tag=xx.xx.xx
We did it!不只适于Java平台其它环境也可以实现这一策略

Capistrano与jenkins(hudson)在java web项目中的实践