Slide 1

Slide 1 text

巨大なRailsアプリケーションを 「普通」にするための取り組み 2019/02/06 Repro Tech Meetup @hokaccha

Slide 2

Slide 2 text

自己紹介 •@hokaccha •Cookpad Inc. •Nodebrew, Adventar, Bdash

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

3BJMTʹͳͬͯ೥Ҏ্͕ܦա

Slide 5

Slide 5 text

•コードを変更すると意図しないところが壊れる。例えばウェブサービスをいじるとガラケーの認証が壊れる。 •ライブラリが古かったとしても依存が多すぎて気軽に更新できない。 •実行環境が非常に複雑かつ特殊で、迂闊にデータベースを追加したりできない。 •普通のツールが動かない。例えばコードカバレージが取れない、並列テストが動かない。 •ObjectクラスやStringクラスのような非常に基本的なクラスが改変されており、普通の動きをしない。 •あるコードのオーナーが誰かわからない。例えばuserリソースのAPIを変更したくても誰にも相談できない。 •開発者が多すぎて、改善系のpull requestを作ると頻繁にコンフリクトする •I/Oの激しいシステムを追加するためにDynamoDBを使いたいと思ったとしても、 AWS-SDKのバージョンが古いのでまずは SDKのバージョンを更新するのに1ヶ月かかる •テストが遅いので検証にも時間がかかり、そのあいだに別のpullreqがマージされてコンフリクト •実装を進めていくと既存のクラスに変更が必要そうなことがわかってきたがオーナーが誰かはわからない •がんばって実装してみたが触ってもいないバッチのCIが通らない •ようやく理由がわかって直してデプロイしたらなぜかガラケーサイトが落ちた •etc................... IUUQTUFDIMJGFDPPLQBEDPNFOUSZPEBJCBTUSBUFHZΑΓൈਮ

Slide 6

Slide 6 text

普通のRailsに戻りたい

Slide 7

Slide 7 text

改善プロジェクトの発足 •2017年に @aamine が立ち上げ、お台場プロジェクト と名付けられる •コツコツとやってきてようやく成果が出始めてきた •今年から専任でやるチームとして分離したのでさらに 加速する予定

Slide 8

Slide 8 text

お台場プロジェクトの取り組み •システム分離 •機能削除 •コード削減 •レガシーシステムからの脱却 ← 今日の話はこれ

Slide 9

Slide 9 text

ここで言うレガシーとは •社内外問わずクックパッドのレシピサービス以外では
 ほぼ使われていないシステムやライブラリ •学習コスト、メンテナンスコストともに高い •最新の機能やエコシステムの恩恵を受けられない

Slide 10

Slide 10 text

今日の話 •Machinist を FactoryBot に置き換えている話 •RRRSpec をやめた話 •hako 化している話

Slide 11

Slide 11 text

Machinist → FactoryBot

Slide 12

Slide 12 text

Machinist とは •テストの用のデータを作るためのライブラリ •5、6年前にメンテナンスが止まった •レシピサービスではずっと Machinist 1系に
 モンキーパッチをあてながら使っていた

Slide 13

Slide 13 text

@amatsuda 曰く 「断言しますが、Rails 4.2 と一緒に Machinist 1 を使ってい るプロジェクトは世界中でもこのプロジェクトだけのはず」

Slide 14

Slide 14 text

FactoryBot •テストデータ作成系ではデファクトスタンダード
 なライブラリ •クックパッドでもレシピサービス以外は
 FactoryBot(or FactoryGirl)を使っている

Slide 15

Slide 15 text

移行したいが Machinist
 で書かれた大量のコードどうすんの...

Slide 16

Slide 16 text

Machinist Recipe.blueprint do title { 'recipe title' } description { 'recipe description' } user { User.make } end Recipe.make(title: 'foo')

Slide 17

Slide 17 text

FactoryBot FactoryBot.define do factory :recipe do title { 'recipe title' } description { 'recipe description' } user end end FactoryBot.create(:recipe, title: 'foo')

Slide 18

Slide 18 text

‼いけそう‼

Slide 19

Slide 19 text

移行手順 •FactoryBot が Machinist の文法を喋れるようにする ラッパーを作る •Machinist の定義(blueprints)を FactoryBot の定義 (factories)に置き換える •Machinist 互換レイヤーを撤去

Slide 20

Slide 20 text

進捗 •@amatsuda がほぼ一人で進めてくれている •新規のテストは FactoryBot で書ける状態 •古い Machinist のコードを順次書き換えていってる中

Slide 21

Slide 21 text

RRRSpec

Slide 22

Slide 22 text

背景 •1台のマシンで並列でテストを実行しても数十分かかる (当時の現実的なマシンスペックで) •テストの実行時間を10分以内に抑えたい •コストも最小限に抑えたい

Slide 23

Slide 23 text

RRRSpec •複数台で並列に RSpec を実行できる
 分散テスト実行システム •実行するマシンはスポットインスタンスを使い
 自動でスケールされる •スポットインスタンスが途中で落ちたときのための
 リトライ機構なども備えている

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

時は流れ •高性能なスペックのマシンが安価になってきた •SpotFleet などの環境も整ってきた •コードもがんばって減らしてる •RRRSpec なくしてもいけるんじゃない?

Slide 26

Slide 26 text

やってみた •c5.2xlarge 8並列: 約22分 •c5.4xlarge 16並列: 約11分 •c5.9xlarge 32並列: 約7分

Slide 27

Slide 27 text

‼いける‼

Slide 28

Slide 28 text

というわけで RRRSpec 引退 •c5.9xlarge(スポットインスタンス)で36並列で実行 •並列実行には parallel_tests を利用 •開発環境でのテスト実行は pull-request Builder で代替 •安定化のために rspec-retry を利用

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

hako化

Slide 31

Slide 31 text

現在のデプロイ •sorah/mamiya ‣ serf を利用した高速でスケーラブルなデプロイツール ‣ CI 中にパッケージ作成や配布などの処理を行う ‣ CI が通って開発者がデプロイを実行したときは切り替えを行うのみ

Slide 32

Slide 32 text

•Dockerの登場によりデプロイのフローは大きく変わった •クックパッドでもほぼすべてのアプリケーションが
 Docker/ECSで動いている 昨今のデプロイ

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

hako •Dockerコンテナのデプロイツール ‣ 現在は ECS のみに対応 •クックパッドではほとんどのアプリケーションが
 hako でデプロイされている •ただしレシピサービスを除く

Slide 35

Slide 35 text

hakoに乗ると • 統合された管理コンソールが使える • Dockerを利用したバッチジョブの実行ができる • 用意されている様々なサイドカーコンテナが利用できる • などなど、他にも便利な機能に乗っかれる ‣ 逆にいうとhakoに乗らないとこれらを独自で作る必要がある

Slide 36

Slide 36 text

hako化への道のり •symlink が大量にあって docker build がつらい ‣ rsync --copy-links で乗り切る •Spreadsheetで管理されていた秘匿値の移行 ‣ がんばって Parameter Store に移行 •古の fluentd の設定を読み解く •一部のサーバーでcronが動いてたりする

Slide 37

Slide 37 text

進捗 •バッチが一部 hako で動くようになった •API サーバーがもうすぐ動きそう •今年中には全アプリケーション移行予定

Slide 38

Slide 38 text

まとめ

Slide 39

Slide 39 text

No content

Slide 40

Slide 40 text

次回予告 (3/23 Railsdm) •システム分離 •機能削除 •コード削減

Slide 41

Slide 41 text

We are hiring!