しふみんのブログ

しふみんのブログです。

Heroku+RailsでLine botを作る 第6回 Railsアプリの作成

前回までのあらすじ

第1回: http://shifumin.hatenablog.com/entry/2018/04/20/000500
第2回: http://shifumin.hatenablog.com/entry/2018/04/22/002000
第3回: http://shifumin.hatenablog.com/entry/2018/04/23/000500
第4回: http://shifumin.hatenablog.com/entry/2018/04/24/000500
第5回: shifumin.hatenablog.com

LINEデベロッパー登録を終え、必要なAPIキーである「Channel Secret」と「アクセストークン」を手に入れました。
また、必要なパッケージの導入し、Rubyをインストールしました。
そして、プロジェクトディレクトリをバージョン管理できるようにGitリポジトリ化しました。
さらに、Bunblerを導入してrails gemをインストールしました。
今回は、(本当に!やっと!)Railsアプリを作成していきたいと思います。

rails new

ようやくのようやくで、Railsアプリの作成コマンドの実行までたどり着きました!
下記の rails new コマンドでRailsアプリを作成します。
コマンド実行後にOverwriteするかを聞かれたら全て y で問題ありません。

bundle exec rails new . --database=postgresql --skip-bundle --skip-test

rails new の各オプションの詳細は下記をご参照ください(投げ)

railsコマンド(rails) - - Railsドキュメント

それぞれのオプション他を軽く一言説明をしますと、

  • bundle exec
    • Bundlerでインストールしたカレントディレクリのgemのrailsコマンドを使用する
  • .
    • カレントディレクリにRailsアプリを作成する
  • --database=postgresql
  • --skip-bundle
    • bundle installを行わない -> 後で手動で行うため
  • --skip-test
    • test::unitを組み込まない -> この連載では(今のところは)テストを省略します

となります。
加えて、1点だけ補足説明しておきます。
前回の第5回の記事で bundle instlal したと思います。
あの bundle installrails gemをインストールするためのものです。
そして、実はもう一度 bundle install する必要があります。
次の bundle installRailsアプリを動かすために必要な他のgemをインストールするためのものになります。

ls -la で確認すると下記のようにRailsアプリの各ファイルが作成されていることと思います。

ls -la
total 32
drwxr-xr-x 22 shifumin staff  704  4 24 23:33 .
drwxr-xr-x 11 shifumin staff  352  4 22 11:51 ..
drwxr-xr-x  3 shifumin staff   96  4 24 22:09 .bundle
drwxr-xr-x  9 shifumin staff  288  4 24 23:33 .git
-rw-r--r--  1 shifumin staff  604  4 24 23:33 .gitignore
-rw-r--r--  1 shifumin staff    5  4 24 23:33 .ruby-version
-rw-r--r--  1 shifumin staff 1969  4 24 23:33 Gemfile
-rw-r--r--  1 shifumin staff 2911  4 24 22:11 Gemfile.lock
-rw-r--r--  1 shifumin staff  374  4 24 23:02 README.md
-rw-r--r--  1 shifumin staff  227  4 24 23:02 Rakefile
drwxr-xr-x 10 shifumin staff  320  4 24 23:33 app
drwxr-xr-x  8 shifumin staff  256  4 24 23:33 bin
drwxr-xr-x 16 shifumin staff  512  4 24 23:33 config
-rw-r--r--  1 shifumin staff  130  4 24 23:33 config.ru
drwxr-xr-x  3 shifumin staff   96  4 24 23:33 db
drwxr-xr-x  4 shifumin staff  128  4 24 23:33 lib
drwxr-xr-x  3 shifumin staff   96  4 24 23:33 log
-rw-r--r--  1 shifumin staff   66  4 24 23:33 package.json
drwxr-xr-x  9 shifumin staff  288  4 24 23:33 public
drwxr-xr-x  3 shifumin staff   96  4 24 23:33 storage
drwxr-xr-x  5 shifumin staff  160  4 24 23:33 tmp
drwxr-xr-x  4 shifumin staff  128  4 24 23:33 vendor

しかし、まだRailsアプリは動きません。
なぜならRailsアプリを動かすために必要な各gemがインストールされていないためです。
中身は載せませんが、 rails new 前は gem "rails" の行のみでしたGemfileにRailsアプリを動かすために必要な様々なgemが追加されていると思います。
これらのgemをインストールしていく必要があります。

line-bot-sdk-ruby gemの追加

追加されたgemをインストールする前にLINE bot開発に必要なgemを追加します。
下記の line-bot-api です。

github.com

Gemfileの一番最後に gem 'line-bot-api' の行を追加しましょう。
line-bot-apiの機能や使い方については実装時に追々見ていくことにします。

(前略)
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

gem 'line-bot-api'

余談ですが、gem名の記述が bundle init で作成したGemfileは "" で括られており、 rails new で上書き作成したGemfileは '' で括られていることを今回初めて知りました。
不思議ですね。

bundle install

2回目の bundle install です。
初回時に --path vendor/bundle オプションをつけていた場合、2回目以降はつけなくても ./vendor/bundle にインストールされます。
Bundlerの設定ファイルである .bundle/config の中身を見てみると、下記のように BUNDLE_PATH の設定があると思います。
これのおかげで、2回目以降は --path オプションが必要ないというわけです。

 ---
 BUNDLE_PATH: "vendor/bundle"

それでは追加されたgemを bundle install でインストールしましょう(今回も数分ほどかかるはずです)

bundle install

これで、ようやくRailsアプリを起動させる準備が整いました(大嘘)

rails s

Railsアプリ(のサーバ)を起動させるには rails s コマンドを利用します。

bundle exec rails s # bundle exec rails server でも bin/rails s でも bin/rails server でも可

下記のような出力が出るはずです。

=> Booting Puma
=> Rails 5.2.0 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.11.4 (ruby 2.5.1-p57), codename: Love Song
* Min threads: 5, max threads: 5
* Environment: development
* Listening on
Use Ctrl-C to stop

Railsアプリが起動しましたね。
ちなみに、先に書いておくとアプリの起動を止める方法は最後の行に書いてあるように Ctrlボタン + C 同時押しです。

Railsアプリを起動させた状態でブラウザで確認してみましょう。
ローカル環境(Mac)で rails sRailsアプリを起動させた場合は http://localhost:3000/ でアプリを確認できます。
それではブラウザで確認してみます。

f:id:shifumin:20180425235639p:plain

Oh……

PG::ConnectionBad というエラーが出ていますね。
could not connect to server と怒られました。
そうです、データベースサーバのPostgreSQL(PG)の準備を何もしていないからです。

PostgreSQLのインストール

PostgreSQLについては下記をご参照ください(定期投げ)

(公式サイトがメンテ中なので後でここに貼ります)

インストール方法その他の詳細についてはこちらをご参照ください。

qiita.com

Homebrewでインストールし、データベースクラスタRuby(Rails)のデフォルトエンコーディングである UTF-8 で初期化します。

brew install postgresql
initdb /usr/local/var/postgres -E utf8

初期化が完了したら、下記のコマンドでPostgreSQLサーバを起動させます。

brew services start postgresql # 停止コマンドは brew services stop postgresql

それでは、PostgreSQLサーバも起動させたことですし、再びRailsアプリを起動させてブラウザで確かめてみましょう。

bundle exec rails s

f:id:shifumin:20180425235540p:plain

Oh……(2回目)
今度は ActiveRecord::NoDatabaseError というエラーが出ました。
FATAL: database "line_bot_development" does not exist とデータベースがないって怒られていますね。
そうです(2回目)、DBサーバは起動させましたが、肝心のデータベースをまだ作成していません。
データベースの作成(初期化)はrailsコマンドが良きに計らってやってくれます。
下記の rails db:create コマンドです。

bundle exec rails db:create
Created database 'line_bot_development'
Created database 'line_bot_test'

データベースが作られました(開発環境用DBとテスト用DB)
これで本当の本当の本当にRailsアプリを起動させる準備が整いました(真)

rails s再び

それでは、 rails sRailsアプリを起動させてブラウザで http://localhost:3000/ を確認しましょう。

bundle exec rails s

f:id:shifumin:20180425235424p:plain

無事にRailsアプリが起動できましたね。
お疲れ様でした(僕が)(今回の記事は長かった……)

終わりに

今回はRaisアプリの作成を行い、起動させ、確認しました。
次回はこのRails上にbotの実装を進めていきましょう。
ようやく本編がスタートする気がします。

参考

railsコマンド(rails) - - Railsドキュメント
http://railsdoc.com/rails

line/line-bot-sdk-ruby: Line: :API - SDK of the LINE Messaging API for Ruby.
https://github.com/line/line-bot-sdk-ruby

MacにPostgreSQL9.6.3をインストールしてみた - Qiita
https://qiita.com/uhooi/items/cd6256a72c6a03621c09

Heroku+RailsでLine botを作る 第5回 Bundlerの導入

前回までのあらすじ

第1回: http://shifumin.hatenablog.com/entry/2018/04/20/000500
第2回: http://shifumin.hatenablog.com/entry/2018/04/22/002000
第3回: http://shifumin.hatenablog.com/entry/2018/04/23/000500
第4回: shifumin.hatenablog.com

LINEデベロッパー登録を終え、必要なAPIキーである「Channel Secret」と「アクセストークン」を手に入れました。
また、必要なパッケージの導入し、Rubyをインストールしました。
そして、プロジェクトディレクトリをバージョン管理できるようにGitリポジトリ化しました。
今回は、Bundlerの導入を行っていきたいと思います(また、Railsアプリの作成まで辿り着けなかったよ……)

Bundlerとは

Rails(Ruby)アプリはBunlderというgem管理システムを導入することが多いです。
Ruby用のライブラリ(便利ツール的なもの)は「gem」という形で提供されています。
例えば、Railsもgemの形で提供されています。
このgemをGemfile(とGemfile.lock)というファイルで管理するためのシステムがBundlerです。
インストールするgemの種類・バージョン管理しているGemfile(Gemfile.lock)さえあれば同じgemの環境を整えることが容易であるため、複数人や複数の環境で開発を行う場合に役立ちます。

詳しくは下記を見てください(いつも通りの投げ)

Bundler: The best way to manage a Ruby application's gems qiita.com

Bundlerのインストール

そういうわけで、Bundlerをインストールしていきます。
念のため、gem自体をアップデートしてからBundlerをインストールします。

gem update --system
gem install bundler
bundle --version # bundle -v でも可
Bundler version 1.16.1

Bundlerがインストールされました。

Gemfileの準備

続けてBundlerで使用するGemfileの準備に進みます。
Gemfileとはインストールするgemの種類やバージョンを記載するファイルです。
まず、 bundle init でGemfileを作成します。

bundle init
Writing new Gemfile to /Users/shifumin/project/line_bot/Gemfile

Gemfileが作成されましたので開いて内容を確認します。

vim Gemfile # お使いのエディタでGemfileを開いてください(以下略)
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

# gem "rails"

上記のようなGemfileになっているはずです。
まず、Railsアプリを実行するRubyのバージョンを明示するために ruby "2.5.1" の行を追加しましょう(バージョンは適宜ご変更ください)
次に、Railsをインストールするために gem "rails"コメントアウトを外しましょう。
また、一応Railsのバージョンを固定しておきましょう。
バージョンを固定する理由は、バージョンを固定しないとBundlerでgemをインストールする時期によってインストールされるgemのバージョンが左右されてしまうためです(やや曖昧な説明。許して)
バージョンが異なるとgemの挙動が変わって意図しない挙動をする場合があります(バグの温床になる)
例えば、現在(2018年4月24日)はバージョンを固定しない場合はRailsは5.2.0がインストールされますが、もう少し先の未来にはそれが5.2.1, 5.2.2, あるいは5.3.0になったりするはずです。
それでは、下のようにGemfileを修正しましょう。

# frozen_string_literal: true
ruby "2.5.1"

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rails", "5.2.0"

rails gemのインストール

下記の bundle install コマンドでrails gemをインストールします。

bundle install --path vendor/bundle

--path vendor/bundle のオプションを付けています。
pathを指定する理由は、pathを指定しないとシステム配下にgemがインストールされてしまうためです。
今回インストールするgemはこのbot作成のためだけにインストールするので、プロジェクトディレクトリ配下にインストールされるようにpathを指定します。
詳しくは下記の公式ドキュメントの真ん中らへんをご参照ください。

Bundler: The best way to manage a Ruby application's gems

初回のインストールには数分かかるはずです。

Fetching gem metadata from https://rubygems.org/..........
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies...
Fetching rake 12.3.1
Fetching concurrent-ruby 1.0.5
(中略)
Fetching rails 5.2.0
Installing rails 5.2.0
Bundle complete! 1 Gemfile dependency, 41 gems now installed.
Bundled gems are installed into `./vendor/bundle`

Rails gem(とその依存関係のgem)は ./vendor/bundle/ にインストールされました。

終わりに

今回はBundlerを導入し、rails gemをインストールしました。
次回こそ、本当の本当にRailsアプリの作成を行なっていきましょう(三度目の正直)
この次に実行するコマンドが rails new であるため次回の記事で大丈夫(?)なはずです。。。

参考

Bundler: The best way to manage a Ruby application's gems
http://bundler.io/

Bundlerの使い方 - Qiita
https://qiita.com/oshou/items/6283c2315dc7dd244aef

bundle install - Bundler: The best way to manage a Ruby application's gems http://bundler.io/v1.16/bundle_install.html

Heroku+RailsでLine botを作る 第4回 Gitリポジトリの作成

前回までのあらすじ

shifumin.hatenablog.com shifumin.hatenablog.com shifumin.hatenablog.com

LINEデベロッパー登録を終え、必要なAPIキーである「Channel Secret」と「アクセストークン」を手に入れました。
そして、必要なパッケージの導入し、Rubyをインストールしました。
今回は、プロジェクトをバージョン管理できるようにGitリポジトリを作成していきたいと思います。
(前回の次回予告で、今回は「Railsアプリの作成」を行うと書いた気がしますが、まだ全然そこまで辿り着けない!)

Gitとは

Gitとは、リポジトリとは、人生とは……。
それ(人生を除く)を説明するとそれだけでこの連載が15回分くらい増えるので、詳しくはググってください。
あるいは下記の記事群が参考になります。

Git backlog.com qiita.com

しかしながら、Gitには関しては全体を網羅しようとすると分量が多すぎるため、利用しながら適宜調べていく方が無難であると思います。この連載では、新しいgitのコマンドが出てきた場合はその都度簡単な解説を加えることとします。

ここで、Gitを簡単に説明すると「バージョン管理するためのツール」で、
バージョン管理とは、「プログラムの状態をバージョンとして管理すること」で、
リポジトリとは「バージョン管理する対象」となります。

bot開発を例に取ると、

  • 「オウム返し」機能を実装した <- ここでセーブ
  • 「おはよう」機能を実装した <- ここでセーブ
  • 「ゴミ出し日通知」機能を実装した <- ここでセーブ

上記のように機能を追加した節目で状態(バージョン)をセーブ(コミット)して、後でどのような機能を追加したかを振り替えしやすくしたり(コミットごとにコメントを残せる)、いざという時に過去のバージョンに戻せたりできます。
プログラムの開発を進めていくと、例えばバグが混在している場合など、今の状態から修正を加えるよりもある時点の状態に戻してそこからもう一度機能を追加した場合の方が結果的に作業が早い場合が往往にしてあります。そういった場合にGitでのバージョン管理が役立ちます。
バグは怖いですね。

Gitの初期設定

さて、それではgitの初期設定を行いましょう。
既に行なっている方は飛ばしてください。

git config —global user.name {ユーザー名}
git config —global user.email {メールアドレス}

ちなみに、ユーザー名もメールアドレスも適当なものでも特に問題ありません。

リポジトリの作成

Railsアプリの作成の前にプロジェクトディレクトリをgitリポジトリ化しましょう。
リポジトリの作成(初期化)には git init を使います。

git init
Initialized empty Git repository in /Users/shifumin/project/line_bot/.git/

ls -la で確認した時に .git が存在していればリポジトリ化されています。

ls -la
total 4
drwxr-xr-x  4 shifumin staff 128  4 23 01:01 .
drwxr-xr-x 11 shifumin staff 352  4 22 11:51 ..
drwxr-xr-x  9 shifumin staff 288  4 23 01:01 .git
-rw-r--r--  1 shifumin staff   6  4 22 12:36 .ruby-version

これでプロジェクトディレクトリをgitでバージョン管理できるようになりました。

終わりに

今回はプロジェクトのバージョン管理を行うためにGitリポジトリを作成しました。
次回こそ本当にbotの機能を実装するRailsアプリの作成を行なっていきましょう(二度目の正直)

参考

Git
https://git-scm.com/

サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ
https://backlog.com/ja/git-tutorial/

Gitの基礎 - Qiita
https://qiita.com/satoshi1335/items/ead109412430a078feaa

Heroku+RailsでLine botを作る 第3回 Rubyのインストール

前回までのあらすじ

shifumin.hatenablog.com shifumin.hatenablog.com

LINEデベロッパー登録を終え、必要なAPIキーである「Channel Secret」と「アクセストークン」を手に入れました。
そして、必要なパッケージの導入を行いました。
今回は、botの実行環境であるRubyをインストールしていきたいと思います。

プロジェクトディレクトリの作成

まずは、今回作成するbotのプログラムを置くディレクトリを用意しましょう。
mkdirディレクトリを作成し、 cd で作成したディレクトリに移動します。

mkdir line_bot
cd line_bot

僕の場合は下記のディレクトリで作業を進めていくことにします。
( pwd は現在のディレクトリのpathを返します)

pwd
/Users/shifumin/project/line_bot

rbenvとは

github.com

今回は前回の記事で導入したrbenvを使ってRubyをインストールしていきます。
前回は何も説明しませんでしたが、rbenvは簡単に言うと、「インストールするRubyのバージョンを管理するためのパッケージ」です。具体的には、例えばプロジェクトA(ディレクトリ /path/to/project_a)だとRubyのバージョン2.4.0を使いたいけど、プロジェクトB(/path/to/project_b)ではRubyのバージョン2.5.0を使いたいといった場合に役立ちます。
つまり、ディレクトリごとに動かすRubyのバージョンを変えたい場合に役立つパッケージということですね。rbnevがないと、例えば、MacにRuby2.5.0をインストールするとMacの中でRubyを動かす場合は全て2.5.0になってしまいます。

rbenvの各コマンドは下記に詳しくまとまっており、参考にさせていただきました。

qiita.com

Rubyのインストール

それでは、Rubyのインストールを進めていきます。
まず、インストールできるRubyのバージョンを調べます。

rbenv install --list # rbenv install -l でも可

出力の真ん中ら辺を見てみますと

(前略)
2.4.4
2.5.0-dev
2.5.0-preview1
2.5.0-rc1
2.5.0
2.5.1
2.6.0-dev
2.6.0-preview1
jruby-1.5.6
(後略)

現時点でのRubyの安定版の最新バージョンはどうやら 2.5.1 のようです。 なので、2.5.1をインストールしましょう(数分ほど時間がかかります)

rbenv install 2.5.1

次にこのプロジェクト(ディレクトリ)で使用するRubyのバージョンを指定します。
(その後、念のためrehashします)

rbenv local 2.5.1
rbenv rehash

rbenv local でのRubyバージョンを指定すると、カレントディレクトリに .ruby-version というファイルができます。
このファイルの中身を見てみましょう。
僕はエディタはVimを使っていますので、この連載の下記以降でvimが出てきた時はお使いのエディタに差し替えてください。

vim .ruby-version

.ruby-versionの中身は下記のようになっているはずです。

2.5.1

また、下記のコマンドでRubyのバージョンを確認しましょう。

ruby --version # ruby -v でも可
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]

Rubyのバージョン2.5.1がインストールされていることを確認できました。

終わりに

今回でbotを作成するプロジェクトディレクトリを作成し、そこにRubyの実行環境を整えることができました。 次回はbotの機能を実装するRailsアプリの作成を行いたいと思います(先は長い……)

参考

rbenv/rbenv: Groom your app’s Ruby environment
https://github.com/rbenv/rbenv

[rbenv]コマンド備忘録 - Qiita
https://qiita.com/a_ishidaaa/items/8cc14453289dba1413dd

Heroku+RailsでLine botを作る 第2回 必要なパッケージの導入

前回までのあらすじ

shifumin.hatenablog.com

LINEデベロッパー登録を終え、必要なAPIキーである「Channel Secret」と「アクセストークン」を手に入れました。
今回は必要なパッケージの導入を行っていきたいと思います。

この連載記事を書いている環境

そう言えば、bot作成を進めている(まだ進まっていないが)環境について書いていなかった気がします。 この連載はMacの上記の環境のもとで進めています。
Windowsの人は頑張ってください!
しかしながら、WindowsLinuxもパッケージの導入部分は異なりますが、それ以外は一緒の気はしています。

必要なパッケージの導入

  • git
  • rbenv
  • ruby-build

最低限、上記があればHeroku + Railsの開発は進められると思います。
不足するものがあればその都度インストールしていくことにしましょう。

github.com

github.com

以下、それっぽいコマンドは全てターミナルのコマンドラインで実行するものとします。
また、Homebrewはインストール済であるものとします。 未インストールなら下記を参考にしてください。

brew.sh

下記のコマンドで各パッケージをHomebrewでインストールして、rbenvのpathと初期起動をbashの設定ファイルに追記します。
shellがbashじゃない人は適時置き換えてください。

brew install git
brew install rbenv
brew install ruby-build

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi' >> ~/.bash_profile
source ~/.bash_profile

僕はこの記事を書いている時に知りましたが、 rbenv-doctor というスクリプトがあり、 rbenvが適切にインストールされたかを確認できるようです。
参考: https://github.com/rbenv/rbenv#homebrew-on-macos

(curlが必要なので、なければ brew install curl でインストール)

curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash

僕の環境だとanyenv経由でrbenvを利用しているので下記のようになりましたが、似たように感じの出力があればインストールに成功していると思います。

 ~ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash
Checking for `rbenv' in PATH: /Users/shifumin/.anyenv/envs/rbenv/bin/rbenv
Checking for rbenv shims in PATH: OK
Checking `rbenv install' support: /Users/shifumin/.anyenv/envs/rbenv/plugins/ruby-build/bin/rbenv-install (ruby-build 20171226)
Counting installed Ruby versions: 2 versions
Checking RubyGems settings: OK
Auditing installed plugins: OK

パッケージの導入は下記を参考にさせていただきました。
(自分の環境は既に導入済かつZshとanyenvを利用しているため)

qiita.com

終わりに

今回でHeorku + RailsでLINE botを開発するために必要なパッケージを導入できました。
次回はbot開発のためにRubyの環境を整えていこうと思います。

参考

macOS 用パッケージマネージャー - Homebrew
https://brew.sh/index_ja

rbenv/rbenv: Groom your app’s Ruby environment
https://github.com/rbenv/rbenv

rbenv/ruby-build: Compile and install Ruby
https://github.com/rbenv/ruby-build

Heroku+RailsでLINE botを作る 第1回 LINEデベロッパー登録

はじめに

はい、というわけでね、今回から複数回に分けてLINE botを作成していこうと思います。
構成は、Line::Bot::APIRailsから呼び出して、そのRailsはHerokuに乗せて動かすという形にします。 第1回の今回はLINEデベロッパー登録を行っていきます。

※ この連載は諸事情(飽き)により予告なく終了する可能性が十分にございます。あらかじめご了承ください。

LINEデベロッパー登録

まずはLINEデベロッパー登録を行います。 その後にプロバイダーとチャネルを作成し、必要なAPIキーを取得しましょう。

Messaging APIを利用するには
https://developers.line.me/ja/docs/messaging-api/getting-started/

詳しくは公式の上記を見てください。
で終わるので、下に補足説明の箇条書きと参考画像を乗せます。

  • アクセストークン(ロングターム) : 再発行する
  • Webhook送信 : 利用するを選択する
  • Botグループトーク参加 : 利用するを選択する
  • 自動応答メッセージ : 利用しないを選択する
  • 友だち追加あいさつ : 利用しないを選択する

botを作成する上で必要になるのが下記の2つです。
これらのキーを控えておきます(下記参考画像の赤枠)

参考画像

https://gyazo.com/fff187b8df2919a00873d00bb7b2e20a Image from Gyazo

LINE bot作成依頼主の依頼でbotのアイコンと名前はこんなになっていますが、問題がありそうなら差し替えます。許して。

終わりに

LINEデベロッパー登録を終えて、LINE bot作成に必要なChannel Secretとアクセストークンが手に入りました。
これらを使って次回からbot本体の作成に取り掛かっていこうと思います。

参考

Messaging APIを利用するには
https://developers.line.me/ja/docs/messaging-api/getting-started/

DockerとCircleCIを使ってRailsアプリの自動テスト&自動Herokuへのデプロイ環境を作った

はじめに

はい、標題の通りですが、DockerとCircleCIを使ってRailsアプリの自動テスト&自動Herokuへのデプロイ環境のテンプレートを作成しました。

どういうものか

Heroku用のDockerizedされたRailsアプリのテンプレートです。
docker-compse up して rails new してアプリを書いた後に、GitHubにpushすると自動テスト(RSpec)が実行されて、テストがすべて通るとHerokuへと自動デプロイされます。

  • ローカル環境
  • テスト実行
    • GitHubにpushするとCircleCIを通じてローカルと同じ構成のテスト環境でRSpecが実行される
  • デプロイ実行
    • GitHubにpushして上記のテストが全て通るとCircleCIを通じてHerokuへとデプロイされる
  • Heroku
    • ローカルと同じ構成の環境がデプロイされる

なぜ作ったか

ギョームだと、ローカルはVagrantでProductionやStagingはAWSであることが多いのですが、個人開発でいちいちVagrantに環境を整えるは面倒だし本番も雑にHerokuでいいやと思ったので、Docker+HerokuのRailsアプリのテンプレートを作成しました。加えて、楽したいからGitHubにpushしたら自動テストと自動デプロイが走るようにCircleCIの設定を整えました。

作成物

作成物は下記になります。

github.com

続けて、DockerとCirclrCIの設定を見ていきます。

Dockerfile

FROM ruby:2.5.1
ENV LANG C.UTF-8

RUN apt-get update -qq && \
    apt-get install -y build-essential \
                       apt-transport-https \
                       libpq-dev \
                       postgresql-client \
                       --no-install-recommends

# node
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - \
    && apt-get install -y nodejs

# yarn
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" \
    | tee /etc/apt/sources.list.d/yarn.list \
    && apt-get update && apt-get install -y yarn

RUN mkdir /rails_app
WORKDIR /rails_app

COPY Gemfile /rails_app/Gemfile
COPY Gemfile.lock /rails_app/Gemfile.lock
COPY yarn.lock /rails_app/yarn.lock

RUN bundle install --jobs=4 --no-cache
COPY . /rails_app

EXPOSE 3000
RUN RAILS_ENV=production rails assets:precompile
CMD ["rails", "s", "-b", "0.0.0.0"]

Rails用のよく見る形のDockerfileだと思います。
必要なパッケージをインストールして、bundle installして、そして最後にアプリ全体をコピーしています。
rails s する直前で assets:precompile を実行しています。

docker-compose.yml

version: '3'
services:
  web:
    build:
      context: .
    tty: true
    stdin_open: true
    ports:
      - '3000:3000'
    volumes:
      - .:/rails_app
    depends_on:
      - db
  db:
    image: postgres:10.3
    ports:
      - '5432:5432'
    volumes:
      - postgresql-data:/var/lib/postgresql/data
volumes:
  postgresql-data:
    driver: local

こちらもよく見るRails+PostgreSQLの構成のdocker-compose.ymlだと思います。
特記すべき点は、2点あって、
1点目が、Dockerコンテナ内でも binding.pryデバッグ可能にするために下記の設定を追加している点です。

  web:
    tty: true
    stdin_open: true

binding.pry を埋め込んで、 docker-compose run --rm --service-ports web で起動すると他環境と同様にデバッグすることができます。

2点目が、DBのデータを永続化するために下記の設定を追加している点です。

  db:
    volumes:
      - postgresql-data:/var/lib/postgresql/data
volumes:
  postgresql-data:
    driver: local

この設定を追加することによって、DBの中身をローカルに永続化でき docker-compose up を止めてもDBの中身が消えません。

CircleCI2.0

.circleci/config.yml

version: 2
jobs:
  test:
    machine:
      image: circleci/classic:edge
    steps:
      - checkout
      - run:
          name: docker-compose build
          command: docker-compose build
      - run:
          name: docker-compose up
          command: docker-compose up -d
      - run:
          name: sleep for waiting launch db
          command: sleep 1
      - run:
          name: rails db:create and db:migrate
          command: docker-compose run web rails db:create db:migrate
      - run:
          name: rspec
          command: docker-compose run web rspec
      - run:
          name: docker-compose down
          command: docker-compose down

  deploy:
    working_directory: ~/deploy
    machine:
      image: circleci/classic:edge
    steps:
      - checkout
      - run:
          name: Build docker image
          command: docker build --rm=false -t registry.heroku.com/${HEROKU_APP_NAME}/web .
      - run:
          name: Setup Heroku command
          command: bash .circleci/setup_heroku.sh
      - run:
          name: Execute Heroku maintenance on
          command: heroku maintenance:on --app ${HEROKU_APP_NAME}
      - run:
          name: Push container to registry.heroku.com
          command: |
            docker login --username=_ --password=$HEROKU_AUTH_TOKEN registry.heroku.com
            docker push registry.heroku.com/${HEROKU_APP_NAME}/web
      - run:
          name: Execute Heroku db migrate
          command: heroku run rails db:migrate --app ${HEROKU_APP_NAME}
      - run:
          name: Execut Heroku maintenance off
          command: heroku maintenance:off --app ${HEROKU_APP_NAME}

workflows:
  version: 2
  test-deploy:
    jobs:
      - test
      - deploy:
          requires:
            - test
          filters:
            branches:
              only: master

特記すべき点は、 test job, deploy job共に下記のように machine imageに ciecleci/classic:edge を指定していること。

  test:
    machine:
      image: circleci/classic:edge

このように設定することにより、最新のdocker-compseがインストール済みの仮想マシンを使うことができます(楽)

参考

circleci.com

.circleci/setup_heroku.sh

#!/bin/bash
wget https://cli-assets.heroku.com/branches/stable/heroku-linux-amd64.tar.gz
sudo mkdir -p /usr/local/lib /usr/local/bin
sudo tar -xvzf heroku-linux-amd64.tar.gz -C /usr/local/lib
sudo ln -s /usr/local/lib/heroku/bin/heroku /usr/local/bin/heroku

cat > ~/.netrc << EOF
machine api.heroku.com
  login $HEROKU_LOGIN
  password $HEROKU_API_KEY
EOF

# Add heroku.com to the list of known hosts
ssh-keyscan -H heroku.com >> ~/.ssh/known_hosts

CiecleCIのworkflowの deploy jobで実行している setup_heroku.sh は下記のリポジトリスクリプトを参考(ほぼそのまま)にさせていただきましたm( )m
内容としては、herokuコマンドを使えるようにして、herokuのログイン設定を設定ファイルに追記して、SSHのknown_hostsを更新しています。

参考

github.com

まとめ

HerokuのRailsアプリ開発環境をDockerとCircleCIを使って作成しました。 Dockerを使うことによって、Rubyのインストールすらせずに素早くローカル開発環境を用意できるだけでなく、開発環境、テスト環境、本番環境で同じDockerイメージを使いまわせて環境の違いによる謎のバグに悩ませることなくRailsアプリの開発を行うことができます。便利ですね。
気が向いたら、このテンプレートを利用して具体的にHerokuでRailsアプリを動かすところを解説する記事を書きたいと思います。

参考

library/postgres - Docker Hub
https://hub.docker.com/_/postgres/

Heroku Container Registryで作るDocker時代のRails 5 入門 - Qiita
https://qiita.com/koduki/items/3aafc38c6c518bef2af3

docker-composeでRailsを開発しCircleCI 2.0でテストしてHerokuにdeployする - Qiita
https://qiita.com/Kesin11/items/47079bc7f659e71b694c

Choosing an Executor Type - CircleCI
https://circleci.com/docs/2.0/executor-types/

Kesin11/docker_rails_sample: Dockernized rails with CircleCI and Heroku
https://github.com/Kesin11/docker_rails_sample