ユアマイスター株式会社エンジニアブログ

ユアマイスター株式会社のエンジニアが日々徒然。

Circle CIのMySQLはデフォルトでsql_modeの設定がなかったのでSTRICT_TRANS_TABLESを追加する

f:id:yourmystar_engineer:20190808135636p:plain

どうも。ユアマイスター星(@inase17000)です。

Circle CIを利用する中で、少し困ったことが起きたので解決方法をメモしておきます。

これまでのわたし

Circle CI 2.0
MySQL 5.6系

を使ってます。 また、.circleci/config.yml では、下記のような指定をしています。

      - image: mysql:5.6
        environment:
          MYSQL_ALLOW_EMPTY_PASSWORD: true
          MYSQL_USER: root
          MYSQL_PASSWORD: ''
        command: [--character-set-server=utf8]

こちらのイメージを使っていますと、Circle CI実行環境に立ち上がるmysqlにアクセスしてsql_modeを確認すると、 NO_ENGINE_SUBSTITUTION のみの設定となっていました。ちなみに、Circle CIが管理する同バージョン MySQLイメージを使ったとしても同じ状況になります。*1

circleci@bc88416ff04b:~$ mysql -u root -h ${DB_HOST}
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.6.45 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> SELECT @@GLOBAL.sql_mode;
+------------------------+
| @@GLOBAL.sql_mode      |
+------------------------+
| NO_ENGINE_SUBSTITUTION |
+------------------------+
1 row in set (0.000 sec)

MySQL [(none)]> exit

STRICT_TRANS_TABLESをつけたい...

MySQL5.5まではsql_modeのデフォルトが空設定だったのですが、MySQL5.6からはsql_modeにデフォルトが設定されるようになりました。 NOT NULL制約の扱いや、Varcharの文字数溢れの扱いをちゃんとしておきたいし、CI環境がゆるいままだと意味な杉!ということでSTRICTモードの設定を入れることにしました。

設定変更はとても簡単。.circleci/config.ymlを更新するだけです。

-       command: [--character-set-server=utf8]
+       command: ["--character-set-server=utf8", "--sql-mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"]

ご覧の通り、 --sql-mode= とオプションを指定するだけ。これでMySQL起動時にSTRICTモード突入です。

念の為確認もしてみる。

Circle CI実行環境にSSHしてみると...

circleci@145b2c4ea5f0:~$  mysql -u root -h ${DB_HOST}
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.6.45 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> SELECT @@GLOBAL.sql_mode;
+--------------------------------------------+
| @@GLOBAL.sql_mode                          |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.000 sec)

無事、STRICT_TRANS_TABLES が追加されました。

ちょっとしたことだけど、環境をきれいにしておくことって大事です。品質高いアプリケーションを作るために細かいところまで丁寧に作れるようになりたいものです。

ついでに

今回、 .circleci/config.yml の編集のテストをWeb上のCircle CIを利用しましたが、Circle CI2.0はたしかローカルで動かすこともできたはずなので、今度はその環境用意してテストをもっと短期間で終わらせるようにしたいなぁ。