Devin's Machine を設定して Devin 自身にテストをやらせる
はじめに
最近 Devin を使った開発を積極的にするようになってきているのですが、Devin を使った開発で、なかなか成果を実感できない状況に悩んでいました。
特に、Devin が生成したコードの品質に悩まされ、CI でのテスト失敗に時間を取られることが多かったのです。
この記事では、Devin's Machine の設定を行うことで、どのように開発効率が改善されたかを実体験ベースで紹介します。
これまでの課題
Devin を使っても成果を実感できない
Devin を導入したものの、期待していたほどの成果を実感できていませんでした。主な課題は次のとおりです。
- 質の高くないコードの大量レビュー:Devin が生成するコードの品質が低く、レビューに多くの時間を費やしてしまいがち
- CI でのテスト失敗:Devin 自身が追加したテストが CI で落ちることが頻繁に発生
- 無駄な待機時間:CI の結果を待っている時間が積み重なり、開発効率が低下
なぜそうなっていたか
問題の根本原因を調査した結果、Devin がテストを実行しようとしていたものの、PostgreSQL に接続できずに失敗していたことが判明しました。
Devin は確かにテストを実行しようとしていましたが、Debin のローカル環境でのデータベース接続が正しく設定されていなかったため、テストが実行できない状態になっていたのです。これにより、Devin はテストの実行結果を確認できず、問題のあるコードをそのまま push してしまっていました。
解決策: Devin's Machine の設定
前提条件
この設定例では、Docker Compose を使用した開発環境を想定しています。
設定手順
1. Pull Latest Repo
おすすめの設定通りに設定します。これにより、最新のコードベースで作業を開始できます。
2. Configure Secrets
環境変数やAPIキーなどの機密情報を設定します。
今回はスキップしました。
3. Install Dependencies
Terminal を操作して設定します。
Terminal で実行した結果が snapshot として次回以降の起動時にも反映されるようです。
Terminal コマンド:
docker compose build
docker compose run --rm bundle install
docker compose run --rm bundle exec rails db:create
# 初回の migrate, データ投入
docker compose run --rm bundle exec rails db:migrate
docker compose run --rm bundle exec rails {インポートタスク}
4. Maintain Dependencies
起動ごとに依存関係をアップデートする設定です。Docker 構成は変わらない前提で設定します。
Commands:
cd ~/repo/repository-name
git submodule init && git submodule update # Pull Latest Repo に設定されているので不要かも
docker compose run --rm web bundle install
docker compose run --rm web bundle exec rails db:migrate
5. Setup Lint
Lint の実行方法を定義します。
Commands:
cd ~/repo/repository-name
docker compose run --rm web bundle exec rubocop
6. Setup Test
Test の実行方法を定義します。
このセクションでは固定のコマンドしか定義できませんが、今回のプロダクトでは全件テストをすると時間がかかりすぎるため、スキップしています。
7. Setup Local App
ローカルアプリの起動方法を定義します。
Text:
Run `docker compose up -d`.
The App will be available at `http://localhost:4000`.
8. Additional Notes
追加の情報(プロンプト)を定義します。
テストの実行はここで変更ファイルのみを対象に実行するように指示しました。
# テストの実行
テストを全件実行するとかなり時間がかかってしまうため、テストはタスク内に変更した app/ 配下のファイルのみを指定して実行してください。
テストの実行は以下の手順で行います。
1. docker compose up -d
2. docker compose exec web bundle exec rspec {path of test file}.
# Lint、テストの実行タイミング
Lint とテストは実装が完了し GitHub に push する直前に実行してください。
その結果修正が必要な場合は必要な修正を加え、Lint, テストがパスするまで修正を繰り返してください。
3回以上同じ箇所で失敗する場合は対応方針を再検討する必要があるので Lint, テストが失敗する状態で GitHub に push し、ユーザーに次の対応を確認してください。
結果
Devin's Machine の設定により、次のような改善が実現されました。
- オーダー通り push の前に最低限の lint, テストが実行される:Devin が自動的にコードの品質チェックを行うようになりました
- CI 落ちを気にする必要がなくなった:ローカル環境で事前に問題を発見できるため、CI での失敗が約60%減少しました
- 実装自体のレビューに注力できる:品質チェックは Devin が自動で行うため、人間は実装のロジックや設計に集中できるようになりました
- ついでにリポジトリ専用の Knowledge が定義できるようになった(リポジトリがインデックスされたから?)

ENECHANGEグループは、「エネルギー革命」を技術革新により推進し、より良い世界を創出することをミッションとするエネルギーベンチャー企業です。 enechange.co.jp/
Discussion