LayerX の Enabling Team でソフトウエアエンジニアをやっている suguru です。LayerX Tech Advent Calendar 2022 の 12/12 のの記事になります。 今日は、入社して最初に開発した社内ツールの話をしようと思います。
LayerX のバクラク事業部では、バクラク請求書、バクラク申請・経費精算、バクラク電子帳簿保存、バクラクカードなど、複数のプロダクトを運用しています。
內部のアーキテクチャとしては、プロダクトごとに独立したAPIが環境で稼働しており、プロダクト間連携は、お互いの Private API を通じて連携しています。そのため、バクラクの開発用環境をローカルで構築するには、複数のプロダクトのAPIサーバーを稼働させる必要があります。
バクラクのサービスアーキテクチャについては、下記のスライドを参照してください。
お客様に対して、バクラクになるサービスを提供しているのですが、一方で開発者もバクラクに開発できるべきだと思っています。開発においては、下記のような課題がありました。
- ローカル開発をする際に、複数プロダクトのAPIやwebサーバーを起動しなければならない
- 必要な複数のリポジトリを Clone し、データベース等のセットアップを行う必要がある
これはいわゆる、エンジニアオンボーディングの課題でした。エンジニアが入社後に開発に取り掛かる際に、必要なセットアップやサービスの情報などです。
エンジニアオンボーディングの中でも、ローカル開発環境の準備は大変な作業だったとしても、一度立ち上げて慣れてしまうと、そこまで手を煩わせるものではないので、ドキュメントが不足していたり、手順が属人化していたり、メンターの手厚いサポートによって成り立っていることが多いと思います。
そこで、社内ツールを作ってエンジニアオンボーディングをよりスムーズにできることを目指すことにしました。
初期セットアップのためのシェルスクリプト lx.sh
まず準備したのは、lx.sh
というシェルツールです。lx.sh は、プロジェクト開発のための初期環境構築や、開発時のオペレーションを簡単に実行するためのシェルツールです。シンプルなシェルなので、エンジニアがマシンを入手し、このシェルを含むリポジトリをクローンしてすぐに使うことができます。
また、複数のリポジトリにまたがったオペレーションなどを自動化します。例えば、全てのリポジトリを Git から pull して最新にしたり、などです。以下は、実際に lx.sh を実行した際の出力例です。
./lx.sh usage: lx.sh <command> [options] commands: bootstrap Launch setup scripts for setup local development tools <install/upgrade> Install/Upgrade required tools in local machine git <clone|pull|branch> Run git operations for all repositories branch Print current branch name of all repositories init <env|db> Initialize local setup. It runs all without subcommands. docker <start|stop> Start middlewares with docker compose ...
シェル内でのコマンド振り分けは、シンプルなシェルスクリプトで構成しています。以下は参考までにコマンド振り分けの実装部分の一部抜粋したものです。
while (("$#")); do case "$1" in -h | --help) usage exit 1 ;; tools | bootstrap | git | dev | docker | init | git | branch | tool) cmd=$1 shift ;; create | start | stop | pull | clone | branch | db | env | install | upgrade) subcmd=$1 shift ;; *) break ;; esac done .. bootstrap() { .. } .. case $cmd in bootstrap) bootstrap ;; tools) case $subcmd in install) tools-install ;; upgrade) tools-upgrade ;; *) ..
エンジニアが、 lx.sh bootstrap
を実行するだけで、ローカル開発に必要なツールを brew
や go install
などを実行し、自動的にインストールします。また、開発に必要となるリポジトリを一括クローンし、所定のディレクトリ構成に配置します。さらに、各プロジェクトで必要になる初期設定、例えばDBテーブル作成など、を実行します。
このコマンドで、バクラクの開発に必要なソフトウエアや環境を一括でセットアップすることを目指しています。
専用プロセスマネージャー lxdev
次に作成したのは、 Go 製の専用プロセスマネージャです。バクラクでは、開発時にリポジトリをまたいで複数のサーバーを起動する必要があるため、エンジニアはディレクトリごとにコマンドでサーバーを起動し、ターミナルを複数開く必要がありました。
このサーバー起動を一括して行うためのプロセスマネージャを作成し、コマンド1つ、ターミナルウインドウ1つで開発に必要なサーバー群を起動・管理できるようにしました。 ターミナルでシンプルなUIを構築できる https://github.com/rivo/tview を使って実装しています。
docker-compose での管理も考えましたが、バクラクでは、ローカルでそのまま起動するほうがエンジニアの開発利便性が高そうだったので、プロセスマネージャによる管理にしました。プロセスマネージャは、各プロセスのログを見たり、再起動やコードエディタを開いたり、といった便利コマンドを実装し、単なるプロセスマネージャだけでなく、プロジェクト特有の問題解決を試み、利便性を高めています。
独自ツールのメリット・デメリット
こうした社内ツールは開発を便利にする一方、デメリットもあります。
- ツール自体がメンテナンスされなくなる可能性がある
- 各所で起こる開発手法のアップデートに追随する必要がある
- 各エンジニアの開発環境で、ツール自体の最新状態を保つ必要がある
こういったデメリットに対して、ツールをダウンロードして使うタイプではなく、monorepo 内にコードと共に配置し、皆がソースコードにアクセスしやすい場所に設置して、メンテナンス性と、最新状態を常に各エンジニアが持つということを維持できるようにしています。
ツールの今後
lx.sh
と lxdev
によって、開発のオンボーディングと、普段の開発の両方が、エンジニアにとって少しでも楽な方向に進んだかなと思っています。ツールは強制ではないので、個人の好みによって、使う・使わないの選択もすることができます。
開発用ツールは、日々アップデートされていますが、こんなのもあるといいな、ということで http://wails.io/ を使ったデスクトップアプリの開発を進めていたりします。このツールがあれば、開発のセットアップ、必要な情報や操作が一括して行えることを目指しています。
今回は、エンジニアオンボーディングと、ローカル開発を改善するツールの話をさせていただきました。引き続き、ツールのアップデートがあれば、このブログで共有していきます。