社内向け技術文書 engineering

ローカル開発環境の構築をMItamaeとfabricで自動化・共通化する

社内向け技術文書 engineering

こんにちは。EC事業部のチーフテクニカルリード(CTL)のけんちゃんくんさんです。この記事の公開日である6/21は私の誕生日です!おめでとう!私!!1

さて、本記事ではEC事業部で開発・運用を行っているサービスである カラーミーショップ のローカル開発環境の構築方法について紹介します。

現在のカラーミーショップの開発環境とその課題

カラーミーショップの全ての機能を利用するためには、10以上のリポジトリにあるコードが必要となっており、またリポジトリ毎に使っている言語も必要なミドルウェアも異なります。それらをローカルで開発するための環境として、VirtualBoxやVagrantで作成したVMをPuppetでプロビジョニングしたものを利用していました。しかし、最近は一部のロールのコンテナ化も進めており、ローカルでの開発に必要なミドルウェアは増えてしまっています。

また、エンジニア以外(主にデザイナー)の開発環境の構築とそのメンテナンスも課題となっていました。環境構築のドキュメントはあるものの、個々の開発ツールのインストール方法やディレクトリ構成は、配属されたチームやメンターに依存してしてしまっていました。これにより、チームが変わったときはもちろん、なんらかの影響で動かなくなってしまったときのトラブルシューティングに時間が取られることも少なくありませんでした。

MItamaeとFabricで開発環境構築を支援

これらの課題を解決するために、カラーミーショップでは MItamaeFabric という2つのツールをそれぞれの特性に合わせて利用しています。

MItamaeによるマシンの初期セットアップ

MItamaeは、構成管理ツールである Itamae のmruby実装です。mruby-cliを利用したシングルバイナリとして提供されているため、バイナリを落してきて実行するだけでよいという特徴があります。その特徴を利用し、開発ツールやミドルウェアのインストールなど、マシンの初期セットアップに近い部分を担当しています。

実行方法やディレクトリ構成などは、作者であるk0kubunさんの dotfiles を参考にしつつ、 bin/setupを叩くことで mitamae のバイナリダウンロードから実行までを行うようにしています。MItamaeに関するファイルのざっくりとした構成は以下のようになっています。

├── bin
│   └── setup
├── cookbooks
│   ├── docker
│   │   └── default.rb
│   ├── ghq
│   │   └── default.rb
│   ├── homebrew
│   │   └── default.rb
│   ├── mysql
│   │   └── default.rb
│   ├── node
│   │   └── default.rb
│   ├── python
│   │   └── default.rb
│   ├── redis
│   │   └── default.rb
│   ├── ruby
│   │   ├── default.rb
│   │   └── files
│   │       └── default-gems
│   └── vagrant
│       └── default.rb
├── recipe.rb
...

カラーミーショップの開発者の多くはMacを利用しているため、全体的にMacに特化したレシピになっています。まずはじめにHomebrewをインストールし、Homebrewを使って他のものをインストールします。せっかくなので、レシピの中身を少し紹介します。

Rubyのレシピは、実際にはrbenvとruby-buildをインストールし、それらを使って必要なRubyのバージョンをいくつかインストールするようになっています。また、ghqのレシピではインストールするだけでなく、ghq.root~/src に設定しています。

以前は、トラブルシューティングなどで他人の開発環境を触る際に、言語処理系やミドルウェアのインストール方法やディレクトリ構成の違いで余計に時間がかかってしまうことも少なくありませんでした。MItamaeによって、この部分を共通化するだけでもそれなりに効果があったように感じています。

Fabricによる開発環境のセットアップと日々の運用

Fabricは、シェルのコマンドを簡単にラップできることから、複数のリポジトリにまたがる開発環境のメンテナンスを行うためのコマンドを用意したり、複雑なコマンドをラップして簡略化するのに利用しています。

前述の通り、カラーミーショップの全機能を動かすためには複数のリポジトリにあるコードが必要になります。初めてカラーミーショップの開発に参加するパートナーは、全てのリポジトリを忘れずにcloneしなければなりません。また、それらすべてを最新に更新しつづけることは、開発に関わる全てのパートナーが毎日、場合によっては何度も行う作業です。こういった日々の煩雑な作業や、ドキュメント化されており自動化可能なものを積極的にコードに落していくため場所として、Fabricのタスクを利用しています。

これにより、1コマンドですべてのリポジトリに最新版に更新できるようになったり、VMとDockerを組み合わせて動作させる手順が簡略化されたりと、特にデザイナーの開発環境の維持コストが大きく削減できました。

おわりに

開発環境の構築・メンテナンスをコード化することで、カラーミーショップの開発環境構築のコストや、日々の開発環境の維持コストを削減することができました。実際、開発環境の初期構築は3コマンド程度で完了するようになっています。また、環境をある程度共通化することで、個人の環境で問題が起きた場合のトラブルシューティングにかかるコストも削減にも効果があります。

一方で、現在のカラーミーショップの開発環境が理想的な状況でないため、こういった仕組みが必要になってしまっているという考え方もできるかと思います。しかしながら、たえまなく進化しているソフトウェア開発の現場においては、常に課題を発見し、それをエンジニアリングで解決し続けることが大切です。もし何気なく繰り返してしまっている定常業務や一時的なハックがあれば、それらを言語化しコードで解決してみましょう。その繰り返しによって、日々の仕事がどんどん「もっとおもしろく」なっていくと信じています。