🐈

社内技術発表会のネタを書こうとしたら、どれも途中で挫折した話 (devbox編)

2023/01/21に公開

社内のエンジニア定例で持ち回りで技術ネタを発表するのですが、会社に入社してついに自分の番が回ってきたので、発表ネタを書こうとしたらどれも途中で諦める羽目になったのでその選定、断念した点をネタとしてまとめますorz
※と言いつつdevboxのことをまとめたら結構な量になったので一旦これだけで書きます

前提条件

オンプレ時代からローカルでWinで開発してても、どうせサーバ操作でCentOSなどを使うから開発環境も揃えてしまえ!でLubuntu12辺りから使い始めてます。特に開発マシンが持ち込みの時はLubuntu、Xubuntuを使っています。
docker全盛の今だと、特にMac/Winだと仮想環境上でDockerを動かす分のオーバーヘッドがあるのでUbuntuをホストにしてDockerを動かす方が快適。

余談

Ubuntuで4Kディスプレイを使おうとするとOS起動/レジューム復帰時に4kの認識失敗して、一度解像度を4kより落としてから、4Kの解像度に戻さないという罠が何故か半年以上前から解決できてないですが(ググるとこの事例がいっぱいある)

devbox

Kubernetes向けなどの開発ツールベンダのJetpack Technologiesが自社の開発でDocker経由のビルドが速度的にボトルにネックになることと、各開発者が開発環境整備に時間が取られるのを解決するために作ったツール。仕組みとしては、Node、npm、nodenvを組み合わせたようなパッケージ管理システムになる。devbox自体はdockerに対するdocker composeのようなラッパーで実態はnixosになる。
開発環境はPackage.jsopのようなdevbox.jsonでjson形式で定義されるので、githubなどでソース管理、開発者に配布できるので、開発者ごとに開発環境が微妙に違うということはなくなるはず。

試してみたら…

curl -fsSL https://get.jetpack.io/devbox | bash
mkdir devbox
cd devbox
devbox init

ここまでは、まぁ良い。
仕事で使っているNodeのまだ14系なので nixのパッケージ一覧 で探してみると、普通のNode.js v14じゃなくて、nodejs-slim-14_x ならあった。
https://search.nixos.org/packages?channel=22.11&show=nodejs-slim-14_x&from=0&size=50&sort=relevance&type=packages&query=Node

npmは6系なので今度はそれを…。
8.19.3しかない!

https://search.nixos.org/packages?channel=22.11&show=nodePackages.npm&from=0&size=50&sort=relevance&type=packages&query=nodePackages +npm
npmだけ上げても問題はない気がするがとりあえず入れてみる。

※nix的にはnpmは単独のミドルウエアパッケージではなくnodeのPackageの一種ということになっているので探す時にはnpmではなくnodePackagesで探す

ここまでの状態

~/git/devbox$ cat devbox.json
{
  "packages": [
    "nodejs-slim-14_x",
    "nodePackages.npm"
  ],
  "shell": {
    "init_hook": null
  },
  "nixpkgs": {
    "commit": "52e3e80afff4b16ccb7c52e9f0f5220552f03d04"
  }
}
# ローカルのnode、npmのVer.
~/git/devbox$ node -v
v14.16.1
~/git/devbox$ npm -v
6.14.12
# devboxで作った環境の入る
~/git/devbox$ devbox shell
Installing nix packages. This may take a while... done.
Starting a devbox shell...
# ローカルのnode、npmのVer.
(devbox) ~/git/devbox$ node -v
v14.21.1
(devbox) ~/git/devbox$ npm -v
8.19.3

続けてミドルウエアのMongoDB、Redis
MongoDBは4.2があったので問題なし

https://search.nixos.org/packages?channel=22.11&show=mongodb-4_2&from=0&size=50&sort=relevance&type=packages&query=MongoDB

Redisは最新の7系しかない!orz

https://search.nixos.org/packages?channel=22.11&show=redis&from=0&size=50&sort=relevance&type=packages&query=Redis

Devbox環境をDockerfile/devcontainerに変換する

コマンド1回でdevbox.jsonからDockerfileに出力してくれる

devbox generate devcontainer
cd .devcontainer/
cat Dockerfile
FROM alpine:3

# Setting up devbox user
ENV DEVBOX_USER=devbox
RUN adduser -h /home/$DEVBOX_USER -D -s /bin/bash $DEVBOX_USER
RUN addgroup sudo
RUN addgroup $DEVBOX_USER sudo
RUN echo " $DEVBOX_USER      ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers

# installing dependencies
RUN apk add --no-cache bash binutils git libstdc++ xz sudo

USER $DEVBOX_USER

# installing devbox
RUN wget --quiet --output-document=/dev/stdout https://get.jetpack.io/devbox | bash -s -- -f
RUN chown -R "${DEVBOX_USER}:${DEVBOX_USER}" /usr/local/bin/devbox

# nix installer script
RUN wget --quiet --output-document=/dev/stdout https://nixos.org/nix/install | sh -s -- --no-daemon
RUN . ~/.nix-profile/etc/profile.d/nix.sh
# updating PATH
ENV PATH="/home/${DEVBOX_USER}/.nix-profile/bin:/home/${DEVBOX_USER}/.devbox/nix/profile/default/bin:${PATH}"

WORKDIR /code
COPY devbox.json devbox.json
RUN devbox shell -- echo "Installing packages"
ENTRYPOINT ["devbox"]
CMD ['shell']
cat devcontainer.json
{
  "name": "Devbox Remote Container",
  "build": {
    "dockerfile": "./Dockerfile",
    "context": ".."
  },
  "customizations": {
    "vscode": {
      "settings": {},
      "extensions": [
        "jetpack-io.devbox"
      ]
    }
  },
  "remoteUser": "devbox"
}

Devboxへの個人的感想

  • Scala、Go、Rustのようなコンパイル言語でコンパイルに時間がかかる開発環境
  • RubyのようなMac上のDocker Desktop環境だとあからさまに動作速度が落ちる
  • 開発環境でRuby、Pythonその他色んな言語を多用しているのでローカル環境側の開発環境を整えるのが大変
    とかだったら有意義だと思う。

ただし、自分の場合

  • Ubuntu dockerで動かしているせいか、Dockerが遅いという風には感じていない

    • 仕事でビルドするのがAngular/ReactでUbuntu Docker上で開発速度の影響を感じてない
  • 仕事の開発環境がMEAN、MERNスタックでJavaScript/TypeScriptしか使っていないので開発環境整備がそこまで煩雑ではない(大半はNodeのPackage.jsonで管理出来てしまっているので)

  • devboxというかnixosのパッケージがまだ開発途中のプロダクトのせいか、ミドルウエアによってサポートしているVerが最新版のみのものが多い。プロダクト開発で古めのVer.を使っている場合に対応するものがなさそう。

  • とはいえdevboxもどんどんサポートするパッケージは増えているので新規プロダクト開発を行う時に念頭に入れて良さそう

    • 2022年12月末にdevbox 0.2.0が出た当時はMySQL,Redisがなかったそうですが、これを書いている2023年1月21日の0.2.2でMySQL、Redisのパッケージが出ているので期待はできそう。
  • generateで出力されるDockerfileを見るとalpineベースで1からベースパッケージを入れる形になっているので、ローカル環境以降の環境で使うにはDockerfileのチューニングが必要なので注意。

  • VSCodeのRemote Container環境用のdevcontainer.jsonも出力するので、github/codespacesで使えるのは嬉しいかもしれない。

  • 実開発、運用まで考えるとDevbox/devbox.jsonとDocker/docker composeの2重管理になる気がする(ローカル環境の設定で個人差でちゃうは良くあるので致し方なし?)

  • devbox generateの有意義はVSCodeのRemote Containerになるけど、それだとネーティブ環境上で開発環境を動かしたかったというdevboxを使う動機と正反対なことになるのであべこべな気がしなくもない。

おまけ

仕事で使っている環境でDockerコンテナにalpineを思いっきり使っているんですが、devboxで導入するパッケージを探しているうちに distroless、ubuntu+slim辺りの話に行き着いたので、仕事で使っている技術は定期的にアップデートしなきゃいけないなと思った次第。

Discussion