📦

Devboxが普段の開発業務に使えるか調べてみた...が...

2022/12/24に公開

この記事は、CyberAgent PTA Advent Calendar 2022の23日目の記事です。
遅刻しました。ごめんなさい!

社内のSlackでPublickeyさんのDevboxの記事がシェアされていたのをきっかけに、普段の開発に使えないかなーと思い少し試してみました。

結論

から言うと、現時点ではバックグラウンドサービスの機能がまだMySQLに対応していなかったりで、そのままは使えません。

devbox.jsonに載せた依存関係を元にDockerfileを作ってくれるという機能もありますが、メインのサーバーアプリケーションもGoだったり、依存関係で欲しいのはMySQLやフロントのビルド環境であるNode.jsだったりするので、必ずしもポータブルに持って行けるものではないな、という感じです。

とは言え、現在はローカルの開発時にDockerでAmazon Auroraの代わりにMySQLを起動したり、Amazon Athenaの代わりにPresto(!!)を起動したりしているので、この辺がローカル環境を汚さずに、且つ、チーム内でバージョンを統一しながら使えるのは魅力的かも、という印象です。

Devboxとは

DevboxはJetpack Technologies社が社内で開発していたツールで、分離されたシェル環境と開発環境を提供するものです。
ツールのバックエンドでは、LinuxのディストリビューションであるNixOSのパッケージマネージャであるNixが利用されています。

今回Publickeyさんの記事で紹介されていたバージョン0.2.0では、いままでアーリーアダプターからわかりづらいとされていたこのNixのインストールが自動化されたこと、バックグラウンドサービスのプラグイン機能が提供された、というのが目玉のようです。

それでは、早速使ってみましょう。

Devboxのインストール

ドキュメントが綺麗にまとまっているので、それに従えば普通に使えそうです(フラグ)。
※一度試してからスクショ撮るためにやり直しているので、途中は少し省略します。

とりあえず定番、ワンライナーでインストールします。

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

Installing...

デフォルトだと/usr/local/bin以下にバイナリを書き込むので、sudo権限が要求されます。

サクッとスムーズにインストールできました。

Devbox環境の作成

普段のプロジェクトでやろうと思ったのですが、結論の通りまだ活用できないので、今回は空っぽのプロジェクトで使い始めます。
言語はとりあえずGoでいいでしょう。

Devbox init...

こんな一連のコマンドで、まず設定ファイルであるdevbox.jsonを準備します。

続いて、Goをインストールしましょう。せっかくなので、Go 1.19をインストールします。
...一応ローカル環境では、asdfを使用してGo 1.18をインストールしていますが...。

Installing Go

こんな感じです。簡単ですね。

Devboxのシェル環境を起動

それでは、Devboxが提供する分離されたシェル環境に入っていきましょう。

Dive into shell...

...。
なんか、参考にした他の記事だと(devbox)ってプロンプトに付くはずだが...?

Go 1.18

適用されてない

遅刻しているしあんまり引っ張ってもアレなので、原因を書くと、ちょうど使用していた業務PCがリースの交換期限となっていて、こちらの記事を参考に、暫く使っていたfishの環境からzshに戻ろうと構築していたのが影響していました。

動かない原因は...

Devboxの分離されたシェル環境の構築は、下記の関数を起点に始まっています。

https://github.com/jetpack-io/devbox/blob/76d75a7f5e3ebd0aaed66a4c3f16f421a87708e1/internal/nix/shell.go#L60-L103

そもそも参考にさせていただいた記事で.zshrc~/.config/zsh/.zshrcに置いていたり、その場所に.zshrcを配置するために環境変数ZDOTDIRを使っていたりで、それがDevboxの分離シェル環境の構築を阻害していました。

https://github.com/jetpack-io/devbox/blob/76d75a7f5e3ebd0aaed66a4c3f16f421a87708e1/internal/nix/shell.go#L255-L256

https://github.com/jetpack-io/devbox/blob/76d75a7f5e3ebd0aaed66a4c3f16f421a87708e1/internal/nix/shell.go#L371-L401

時間がなくて、完全にコードを読めていないものの、最初の引用した関数を見る限り.zshrcのパスをオプションで渡せそうに見えるため、解決策はありそうです。

ZDOTDIR以外にも問題があり、いずれにしても時間がないので、今回は復元可能と言うことでまっさらにして話を進めましょう。

改めてDevboxシェル環境に入る

さて、改めてDevboxのシェルを起動します。

Devbox shell

今度は上手くいきましたね。

direnvを併用する

こちらもドキュメントに記載がありますが、ディレクトリごとに環境変数を設定してくれるdirenvというツールがあります。
普段リポジトリのルートでGOBINなどのパスを設定するために使っていたりするのですが、これを使うとdevboxシェルを起動せずに、PATH設定だけ適用するということも可能です。
direnvのインストールについては割愛します。

ドキュメントに従い.envrcを書いて保存しましょう。

use_devbox() {
    watch_file devbox.json
    eval $(devbox shell --print-env)
}
use devbox

このファイルを保存し、direnv allowとコマンドを打つと...

Using direnv

このような形で、ディレクトリに入るだけでパスを書き換え、インストールしたパッケージのコマンドなどを使えるようにしてくれます。

実際の環境で使えるのか

Devboxにはサービスという機能があり、PostgreSQLやnginxなど対応しているパッケージであれば環境内で起動することが可能です。
とはいえ、バージョン0.2.0では対応しているサービスも少なく、MySQLも利用できないため、現時点では我々が必要としている環境の構築は難しそうでした。

今後このサービスを利用するためのプラグインは拡充予定、ということなのでひとまずはそれを待ちたいと思います。

現在はMySQLやPrestoの環境をMac上のDockerで動かしているので、開発中にVM上でLinuxを動かすリソースなどを食われてパフォーマンスに影響が出ることも多々あるので、こういったDockerを使用しないソリューションは、それだけで魅力的に感じるところです。
※サイバーエージェントグループでは、エンジニア、クリエイター向けにはかなりハイスペックなMacを提供してくれていますので、マシンのスペック不足ということはないです!

さいごに

新しく出てきたものや、新しい知識はやっぱり活かせるのならばすぐ使いたくなるものではありますが、実際にはなかなかそう上手くは運ばないものです。
今回のように、ある程度自力でトラブルを解決できる必要も出てきますので、胆力も必要になります。

Devboxについては、有限なローカルリソースを上手く活用できる可能性があるので、それこそコントリビュートしてもいいかなぐらいの感じでいます。

普段の業務に於いてOSSにはとてもお世話になっているので、少しでも貢献をしていきたいところですね。

Discussion