CircleCI で MySQL にパラメータを渡す #CircleCI

TL;DR

command 要素を使うとパラメータを渡せる。

- image: circleci/mysql:5.7-ram
  environment:
    MYSQL_ROOT_PASSWORD: password
    MYSQL_DATABASE: test
  command: ['--character-set-server=utf8mb4']

こんな感じにすると動く。

経緯

Invalid datetime format: 1292 Incorrect datetime value: ‘0000-00-00 00:00:00’

CI を導入したら、テストデータ登録でエラーが発生。

sql_mode の設定が原因であった。

現行の DB の sql_mode が空になっていたので、とりあえず設定を揃えることで回避できないかと考えた。
(本当は STRICT でも動くようにしたい)

MySQL

cnf ファイルを用意してもいいのだが、なんかサクッとやる方法ないかなと調べてみる。

MySQL のイメージ自体は --character-set-server=utf8mb4 みたいな感じで渡せるようだ。

hub.docker.com

CircleCI

設定のリファレンスを読むと、 command という設定があるのを発見。

値ありオプションの例がなかったけど、そのまま渡してあげれば大丈夫なようだ。

circleci.com

command: ['--sql-mode=']

これでよかったっぽい。

参考

MySQL コンテナの起動を待つ #mysql #docker

概要

Docker で MySQL コンテナの起動を待つ方法まとめ

nc で待つ

nc コマンドで待つ。

CircleCI の Example にあった。

for i in `seq 1 10`;
do
  nc -z 127.0.0.1 3306 && echo Success && exit 0
  echo -n .
  sleep 1
done
echo Failed waiting for MySQL && exit 1

dockerize で待つ

これも CircleCI の doc で知った。

-wait を使うことで、起動を監視できる。

CircleCI の公式イメージだと大体インストールされている気がする。

dockerize -wait tcp://localhost:3306 -timeout 1m

github.com

初期化を待つ

nc や dockerize だと、起動の確認までしかできない。

起動時のデータ投入などで初期化中の場合、エラーになってしまうので別途待機する必要がある。

ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 102

初期化エラーの場合、mysql クライアントに上記のようなエラーが帰ってくるのでそれを grep することで判定してみた。

for i in $(seq 1 10);
do
  (mysql -h 127.0.0.1 -P 3306 2>&1 1>/dev/null | grep "ERROR 2013 (HY000)" 1>/dev/null) \
    && : || exit 0
  echo -n .
  sleep 1
done
echo ""

2>&1 1>/dev/null

コマンド結果のエラー出力をパイプでつなげるために標準出力にリダイレクトしている。

標準出力自体は捨ててる。

&& : || exit 0

A && B || C とすることで三項演算子っぽくしている。

: は何もせずに終了ステータス0を返す。

「エラーが初期化エラーだったら何もしない」「エラーが初期化エラー意外であれば exit 0 」という風にしている。

参考

マスタによくある適用開始日と終了日の命名

TL;DR

RDB でのマスタ系によくある「適用開始日」「適用終了日」の命名ってどんなのがいいだろうかって考えた。

  • activateddeactivated
  • enableddisabled

あたりがよさそう。

created modified みたいなカラム名を使うようなら特に。

その他の考えたやつ

  • apply start dateapply_end_date
    • どこかで見たことある記憶
    • 直訳感
  • effective date とか validity date
    • 有効期限、って感じ
    • 悪くはないけど、開始日の方をどう表現するか悩ましい
      • effective start date
  • expire date
    • 単語的にはよく目にするけど、これも開始の方が難しい
    • inspire date なんて言い回しはないよね多分

他にいいアイディアがあったら教えて下さい。

「現場で使える Ruby on Rails 5速習実践ガイド」を読んだ

タイトルの通り、非常に実践的な本。

入門的な内容も多いが、他の言語やフレームワークをやってきた人が取っ掛かりにするのも良さそう。

後半には Rails に留まらず、チーム開発のやりかたなどにも言及している。
さすがに自分は流し読みだったけど、必要な人には役立つと思う。

CakePHP3 のテストで Fixture を bake する #cakephp

TL;DR

Fixture を bake する際のテンプレ

bin/cake bake fixture \
  --records \
  --schema ${テーブル名} \
  --count ${レコード数} \
  --conditions "${WHERE句に書くような条件}"

--records

( test ではなく) default のデータベースを元にテスト用レコードを Fixture に自動生成してくれる。

--connection を合わせて使えば、 default 以外のデータベースを生成元にもできる

--schema

生成元のテーブル名を指定する。

--count

生成するレコードの数を指定する。

デフォルト値が 1 なので、複数レコードを生成したい時は指定する。

--conditions

生成元のレコードを絞り込める。

例えば --conditions "sex = 'male' AND age > 20" みたいなことができる。

id in (SELECT id FROM....) のようにサブクエリを活用すれば、関連レコードでの絞り込みも可能。

補足

詳しくは bin/cake bake fixture --help する。

参考

kojirooooocks.hatenablog.com

「実装パターン」を読んだ

実装パターン

実装パターン

  • 作者:ケント・ベック,Kent Beck
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2008/12/22
  • メディア: 単行本(ソフトカバー)

いつだったか前職の Slack で話題にあがっていて、目次を見るだけで名著の雰囲気が出ているし、ケント・ベックだしということで手に取った本。

ピアソンの技術書なので、中古で購入したのだが中々いいお値段だった(しかしその価値はあったと思う)。

タイトルの通り、かなり具体的なプログラムを書くうえでのプラクティスとか作法みたいなものが多く紹介されている。

ただ自分はそれ以上に、プログラミングへのメッセージとか心構えみたいなものを感じた。

プログラミングは結局のところ、コミュニケーションなのだと思う。

未来、それもそう遠くない未来に、自分のプログラミングに手を入れる人への手紙みたいなものなのだ。

それは隣の同僚かもしれないし、まだ見知らぬ新しいメンバーかもしれないし、明日の自分自身かもしれない。

「可読性を大事に」みたいなことはよく言われるけど、言い方を変えれば「次にプログラムを触る人へメッセージが伝わるように」っていうことなんだろうと思う。

そんなことを感じさせてくれた本でした。

刺さる文がてんこ盛りだったんだけど、まえがきがエモすぎて突き刺さったので引用しておく。

たとえ最新の注意を払ったコード作成から長期的な経済効果が得られないのだとしても, それでも私はできるだけよいコードを書こうと心がけるだろう. 70年の人生は, 20億秒を少し超えるにすぎない. 誇りの持てない仕事で無駄にする時間はない.

「実装パターン」読書メモ · GitHub

CakePHP3 で Migration を途中からやる #cakephp

概要

CakePHP3 で DB の構成管理を行っているが、何らかの事情でプレーンな環境で migrate できない場合の現実的な回避策としてのメモ。

プロダクションでは利用されているが、十分に開発環境で運用されていない場合などを想定。

現時点での dump を取得する

mysqldump で現在の DB を持ってくる。

--no-data で、定義のみ取得するようにしている。

mysqldump ${DATABASE} -p \
  --result-file=dump.sql \
  --column-statistics=0 \
  --no-data \
  --user=${DB_USER} \
  --host=${DB_HOST} \
  --port=${DB_PORT}

dump を元に新しい DB を構築する

mysql -h ${DB_HOST} -u ${DB_USER} -p ${DATABASE} < dump.sql

mark_migrated する。

mark_migrated コマンドは、指定したバージョンまで Migrate したことにする ことができる。

なので、 migrate 現時点の最新までは実行済にしてしまう。

bin/cake migrations mark_migrated --target=XXXXX

--target で特定のバージョンを指定できる

ちなみに Migration を全く利用していなくて途中から始める場合には migration_snapshot を使うとよさそう。

移行は migrate する

これで migration は騙せるようになったので、移行のバージョンについては通常通りに運用していけばよい。

bin/cake migrations migrate

補足

Cake2 の document では mark_migrated コマンドについて記載があるのに、 Cake3 にはない。

phinx プラグインの doc にもない。

bin/cake migrations help mark_migrated すれば出てくるので、特に deprecated というようなことはなさそうだけど、なんでなんだろ?

教えてもらった。

下記を参照すればよさそう。

https://book.cakephp.org/migrations/2/en/index.html

参考