Serverspecでの1回目のテストでは、mysqlに関するテストが上手くできなかったので、今回はちょっと試してみたいことがあったので、「Serverspecでテストコードを書いてみる」2回目。
気になっていることというのは、EC2にMySQLサーバーを入れて起動させた時のmysqlに関するテスト結果がどうなるのか見てみたい!
・・・という興味である(想像が苦手なので、実際にやってみてこの目で確かめたい!)
色々ごにょごにょしてみたいので、新しくテスト用にRailsアプリを作成することにした。
※これまで作成してきたRailsアプリは、データベースがデフォルトのSQLite3、もしくは、あとからSQLite3→MySQLに変更したパターンだったので、初めからデータベースをMySQL指定で作成してみたかった、という意図もある
それでは、早速EC2上にServerspecのテストを実施するために、新規でRailsアプリを作成する。
※ちなみに、本環境はAWS環境構築2で手動で作成したEC2を使用しており、すでに一度Railsの環境構築をしているので、そこそこ必要なものはインストール済みとなっている。
Railsアプリの新規作成
データベースをMySQLに指定して、Railsアプリを作成
rails new spectest_apl -d mysql
spectest_aplフォルダができた
GemFileを確認する
あれ?rubyのバージョンが2.7.2なのにmysql2がインストールされていることになっている??
前に、あとからインストールしようとして、あんなに苦労したのに・・・。謎すぎる。
そのからくりは後で調べるとして、とりあえず本来の目的地に向かおう。
database.ymlを確認する
config\database.ymlを開く
データベースがmysql2になっていることを確認。(とりあえず先に進みたいので権限設定などはあえてせず、そのまま突っ走る!)
MySQLにログインする
mysql -u root -p
むむ?!エラーが出た。
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
ソケットファイルがないよ、ということらしい。
調べてみると、ソケットとは、プロセスやネットワークの間の通信の仕組みのことで、MySQLはソケットを通じてサーバーとクライアントが接続されるらしい。
つまり、このソケットファイルを通じて、MySQLのサーバーとクライアント間でやり取りしたいのに、そのファイルがないよ、というお叱りと言うことか。
確かに、確認してみると、そんなファイルはない。(そもそも、mysqlフォルダがないわw)
psコマンドで起動確認してみると、起動してない。
ps aux | grep mysqld
通常、mysqld(MySQLデーモン本体)が起動するときに、ソケットファイルを作成するらしいので、そもそもMySQLサーバーが起動してないから、ソケットファイルができないんじゃなかろうか。
じゃあ、MySQLサーバーはどうやったら起動するのーーーー!?
・・・これについては、どハマりしたので、別記事にまとめたw
MySQLサーバーをインストールして使えるようにするまでの一連の作業をまとめたので、そっちを参照のこと。
~ 2日後 ~
Serverspecでの自動テスト再び
まあ、色々あーだこーだやって、悩みぬいた末、テストコード完成!
require 'spec_helper' # 1 describe port(3000) do it { should be_listening } end # 2 describe command('rbenv -v') do its(:stdout) { should contain('1.1.2') } end # 3 describe package('rails') do it { should be_installed.by('gem') } end # 4 describe package('git') do it { should be_installed } end # 5 describe package('nodejs') do it { should be_installed } end # 6 describe package('yarn') do it { should be_installed } end # 7 describe package('mysql-community-server') do it { should be_installed } end # 8 describe service('mysqld') do it { should be_enabled } it { should be_running } end
rake spec実行結果
Port "3000" is expected to be listening Command "rbenv -v" stdout is expected to contain "1.1.2" Package "rails" is expected to be installed by "gem" Package "git" is expected to be installed Package "nodejs" is expected to be installed Package "yarn" is expected to be installed Package "mysql-community-server" is expected to be installed Service "mysqld" is expected to be enabled is expected to be running Finished in 0.53112 seconds (files took 0.37901 seconds to load) 9 examples, 0 failures
分かったこと
serviceは、Linuxにおけるサービスやデーモンのことだった。
分かる人には当たり前のことなのかもしれないが、一般人にとってはサービスは一般用語のサービスとしてしかとらえられないのではないだろうか・・・。
この括弧の中のサービスには、何を入れたらいいんだろうって思ってたw
前回上手くいかなかったのは、そもそもMySQLサーバーがインストールされていなかったということもあるけど、mysqlじゃなくて、デーモンであるmysqldを指定しなければいけなかったのだ。
また、パッケージコマンドでmysqlのテストが上手くいかなかったのは、パッケージ名の指定の仕方がまずかったから。
Failedになる例↓
describe package('mysql') do it { should be_installed } end
mysql-community-clientとか、mysql-community-commonとか、パッケージ名を正しく書かないとダメ
・・・ということだった。
なんか、ササッと終わらせる予定だったのに、びっくりするぐらい理解するのに時間がかかってしまった・・・。
でも、今回のハマりのおかげで、かなりいろんなことが結びついてきた。
結果オーライと言うことにしておく。