5.3.10.2. 从 GitHub 部署到 Heroku

这个向导是给使用 GitHub 开发 CUBA 项目的开发者作为参考。

Heroku 账号

首先,使用浏览器在 Heroku 创建一个账号,免费账号类型 hobby-dev 已经足够使用。然后登录账号,并且点击界面顶部的 New 按钮创建新项目。

选择一个唯一的名称(或者这个字段空着等着自动分配)并且选择一个服务器地址。然后 Heroku 会创建一个应用,比如 space-sheep-02453,这个就是 Heroku 应用程序名称。

第一次使用的时候,Heroku 会切换到 Deploy 标签页,选择使用 GitHub 部署方式。根据界面提示完成 GitHub 账号的授权。 点击 Search 按钮列出所有的 Git 仓库(repositories),连接需要使用的仓库。当 Heroku 应用程序连接到 GitHub 之后,就可以启用 Automatic Deploys - 自动部署。自动部署可以在每次触发 Git push 事件的时候实现自动重新部署 Heroku 应用。在这个向导里面,启用了此自动部署功能。

Heroku CLI

  • 安装 Heroku CLI

  • 在电脑的任何目录打开命令行窗口,并输入:

    1. heroku login
  • 按提示输入用户名密码。下面的步骤应该不需要再给这个项目输入用户名密码了。

PostgreSQL 数据库

  • 返回浏览器打开 Heroku dashboard

  • 切换到 Resources 标签页

  • 点击 Find more add-ons 按钮查找数据库插件

  • 找到 Heroku Postgres 区域然后点击。根据界面介绍选择 Login to install / Install Heroku Postgres

或者也可以通过 Heroku CLI 来安装 PostgreSQL:

  1. heroku addons:create heroku-postgresql:hobby-dev --app space-sheep-02453

这里的 space-sheep-02453 是 Heroku 应用的名称。

然后可以在 Resources 标签页看到新建的数据库。数据库已经连接 Heroku 应用程序。通过这个方式可以看到数据库的用户名密码:切换到 Heroku 数据库的 Datasource 界面,下翻到 Administration 区域然后点击 View credentials 按钮。

  1. Host compute.amazonaws.com
  2. Database zodt
  3. User artd
  4. Port 5432
  5. Password 367f
  6. URI postgres://artd:367f@compute.amazonaws.com:5432/zodt

项目部署设置

  • 切换到项目根目录 ($PROJECT_FOLDER)

  • 拷贝 modules/core/web/META-INF/context.xmlmodules/core/web/META-INF/heroku-context.xml

  • 修改 heroku-context.xml 文件将数据库连接信息更新进去(参考下面的例子):

    1. <Context>
    2. <Resource driverClassName="org.postgresql.Driver"
    3. maxIdle="2"
    4. maxTotal="20"
    5. maxWaitMillis="5000"
    6. name="jdbc/CubaDS"
    7. password="367f"
    8. type="javax.sql.DataSource"
    9. url="jdbc:postgresql://compute.amazonaws.com/zodt"
    10. username="artd"/>
    11. <Manager pathname=""/>
    12. </Context>

构建配置

将下面的 Gradle 任务添加到 $PROJECT_FOLDER/build.gradle

  1. task stage(dependsOn: ['setupTomcat', ':app-core:deploy', ':app-web:deploy']) {
  2. doLast {
  3. // replace context.xml with heroku-context.xml
  4. def src = new File('modules/core/web/META-INF/heroku-context.xml')
  5. def dst = new File('deploy/tomcat/webapps/app-core/META-INF/context.xml')
  6. dst.delete()
  7. dst << src.text
  8. // change port from 8080 to heroku $PORT
  9. def file = new File('deploy/tomcat/conf/server.xml')
  10. file.text = file.text.replace('8080', '${port.http}')
  11. // add local.app.properties for core application
  12. def coreConfDir = new File('deploy/tomcat/conf/app-core/')
  13. coreConfDir.mkdirs()
  14. def coreProperties = new File(coreConfDir, 'local.app.properties')
  15. coreProperties.text = ''' cuba.automaticDatabaseUpdate = true '''
  16. // rename deploy/tomcat/webapps/app to deploy/tomcat/webapps/ROOT
  17. def rootFolder = new File('deploy/tomcat/webapps/ROOT')
  18. if (rootFolder.exists()) {
  19. rootFolder.deleteDir()
  20. }
  21. def webAppDir = new File('deploy/tomcat/webapps/app')
  22. webAppDir.renameTo( new File(rootFolder.path) )
  23. // add local.app.properties for web application
  24. def webConfDir = new File('deploy/tomcat/conf/ROOT/')
  25. webConfDir.mkdirs()
  26. def webProperties = new File(webConfDir, 'local.app.properties')
  27. webProperties.text = ''' cuba.webContextName = / '''
  28. }
  29. }

Procfile

在 Heroku 启动应用的命令是通过一个特殊文件 Procfile 来传递的。在 $PROJECT_FOLDER 创建 Procfile 文件,使用以下内容:

  1. web: cd ./deploy/tomcat/bin && export 'JAVA_OPTS=-Dport.http=$PORT' && ./catalina.sh run

此处提供了 Tomcat 在启动 Catalina 脚本时需要的 JAVA_OPTS 环境变量值。

Premium 插件

如果项目使用了 CUBA Premium 插件,需要为 Heroku 应用程序设置额外的变量。

  • 打开 Heroku dashboard。

  • 切换到 Settings 标签页。

  • 展开 Config Variables 区域,点击 Reveal Config Vars 按钮。

  • 添加新 Config Vars,使用授权码的前后两部分(短横分隔)分别作为 用户名密码

  1. CUBA_PREMIUIM_USER | username
  2. CUBA_PREMIUM_PASSWORD | password

Gradle wrapper

项目需要使用 Gradle wrapper。可以通过 CUBA Studio 来添加:Build > Create or update Gradle wrapper

  • $PROJECT_FOLDER 创建 system.properties 文件,使用如下内容(示例是假设本地安装的 JDK 是 1.8.0_121 版本):

    1. java.runtime.version=1.8.0_121
  • 检查确保这些文件不在 .gitignore 里:Procfilesystem.propertiesgradlewgradlew.batgradle

  • 将这些文件添加到仓库并且提交

  1. git add gradlew gradlew.bat gradle/* system.properties Procfile
  2. git commit -am "Added Gradle wrapper and Procfile"

应用程序部署

一旦提交并且推送了所有的改动到 GitHub,Heroku 会自动开始重新部署应用。

  1. git push

构建的过程可以通过 Heroku dashboard 的 Activity 标签页看到,点击 View build log 监控构建日志。

构建过程完成后,可以通过浏览器访问类似 https://space-sheep-02453.herokuapp.com 这样的 URL 来访问服务。可以通过 Heroku dashboard 的 Open app 按钮打开应用。

日志监控

需要跟踪查看应用系统的日志,可以使用以下命令:

  1. heroku logs --tail --app space-sheep-02453

Tomcat 日志也可以通过应用系统的 Menu > Administration > Server Log 查看。