はじめまして、来年4月に入社するテクノロジー開発部の西塚です。
現在は在宅でインターンをし、自社在庫管理システムの「AXIS」の業務に携わらせて頂いております。日々わからないことだらけですが皆さんお優しく、楽しんで取り組めています。感謝!
CIガチャとは
さっそく本題に入りますが、CIガチャとはなんぞや?と思われた方が多くいらっしゃるかと。僕も最初「 CIガチャ」でググって何もヒットしなかったので混乱しました。
CIガチャとは「ローカル上でのテストは問題なく通っているがCircleCIで落ちてしまうエラー」を指すバイセル独自の略称です。命名者は不明ですがセンスがあり個人的に結構好きです。
原因
実際に僕が修正したCIガチャを例に上げさせて頂きます。
僕が担当した該当箇所はFactoryBotでテストデータを生成した際に、primary_keyが重複してしまいCIガチャが発生していました。CircleCIはファイルの実行順序がバラバラなため、一定の順序の場合のみ通るテストだとCircleCI上で生成されるテストデータが意図せず複数できてしまう。これが今回のエラー原因でした。
下記CircleCIテストエラー文
1
2
3
ActiveRecord::RecordNotUnique:
PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "hoge_pkey"
DETAIL: Key (id)=(1) already exists.
解決方法
FactoryBotで作成されるテストデータを絶対被らないであろうidに変更。
テストデータの重複が原因のため、シンプルに被らなければOK。該当箇所のidを1から1000に変更し解決!push後、5回ほどCIをRERUNしガチャが発生しなかったためリリース許可を頂けました。一安心。
コードを見た人が驚かないようにコメントも記述
1
2
3
# each.with_index(1)にした場合、Hogeの主キーが二重になってたまに落ちてしまっていたので大きめの数を記述しました
[hoge_1, hoge_2].each.with_index(1000) do |hoge, idx|
FactoryBot.create(
その他のCIガチャ原因
今回はデータの重複が原因でしたが下記理由でも発生するみたいです
・言語、パッケージのバージョンが異なる
・ローカルで正しいタイムゾーンが設定されていない場合
・ビルドコンテナでプロセスによるメモリの使用量が多すぎる場合の強制終了
・etc…
余談
CIガチャは計2回担当しました。
今回取り上げたCIガチャ修正は再発していないのですが、もう一つは昨日ガチャが再発したみたいです泣
昨日の今日でまだ解決できていないのですが、下記に行ったことをのせておきます。
エラー原因
primary_keyの重複
やったこと
該当ファイルのinclude_context 'with master data'を削除。
AXISではspecでテストする際にマスタデータを全て作成してくれるinclude_context 'with master data'があります。
include_context 'with master data'とFactoryBotで作成されたデータのprimary_keyが重複していたためCIガチャが発生していたと思ったのですが、CIガチャ再発...
しばらく起きなかったので完全に解決したと思っていましたが、まだまだですね
まとめ
そんな未熟者の僕でも優しく、時に厳しく接して下さる上司に恵まれインターンできています。本当にありがとうございます。贅沢すぎるいい環境です!
就活生でバイセルに興味がある方は今すぐ応募しましょう!