今天想笔记的是把自己写的Ruby on Rails项目部署(Deploy)到Heroku!

 

Heroku是Salesforce公司旗下的云端服务商,支持多种程序语言像是Ruby,PHP,Python等等。

提早让应用程序能快速建置、部署的主要好处就是提早一步发现问题啰,

如果将所有功能都写好再一起丢上去,可能会不容易发现不同的错误是分别出在哪里!

而且能在网路上让全世界看到自己努力实作的成果,还是比只有在本机localhost观赏更有成就感的。

 

以下以我在前篇文章写的Ruby on Rails项目为例:

 

Step.1 Getting started on Heroku with Ruby

二话不说,我们先到Heroku的申请页面用好自己的帐号,然后进入后台选择Ruby程序语言,按下create new app:

 

页面会跳转至如何设定Ruby的教学文件,开始一步步研究它:

 

A.在Terminal确定Ruby版本:ruby -v

tingdeMacBook-Air:~ tingtinghsu$ ruby -v

ruby 2.4.2p198(2017-09-14 revision 59899)[x86_64-darwin17]

B.安装bundler:输入gem install bundler

在Ruby世界里,

 

Gem代表套件,是各种打包好的代码,让开发效率更加速,节省工程师的宝贵时间。*

 

而Bundler是管理Gem相依性(dependencies)的工具,解决不同套件之间的依存关系,避免因为版本问题而产生冲突。*

 

tingdeMacBook-Air:~ tingtinghsu$ gem install bundler

Fetching: bundler-1.16.4.gem(100%)

Successfully installed bundler-1.16.4

Parsing documentation for bundler-1.16.4

Installing ri documentation for bundler-1.16.4

Done installing documentation for bundler after 8 seconds

1 gem installed

可以看到指令已经自动帮我装好了bundler-1.16.4.gem

 

C.安装Git

如果你的还没有装Git版本控制系统的话,Heroku教学文件也附上Git官网安装连接。

 

以上的步骤对接下来故事的发展很重要喔!

 

Step2.在你的OS设定Heroku CL界面

接下来进入Set Up页面照着步骤进行(vmwork):

 

A.用Homebrew安装Command Line界面

 

 

由于我使用的是MacOS,除了直接下载图形化安装界面,文件提到我可以:

使用Homebrew的指令brew install heroku/brew/heroku。

 

什么是Homebrew呢?这里PTT的大大提到Mac专用的套件管理系统(就是像ubuntu的apt-get)。

 

来看看自己以前是否有装过(因为很有实验精神的我很爱乱碰一些东西):brew -v

 

tingdeMacBook-Air:~ tingtinghsu$ brew -v

Homebrew 1.4.0

Homebrew/homebrew-core(git revision fc09;last commit 2017-12-12)

记录显示一年前有玩弄过~

果然今年开始养成写笔记的好习惯是正确的,不然做过什么有趣的事都忘记了,就很可惜呢。:)

 

现在我可以放心的输入指令brew install heroku/brew/heroku:

 

 

如果还没安装的人,可移驾至Homebrew官网瞧瞧~

 

从以下代码brew update可看到安装heroku的同时,系统也帮我把2017年的Homebrew 1.4.0更新到Homebrew 1.7.2:

 

tingdeMacBook-Air:~ tingtinghsu$ brew update

Updated 1 tap(heroku/brew).

==> Updated Formulae

heroku/brew/heroku✔

tingdeMacBook-Air:~ tingtinghsu$ brew -v

Homebrew 1.7.2

Homebrew/homebrew-core(git revision 14e75;last commit 2018-08-30)

B.正式进入Heroku Command Line

关于部署Deploy,参考教学文件,首先移动到你项目的路径位置:(我的以yelpdemo文件夹为例)。

 

输入指令heroku login,然后输入你的heroku帐号密码:

 

$ heroku login

Enter your Heroku credentials.

Email: user@example.com

 

Password:

下一步是输入指令heroku create:代表我们已经在Heroku上建立app(应用程序)了。

https://ithelp.ithome.com.tw/upload/images/20180830/20111177Zb0XfVJgEz.png

 

以上显示我已经在Heroku上开一台服务器,Heroku随机分配的名称叫做dry-sea-32555,

用git remote -v指令确认一下git在heroku远端的节点:

 

tingdeMacBook-Air:yelpdemo tingtinghsu$ git remote -v

heroku https://git.heroku.com/dry-sea-32555.git(fetch)

heroku https://git.heroku.com/dry-sea-32555.git(push)

如果你想把网址改成好记一点的,可以输入heroku rename+你喜欢的名称:

 

tingdeMacBook-Air:yelpdemo tingtinghsu$ heroku rename tingsrailsdemo

Renaming dry-sea-32555 to tingsrailsdemo…done

 

Git remote heroku updated

接着去改完名的这个网址瞧瞧:

 

 

太好了,服务器完工!

 

Step3.Getting started on Heroku with Rails

重头戏「利用指令部署项目至Heroku」开始上场!

以下纪录在把Ruby on Rail项目往Heroku上面推之前,记得到程序构架里修改的步骤。

 

A.首先,确定Rails版本rails -v:

tingdeMacBook-Air:yelpdemo tingtinghsu$ rails -v

Rails 5.1.6

这时候一定要用力参考这篇如何设定Rails的教学文件Getting Started on Heroku with Rails 5.x,让我们的代码可以顺利在网际网络上运行。记得参考的Heroku文件必须搭配相应的rails版本,如果你的rails版本是4或更旧的版本,文件里也有连接。

 

B.建立Heroku gem:

还记得刚刚文章开头我们聊过打包好的代码gem(套件),这时马上是个练习的好机会。

Horoku高度推荐我们开发项目所使用的数据库是Postgresql:

 

If you’re using an existing app that was created without specifying --database=postgresql,you need to add the pg gem to your Rails project.

Edit your Gemfile and change this line:gem 'sqlite3'To this:gem 'pg'

 

所以现在来到我的本地文件夹里的gem file,新增一个gem叫做'pg'

 

source 'https://rubygems.org'

 

git_source(:github)do |repo_name|

repo_name =“#{repo_name}/#{repo_name}”unless repo_name.include?(“/”)

“https://github.com/#{repo_name}.git”

end

# Bundle edge Rails instead: gem 'rails',github: 'rails/rails'

gem 'rails','~> 5.1.6'

#gem 'sqlite3' #database for Active Record

gem 'pg' #在这个地方新增Postgresql gem

gem 'puma','~> 3.7' #app server

gem 'sass-rails','~> 5.0' #stylesheets

gem 'uglifier','>= 1.3.0' #compressor for JavaScript assets

gem 'coffee-rails','~> 4.2' #.coffee assets and views

gem 'turbolinks','~> 5' #navigate your web application faster

gem 'jbuilder','~> 2.5' #Build JSON APIs

 

C.利用bundle确认套件版本之间的相依性没有冲突。

如同本文开头所提到的,这个步骤很重要。

记得,只要改过任何gemfile,就要再跑过bundle install指令,确认相依性:

 

Fetching gem metadata from https://rubygems.org/………

Fetching gem metadata from https://rubygems.org/.

Resolving dependencies…

bundler很乖地帮我们查找到了一个,这就是刚刚修改的Pg套件:

 

Fetching pg 1.1.2

Installing pg 1.1.2 with native extensions

Bundle complete!16 Gemfile dependencies,70 gems now installed.

Use `bundle info [gemname]` to see where a bundled gem is installed.

每次头一回安装一个新套件,还跟它不熟时,

你可以输入bundle info +套件名称深入了解详细数据,增强自己的印象,以及对技术的近一步认识(以免装过什么gem玩意都很容易失忆啊):

 

tingdeMacBook-Air:yelpdemo tingtinghsu$ bundle info pg

* pg(1.1.2)

Summary: Pg is the Ruby interface to the {PostgreSQL RDBMS}[http://www.postgresql.org/]

Homepage: https://bitbucket.org/ged/ruby-pg

Path: /Users/tingtinghsu/.rvm/gems/ruby-2.4.2/gems/pg-1.1.2

D.利用git指令,部署项目至Heroku:git push heroku master

tingdeMacBook-Air:yelpdemo tingtinghsu$ git push heroku master

Counting objects: 129,done.

Delta compression using up to 4 threads.

Compressing objects: 100%(112/112),done.

Writing objects: 100%(129/129),28.60 KiB | 0 bytes/s,done.

Total 129(delta 9),reused 105(delta 3)

* [new branch] master -> master

好了!既然推上去了,就跑去Heroku网站看一眼长什么样子:

 

疑?我精美的网站呢?

 

E.最后的最后…记得要输入指令heroku run rake db:migrate更新数据库

为了解决刚刚的问题,在这里解释:

Rails的环境分成三种

 

development开发模式,

test测试模式,和

production产品正式上线模式。在这里的Heroku就是我们的产品模式(zflwx)。

这个指令的意思,每次更改数据库时,记得最后要在Heroku(产品正式上线模式)跑migration。

 

tingdeMacBook-Air:yelpdemo tingtinghsu$ heroku run rake db:migrate

Running rake db:migrate on⬢tingsrailsdemo…up,run.3211(Free)

================================

-- create_table(:restaurants)

-> 0.0102s

== 20180823054504 CreateRestaurants: migrated(0.0107s)=======================

 

跑完rake db:migrate后,页面终于顺利出现。:)

 

后记,在最后的处理数据库部分的时候,我卡了快2小时…因为我之前预设的rails项目是使用sqlite3而不是PostgreSQL!不过为了解决bug,之后近一步参考why you cannot use Sqlite3 on Heroku,再搜寻错误讯息的关键字,增加了更多知识,顺便连下一篇文章主题都想好了:如何把你的Rails app数据库从sqlite移转成postgre。开心!XD