Bear是一个轻量级的远程自动化工具,专为Groovy/Java/JVM设计。它与其他自动化工具不同,因为它采用了程序化的方法。在Bear中,部署是一个常规的Java类,可以包含一个main()方法。Bear偏爱静态类型安全、链式方法调用、函数式编程和流畅的编程技术。
Bear需要以下条件:
在Windows上安装Maven:
sh $ mvn com.chaschev:installation-maven-plugin:1.4:install -Dartifact=com.chaschev:bear
要在现有项目中或空文件夹中创建一个新的Bear项目,请执行以下操作:
sh $ cd pet-clinic
sh $ bear --create pet-clinic --user my-actual-ssh-user --password my-actual-password --host my-remote-host
这将创建一个包含自动生成项目文件的.bear文件夹。
注意:当前版本中密码存储不安全。如果想在本地文件中存储密码,可能需要编辑.bear/petclinic.properties文件。
接下来,如果有多个主机,请编辑创建的项目中的hosts和stages,在文件.bear/PetClinicProject.groovy中。要快速检查设置,请运行:
sh $ bear pet-clinic.ls
这将启动一个预定义的ls作业,这是一个用@Method注解标记的Java类中的常规方法。这应该会显示UI:
接下来,可以运行冒烟测试以确保一切正常。
可以在喜欢的JavaIDE或文本编辑器中编辑Bear项目。有关如何使用Intellij Idea进行操作的说明。如果想在Eclipse或Netbeans中编辑Bear项目,并且在编辑Groovy类时遇到麻烦,可以将其转换为Java并作为Java类进行编辑。
通过在Bear项目中声明插件类型的字段来添加插件。插件实例将在项目初始化期间注入:
JavaPlugin java
MavenPlugin maven
//可选,将安装Maven
GitCLIPlugin git
MySqlPlugin mysqlPlugin
DeploymentPlugin deployment
//部署构建器,一个Builder类,用于将插件粘合在一起
DumpManagerPlugin dumpManager
//可选,可用于定义DbDump作业TomcatPlugin tomcatGrailsPlugin2 grails
现在让看看如何设置工具版本和变量链接:
Java@Override
protected GlobalContext configureMe(GlobalContextFactory factory) throws Exception {
maven.version.set("3.1.1");
java.versionName.set("jdk-7u51-linux-x64");
java.version.set("1.7.0_51");
grails.version.set("2.1.1")
tomcat.instancePorts.set("8080, 8081")
//这将在每个主机上创建2个Tomcat实例
tomcat.warName.setEqualTo(grails.warName);
//将Tomcat war名称链接到部署到grails war名称
dumpManager.dbType.set(mongo.name());
//dump manager的DB类型:mysql或mongodb
bear.appStartTimeoutSec.set(600)
//覆盖Tomcat的启动超时
}
要远程安装JDK,需要手动下载Oracle JDK发行版(对于Node.js项目不需要),并将其放到以下位置。在这个例子中,使用的是JDK 7u51:
(Windows) c:\bear\shared\tools\jdk\jdk-7u51-linux-x64.gz
(Unix) /var/lib/bear/shared/tools/jdk/jdk-7u51-linux-x64.gz
这将在将来被脚本化,目前下载是手动的。然后在控制台中:
sh $ bear pet-clinic.setup --ui
或者在main()中:
Java new PetClinicProject().setup()
这将安装并验证软件,还将使可执行文件从命令行可用。
GitHub项目地址在注释中设置:
Java
@Configuration(
...
vcs =
"https://github.com/grails-samples/grails-petclinic.git",
branch =
"master"...
)
使用DeploymentPlugin构建部署。下面是任务的描述。每个任务都是一个函数,它将在每个主机上运行。
global.tasks.vcsUpdate
- 从GitHub检出或更新项目
grails.build
- 使用Grails构建WAR
tomcat.stop, tomcat.start
- 启动/停止Tomcat实例
tomcat.deployWar
- 将WAR解压缩到Tomcat
tomcat.watchStart
- 通过监视日志等待应用程序启动
_
- 一个通用对象,类似于jQuery中的$
Java
defaultDeployment = deployment.newBuilder()
.CheckoutFiles_2({_, task -> _.run(global.tasks.vcsUpdate); } as TaskCallable)
.BuildAndCopy_3({_, task -> _.run(grails.build); } as TaskCallable)
.StopService_4({_, task -> _.run(tomcat.stop); OK; } as TaskCallable)
.StartService_6({_, task -> _.run(tomcat.deployWar, tomcat.start, tomcat.watchStart); } as TaskCallable)
.endDeploy()
.ifRollback()
//当出现错误时采取的操作
.beforeLinkSwitch({_, task -> _.run(tomcat.stop); } as TaskCallable)
.afterLinkSwitch({_, task -> _.run(tomcat.start, tomcat.watchStart); } as TaskCallable)
.endRollback()
整个过程可能看起来繁琐,但实际上只需要复制并修改原始项目。相信这比手动配置多实例Tomcat集群要少一些烦恼,而且还有其他一些好处。
如果在某个时候对遵循指令感到厌烦,尝试探索命令API(见Wiki),编写自己的部署或研究源代码(嗯...好吧,那里的一些事情仍在进行中;-))。Bear的编写是本着保持简单的想法。如果只需要构建并将WAR复制到几个主机,那么就这样去做吧!