3.5. 使用 Ruby on Rails 创建应用程序
Ruby on Rails 是采用 Ruby 编写的 web 框架。本指南介绍在 OpenShift Container Platform 上使用 Rails 4。
浏览整个教程,了解在 OpenShift Container Platform 上运行应用程序的所有步骤。如果遇到问题,请尝试通读整个教程,然后再回看问题。该教程还可用于审查您之前的步骤,以确保正确运行所有步骤。
3.5.1. 先决条件
- 具备 Ruby 和 Rails 基础知识。
- 本地已安装 Ruby 2.0.0+ 版、RubyGems、Bundler。
- 具备 Git 基础知识。
- OpenShift Container Platform 4 的运行实例。
- 
							确保 OpenShift Container Platform 实例正在运行且可用。另外还需确保已安装 ocCLI 客户端,且可从命令 shell 访问命令,以便您可以使用您的电子邮件地址和密码通过客户端登录。
3.5.2. 设置数据库
Rails 应用程序几乎总是与数据库一同使用。对于本地开发,请使用 PostgreSQL 数据库。
流程
- 安装数据库: - sudo yum install -y postgresql postgresql-server postgresql-devel - $ sudo yum install -y postgresql postgresql-server postgresql-devel- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 初始化数据库: - sudo postgresql-setup initdb - $ sudo postgresql-setup initdb- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 这个命令会创建 - /var/lib/pgsql/data目录,数据存储在其中。
- 启动数据库: - sudo systemctl start postgresql.service - $ sudo systemctl start postgresql.service- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 数据库运行时,创建 - rails用户:- sudo -u postgres createuser -s rails - $ sudo -u postgres createuser -s rails- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 注意,所创建的用户无密码。 
3.5.3. 编写应用程序
如果要从头开始启动 Rails 应用程序,必须先安装 Rails gem,然后才可编写应用程序。
流程
- 安装 Rails gem: - gem install rails - $ gem install rails- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 输出示例 - Successfully installed rails-4.3.0 1 gem installed - Successfully installed rails-4.3.0 1 gem installed- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 安装完 Rails gem 后,使用 PostgreSQL 创建一个新应用程序,作为数据库: - rails new rails-app --database=postgresql - $ rails new rails-app --database=postgresql- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 更改至新应用程序目录: - cd rails-app - $ cd rails-app- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 如果您已有应用程序,请确保 - Gemfile中存在- pg(postgresql) gem。如果尚无应用程序,则通过添加 gem 来编辑- Gemfile:- gem 'pg' - gem 'pg'- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 使用所有依赖项生成新的 - Gemfile.lock:- bundle install - $ bundle install- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 除了将 - postgresql数据库与- pggem 结合使用外,您还必须确保- config/database.yml正在使用- postgresql适配器。- 请确保更新了 - config/database.yml文件中的- default部分,如下所示:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 创建应用程序的开发和测试数据库: - rake db:create - $ rake db:create- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 这会在您的 PostgreSQL 服务器中创建 - development和- test数据库。
3.5.3.1. 创建欢迎页面
						由于 Rails 4 在生产中不再提供静态 public/index.html 页面,您必须创建一个新的 root 页面。
					
要想具有自定义欢迎页面,必须执行以下步骤:
- 使用 index 操作创建控制器。
- 为 welcome 控制器 index 操作创建 view 页面。
- 使用所创建的 controller 和 view 创建一个提供应用程序 root 页面的路由。
Rails 提供了一个生成器,用于完成您所有必要的步骤。
流程
- 运行 Rails 生成器: - rails generate controller welcome index - $ rails generate controller welcome index- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 已创建所有必要文件。 
- 按如下方式编辑 - config/routes.rb文件中第 2 行:- root 'welcome#index' - root 'welcome#index'- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 运行 rails 服务器以验证页面是否可用: - rails server - $ rails server- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 在浏览器中访问 http://localhost:3000 即可查看您的页面。如果没有看到该页面,请检查输出至服务器的日志进行调试。 
3.5.3.2. 为 OpenShift Container Platform 配置应用程序
						要让您的应用程序与 OpenShift Container Platform 中运行的 PostgreSQL 数据库服务通信,必须编辑 config/database.yml 中的 default 部分,以便在创建数据库服务时使用环境变量,稍后会对这些变量进行定义。
					
流程
- 使用预定义的变量按照以下方式编辑 - config/database.yml中的- default部分:- config/databaseYAML 文件示例- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
3.5.3.3. 将应用程序存储在 Git 中
						在 OpenShift Container Platform 中构建应用程序通常需要将源代码存储在 git 存储库中,因此如果还没有 git,必须要安装。
					
先决条件
- 安装 git。
流程
- 运行 - ls -1命令,确保已在 Rails 应用程序目录中。命令输出应类似于:- ls -1 - $ ls -1- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 输出示例 - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 在 Rails 应用程序目录中运行以下命令,以便初始化代码并将其提交给 git: - git init - $ git init- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - git add . - $ git add .- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - git commit -m "initial commit" - $ git commit -m "initial commit"- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 提交应用程序后,必须将其推送(push)到远程存储库。Github 帐户,您可使用它创建新的存储库。 
- 设置指向 - git存储库的远程存储库:- git remote add origin git@github.com:<namespace/repository-name>.git - $ git remote add origin git@github.com:<namespace/repository-name>.git- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 将应用程序推送(push)到远程 git 存储库。 - git push - $ git push- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
3.5.4. 将应用程序部署至 OpenShift Container Platform
您可将您的应用程序部署至 OpenShift Container Platform。
					创建 rails-app 项目后,您将自动切换到新的项目命名空间。
				
在 OpenShift Container Platform 中部署应用程序涉及三个步骤:
- 从 OpenShift Container Platform 的 PostgreSQL 镜像创建数据库服务。
- 从 OpenShift Container Platform 的 Ruby 2.0 构建程序镜像和 Ruby on Rails 源代码创建前端服务,这些服务将与数据库服务相连接。
- 为应用程序创建路由。
流程
- 要部署 Ruby on Rails 应用程序,请为应用程序创建一个新项目: - oc new-project rails-app --description="My Rails application" --display-name="Rails Application" - $ oc new-project rails-app --description="My Rails application" --display-name="Rails Application"- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
3.5.4.1. 创建数据库服务
您的 Rails 应用程序需要一个正在运行的数据库服务。对于此服务,请使用 PostgreSQL 数据库镜像。
						要创建数据库服务,使用 oc new-app 命令。您必须将一些在数据库容器中使用的必要环境变量传递给此命令。设置用户名、密码和数据库名称需要这些环境变量。您可随意更改这些环境变量的值。变量如下:
					
- POSTGRESQL_DATABASE
- POSTGRESQL_USER
- POSTGRESQL_PASSWORD
设置这些变量可确保:
- 存在具有指定名称的数据库。
- 存在具有指定名称的用户。
- 用户可使用指定密码访问指定数据库。
流程
- 创建数据库服务: - oc new-app postgresql -e POSTGRESQL_DATABASE=db_name -e POSTGRESQL_USER=username -e POSTGRESQL_PASSWORD=password - $ oc new-app postgresql -e POSTGRESQL_DATABASE=db_name -e POSTGRESQL_USER=username -e POSTGRESQL_PASSWORD=password- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 若也要为数据库管理员设置密码,请将以下内容附加至上一命令中: - -e POSTGRESQL_ADMIN_PASSWORD=admin_pw - -e POSTGRESQL_ADMIN_PASSWORD=admin_pw- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 监控进度: - oc get pods --watch - $ oc get pods --watch- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
3.5.4.2. 创建前端服务
要将应用程序添加到 OpenShift Container Platform 中,您必须指定应用程序所在存储库。
流程
- 创建前端服务,并指定创建数据库服务时设置的数据库相关环境变量: - oc new-app path/to/source/code --name=rails-app -e POSTGRESQL_USER=username -e POSTGRESQL_PASSWORD=password -e POSTGRESQL_DATABASE=db_name -e DATABASE_SERVICE_NAME=postgresql - $ oc new-app path/to/source/code --name=rails-app -e POSTGRESQL_USER=username -e POSTGRESQL_PASSWORD=password -e POSTGRESQL_DATABASE=db_name -e DATABASE_SERVICE_NAME=postgresql- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 通过此命令,OpenShift Container Platform 可获取源代码,设置构建程序来构建应用程序镜像,并与指定的环境变量一同来部署新创建的镜像。该应用程序命名为 - rails-app。
- 通过查看 - rails-app部署配置的 JSON 文档来验证环境变量是否已添加:- oc get dc rails-app -o json - $ oc get dc rails-app -o json- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 您应看到以下部分: - 输出示例 - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 检查构建流程: - oc logs -f build/rails-app-1 - $ oc logs -f build/rails-app-1- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 构建完成后,查看 OpenShift Container Platform 中运行的 pod: - oc get pods - $ oc get pods- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 您应看到其中一行命令以 - myapp-<number>-<hash>开头,这是您在 OpenShift Container Platform 中运行的应用程序。
- 在应用程序正常工作前,您必须运行数据库迁移脚本来初始化数据库。具体可通过两种方式实现: - 从正在运行的前端容器手动实现: - 使用 - rsh命令执行到前端容器中:- oc rsh <frontend_pod_id> - $ oc rsh <frontend_pod_id>- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 从容器内部运行迁移: - RAILS_ENV=production bundle exec rake db:migrate - $ RAILS_ENV=production bundle exec rake db:migrate- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 如果在 - development或- test环境中运行 Rails 应用程序,则不必指定- RAILS_ENV环境变量。
 
- 通过在模板中添加部署前生命周期 hook。
 
3.5.4.3. 为您的应用程序创建路由
您可公开服务来为您的应用程序创建路由。
流程
- 要通过向服务提供外部可访问的主机名(如 - www.example.com)来公开服务,请使用 OpenShift Container Platform 路由。对于您的情况,需要通过键入以下命令来公开前端服务:- oc expose service rails-app --hostname=www.example.com - $ oc expose service rails-app --hostname=www.example.com- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
确保您指定的主机名解析为路由器的 IP 地址。