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
- データベースはPostgreSQLを使用する
--skip-bundle
- bundle installを行わない -> 後で手動で行うため
--skip-test
- test::unitを組み込まない -> この連載では(今のところは)テストを省略します
となります。
加えて、1点だけ補足説明しておきます。
前回の第5回の記事で bundle instlal
したと思います。
あの bundle install
はrails gemをインストールするためのものです。
そして、実はもう一度 bundle install
する必要があります。
次の bundle install
はRailsアプリを動かすために必要な他の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
です。
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 s
でRailsアプリを起動させた場合は http://localhost:3000/
でアプリを確認できます。
それではブラウザで確認してみます。
Oh……
PG::ConnectionBad
というエラーが出ていますね。
could not connect to server
と怒られました。
そうです、データベースサーバのPostgreSQL(PG)の準備を何もしていないからです。
PostgreSQLのインストール
PostgreSQLについては下記をご参照ください(定期投げ)
(公式サイトがメンテ中なので後でここに貼ります)
インストール方法その他の詳細についてはこちらをご参照ください。
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
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 s
でRailsアプリを起動させてブラウザで http://localhost:3000/
を確認しましょう。
bundle exec rails s
無事に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には関しては全体を網羅しようとすると分量が多すぎるため、利用しながら適宜調べていく方が無難であると思います。この連載では、新しい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://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とは
今回は前回の記事で導入した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の各コマンドは下記に詳しくまとまっており、参考にさせていただきました。
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回 必要なパッケージの導入
前回までのあらすじ
LINEデベロッパー登録を終え、必要なAPIキーである「Channel Secret」と「アクセストークン」を手に入れました。
今回は必要なパッケージの導入を行っていきたいと思います。
この連載記事を書いている環境
そう言えば、bot作成を進めている(まだ進まっていないが)環境について書いていなかった気がします。
この連載はMacの上記の環境のもとで進めています。
Windowsの人は頑張ってください!
しかしながら、WindowsもLinuxもパッケージの導入部分は異なりますが、それ以外は一緒の気はしています。
必要なパッケージの導入
- git
- rbenv
- ruby-build
最低限、上記があればHeroku + Railsの開発は進められると思います。
不足するものがあればその都度インストールしていくことにしましょう。
以下、それっぽいコマンドは全てターミナルのコマンドラインで実行するものとします。
また、Homebrewはインストール済であるものとします。
未インストールなら下記を参考にしてください。
下記のコマンドで各パッケージを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を利用しているため)
終わりに
今回で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::APIをRailsから呼び出して、そのRailsはHerokuに乗せて動かすという形にします。
第1回の今回はLINEデベロッパー登録を行っていきます。
※ この連載は諸事情(飽き)により予告なく終了する可能性が十分にございます。あらかじめご了承ください。
LINEデベロッパー登録
まずはLINEデベロッパー登録を行います。 その後にプロバイダーとチャネルを作成し、必要なAPIキーを取得しましょう。
Messaging APIを利用するには
https://developers.line.me/ja/docs/messaging-api/getting-started/
詳しくは公式の上記を見てください。
で終わるので、下に補足説明の箇条書きと参考画像を乗せます。
- アクセストークン(ロングターム) : 再発行する
- Webhook送信 : 利用するを選択する
- Botのグループトーク参加 : 利用するを選択する
- 自動応答メッセージ : 利用しないを選択する
- 友だち追加あいさつ : 利用しないを選択する
botを作成する上で必要になるのが下記の2つです。
これらのキーを控えておきます(下記参考画像の赤枠)
- Channel Secret
- アクセストークン
参考画像
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へと自動デプロイされます。
- ローカル環境
- DockerizedなRails+PostgreSQLで開発する
- テスト実行
- デプロイ実行
- GitHubにpushして上記のテストが全て通るとCircleCIを通じてHerokuへとデプロイされる
- Heroku
- ローカルと同じ構成の環境がデプロイされる
なぜ作ったか
ギョームだと、ローカルはVagrantでProductionやStagingはAWSであることが多いのですが、個人開発でいちいちVagrantに環境を整えるは面倒だし本番も雑にHerokuでいいやと思ったので、Docker+HerokuのRailsアプリのテンプレートを作成しました。加えて、楽したいからGitHubにpushしたら自動テストと自動デプロイが走るようにCircleCIの設定を整えました。
作成物
作成物は下記になります。
続けて、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/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を更新しています。
参考
まとめ
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