見出し画像

そろそろnoteの開発機をM1Mac対応にした軌跡を残しておく

アフターアドベント2日目

M1 Macにnote開発環境を構築する事になった

入社日、IntelMacを支給されて、新しいチームで開発をするぞー!と思っていたのもつかの間、入社オンボーディングで目の前に準備されたMacを見るとM1であった。新しいMacを使える喜びとともに、はたしてこのMacに環境構築して動くのだろうか?と不安になった。
メンバーに聞くとnote開発環境がM1 Mac上で動かないという話から
突然環境を作らないとやっていけない状況に置かれた話。

環境確認

noteは大きく分けるとサーバサイドとフロントエンドサイトの二つのプロジェクトを同時に起動して開発する必要があった。

フロントエンド

フロントエンドの部分はnode v16のインストールによって、M1 Mac上でネイティブに起動させる事が出来た。

サーバサイド

サーバサイドはDockerで環境を立ち上げる方法があったのでDockerを準備し、
まずは状況を確認するために環境をそのまま起動してみると、落ちる。
なにが落ちるかってRedisが落ちるんですね。

[g@M1Max note (develop)]$ dc up db redis app
[+] Running 0/2
 ⠙ db Pulling                                                                                                                                                        5.1s
 ⠿ redis Error                                                                                                                                                       5.1s
no matching manifest for linux/arm64/v8 in the manifest list entries

Redisを単体で立ち上げてみる

[g@M1Max note (develop)]$ dc up redis
[+] Running 7/7
 ⠿ redis Pulled                                                                                                                                                     20.7s
  〜〜〜〜
[+] Running 2/2
 ⠿ Volume "xxxx_bundle-install"  Created                                                                                                                             0.0s
 ⠿ Container xxxx_redis_1        Created                                                                                                                             0.1s
Attaching to redis_1
〜〜〜
redis_1  | 1:M 10 Jan 2022 08:28:47.790 # Server initialized
redis_1  | 1:M 10 Jan 2022 08:28:47.791 * Ready to accept connections

OKそう
タイミング的に何かが引っかかって落ちたんだろうと思う。

MySQLを単体で上げてみる

次に、MySQLを単体起動

[g@M1Max note (develop)]$ dc up db
[+] Running 0/1
 ⠹ db Pulling                                                                                                                                                        5.1s
no matching manifest for linux/arm64/v8 in the manifest list entries

MySQLがダメそう
当時使用していたMySQLのバージョンだとlinux/arm64に対応したDockerイメージがないとの事で、公式にも書いてありました。
mariadbはarm64のイメージもあるので、バージョンが若干ずれるが
試しにmariadbを使ってみる

diff --git a/docker-compose.yml b/docker-compose.yml
index 72ad7cd798..d3ff677ca6 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,7 +1,7 @@
 version: '3'
 services:
   db:
-    image: mysql:x.y.z
+    image: mariadb:x.y.z

mariadbを起動

[g@M1Max note (develop)]$ dc up db
[+] Running 12/12
 ⠿ db Pulled                                                                                                                                                        47.5s
   ⠿ xxxxxxxxxxxx Pull complete                                                                                                                                     14.4s
   〜〜〜〜
[+] Running 1/1
 ⠿ Container xxxx_db_1  Created                                                                                                                                      0.2s
Attaching to db_1

OKそうに見える

[g@M1Max note (develop)]$ docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS                    NAMES
xxxxxxxxxxxx   mariadb:x.y.z     "docker-entrypoint.s…"   3 seconds ago   Up 2 seconds   0.0.0.0:3306->3306/tcp   xxxx_db_1
xxxxxxxxxxxx   redis:latest      "docker-entrypoint.s…"   3 seconds ago   Up 2 seconds   0.0.0.0:6379->6379/tcp   xxxx_redis_1

redisとdbが起動したので、app本体を起動

[g@M1Max note (develop)]$ dc up app

〜〜〜〜

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
[+] Running 3/0
 ⠿ Container xxxx_redis_1  Running                                                                                                                                   0.0s
 ⠿ Container xxxx_db_1     Running                                                                                                                                   0.0s
 ⠿ Container xxxx_app_1    Created                                                                                                                                   0.1s
Attaching to app_1

お、意外と起動してそう

root@xxxxxxxxxxxx:/app# uname -m
aarch64

M1対応イメージで動いているっぽい。

root@xxxxxxxxxxxx:/app# bundle install
〜〜〜〜
Bundle complete! 210 Gemfile dependencies, 441 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

bundle installも完了してる
rails sしてみる
トップページは表示出来た

rspecしてみる

root@d3dbede19bfb:/app# rspec

Randomized with seed 45604

〜〜〜〜

*** stack smashing detected ***: <unknown> terminated
Aborted

Aborted!!!
よくよく追っかけて見ると
= > mini_racer(libv8-node)が落ちる
mini_racerのバージョンを上げる事でM1 Mac上では起動するようになるが
そうするとIntel Mac上で起動しなくなる
解決方針
双方の環境が混在している状況になるため、Intel MacでもM1 Macでも動く環境の構築を目指す
両方対応が難しかった原因はBundlerのバージョンが古いことで複数環境対応が出来ていなかったため
⇒ bundlerのアップデートで環境問題はクリア(Dockerで起動する前提)

rspecで落ちる(その2)

〜〜〜〜
     
       expected: {"human"=>"26 years ago", "iso"=>"1995-08-14T00:00:00-04:00", "timestamp"=>808372800}
            got: "{\\"human\\"=>\\"26 years ago\\", \\"timestamp\\"=>808372800, \\"iso\\"=>\\"1995-08-14T00:00:00-04:00\\"}"
     
       (compared using ==)
     
       Diff:
       @@ -1,4 +1,2 @@
       -"human" => "26 years ago",
       -"iso" => "1995-08-14T00:00:00-04:00",
       -"timestamp" => 808372800,
       +"{\\"human\\"=>\\"26 years ago\\", \\"timestamp\\"=>808372800, \\"iso\\"=>\\"1995-08-14T00:00:00-04:00\\"}"

hash型で欲しいテスト結果がstringで帰ってくる不思議現象

解決方針
mariadbの設定か何かでクリア出来そうな気もするが、本番に合わせる意味合いで
そっちを調査するよりはMySQLで環境が作れた方が良さそう

⇒結果
MySQLをソースコードからコンパイルしたDockerイメージを作成する
MySQLをソースコードからコンパイルするようにDockerfileを作成
マルチプラットフォーム対応にしたイメージをDocker hub(and aws ECR)にプッシュする事で
同じイメージをpullしてもIntel MacとM1 Macで起動する状態を構築したい
ということで、Intel Mac、M1 Mac両方とも使えるDockerイメージをpushしてMySQL環境を起動出来るようにする

nokogiri問題

ひとまず新しくコンパイルしたMySQLも順調に起動し、rspecはクリアできそう、と思ったのもつかの間、今度はnokogiriを使う部分で落ちる。
nokogiriのバージョンが古いために落ちているようだったので、上げようとするも、上げるためにはDockerfileの中でFROMで指定しているイメージのOSを上げる必要がありそう。
うーんruby:2.x.yのイメージで、bullseyeのバージョンのイメージは公式にない。

うん、作ろう!

という事で、こちらもMySQLと同様にOSのバージョンがbullseyeの物をベースにした2.x.yのイメージを独自に作ってこちらを使用するようにしました。

OSもbullseyeになったし
やっとnokogiriのバージョンアップもする事が出来まして
M1Macで無事サーバサイドを起動する事が出来ました。


この記事が気に入ったらサポートをしてみませんか?