Grails应用部署自动化实践

作为一名Grails开发者,一直在为几个Grails应用编写代码,其中一个是为孟菲斯Java用户组(Memphis JUG)的网站,另一个是妻子即将推出的设计师文具电子商务网站。像大多数Grails开发者一样,一直在使用本地的Jetty+MySQL开发环境进行编码。然而,在过去的一周左右,是时候将这两个应用部署到生产环境中了。

上周末,首先开始部署孟菲斯JUG的网站。第一个方法是在本地构建WAR文件,然后使用"scp"将其上传到服务器。但是,由于DSL连接上传速度非常慢,每次上传WAR文件(Grails WAR文件携带所有依赖时相当庞大)都需要等待15-20分钟,决定寻找一种更好的方法。

一周后,坐在电脑前,开始处理妻子商店网站的第一次"预生产"版本。在这些"黑暗而早期"的小时里,决定进行一次实验。每个项目都托管在GitHub上,所以在脑海中勾勒出的流程如下:

  • 从GitHub检出最新代码
  • 运行"grails war"生成WAR文件
  • 停止Tomcat服务(托管服务提供商将Tomcat设置为服务运行)
  • 从Tomcat的部署目录中删除之前的部署残留
  • 将新的WAR文件复制到Tomcat的部署目录
  • 启动Tomcat服务

顺便说一句,在执行所有这些操作之前,将生产数据源定义从本地定义移动到了Tomcat中的JNDI查找。这带来了自己的挑战,将在稍后的博客中讨论。

无论如何,回到部署。认为这是一个很好的机会来尝试Groovy的AntBuilder。以下是组合的一个示例:

Java #!/usr/bin/env groovy def ant = new AntBuilder() // 从GitHub更新代码库 ant.exec(executable: 'git', dir: "${PROJECT_DIR}") { arg(value: 'pull') } // 使用Ant生成WAR文件 ant.ant(dir: "${PROJECT_DIR}", target: 'war') // 停止Tomcat ant.exec(executable: 'service') { arg(line: 'tomcat6 stop') } // 从Tomcat的部署目录中删除旧的webapp内容 ant.delete(includeemptydirs: 'true', verbose: 'true') { fileset(dir: "${CONTEXT_ROOT_DIR}", includes: '**/*') } // 将新的WAR文件复制到Tomcat的部署目录 ant.copy(file: "${WAR_FILE}", tofile: "${CONTEXT_ROOT_DIR}/ROOT.war") // 启动Tomcat ant.exec(executable: 'service') { arg(line: 'tomcat6 start') }

正如看到的,脚本中有未定义的Groovy常量。不想暴露服务器的所有细节。无论如何,这很简单。一个警告 - 如果使用Ehcache,请确保将其添加到ivy.xml依赖中,否则Ant构建不会像运行"grails war"那样将其引入。希望有人发现这个简单的脚本有用。享受!

通过这个自动化脚本,可以大大减少部署过程中的重复劳动,提高部署效率。同时,这也有助于减少人为错误,确保部署的一致性和可靠性。

自动化部署的过程中,需要注意以下几点:

  • 确保代码库的最新性:在部署之前,需要从代码库中获取最新的代码,以确保部署的是最新版本的应用。
  • 生成WAR文件:使用Grails的"grails war"命令生成WAR文件,这是Grails应用部署的标准格式。
  • 管理Tomcat服务:在部署过程中,需要停止和启动Tomcat服务,以确保新的WAR文件能够被正确部署。
  • 清理旧的部署:在部署新的WAR文件之前,需要清理Tomcat部署目录中的旧应用文件,以避免潜在的冲突。
  • 配置生产环境:在生产环境中,需要将数据源配置为JNDI查找,以实现数据源的集中管理和配置。

通过这个自动化部署脚本,可以轻松地将Grails应用部署到生产环境,大大提高了部署的效率和可靠性。同时,这也为提供了一个良好的实践案例,展示了如何使用Groovy的AntBuilder来实现自动化部署。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485