DevinにCIテストを待たせずローカルでテスト実行可能にし、爆速で開発させる
はじめに
弊社では新年始まったタイミングでDevinを導入し、一週間が経過しました
Devinは月額$500ですが、これは毎月250ACUのクレジットが付与される価格です
※ ACUとは、使用量を表す単位で、1ACUがおおよそ15分間の使用量となっています
なので色々試している最初の段階などは、ACUを必要以上に使ってしまいますね
なんとかACU消費を抑えて効率的にDevinに働いてもらう必要があります
その中でも今回はSetUp段階での効率化に着目して対応した内容をまとめていきます
というのも、DevinはPRを作成後にCIの実行完了を待機し、ステータスによって修正するので、その待機時間を短縮することができればACU消費を抑えることができます
対応した内容
今回対象としたのは、APIのレポジトリで言語は TypeScript です
ローカルの開発環境は Dev Container で API, MySQL, FirebaseEmulator の3つのコンテナを動かしています
- apiのアプリケーションをローカルで動作させて
npm run test
を実行可能にする - Devinのレポジトリ SetUp コマンドでテストが実行可能な環境を作成する
ローカルでのテストを実行可能にする対応
対象とした API レポジトリの環境に大きく依存した話なので、Devin の SetUp コマンドで実行可能な状態を作成 まで読み飛ばして頂いても大丈夫です
DevinではDockerコンテナの実行が可能なので、MySQLとFirebaseEmulatorについては引き続きコンテナを起動します
- Makefileに記述した
db migration
の実行のために環境変数を展開可能にする
- MYSQL_HOST := db
+ MYSQL_HOST ?= db
既存の開発環境は docker-compose
での命名解決がされているのですが、環境変数が指定されていればそちらを優先するように修正
- 環境変数に展開するための
.env.sample
ファイルの用意
後述するようにDevinにはSetUpのコマンドを指定できるので、ローカル用の環境変数を .env.sample
ファイルに準備しておきます
- Makefileで
.env
ファイルを展開するように修正
+ -include .env
+ export
-include.env
と記述しておくことでファイルが存在しない既存の利用ケースにも影響が出ないようにします
- Vitest の実行時に
.env
ファイルを読み出す
テストは Vitest を使用していますので実行時に環境変数が解決されるように修正
今回は Vitest 実行時に .env
ファイルを展開しましたが、Devinのローカル環境に .env
ファイルを展開しておく方針でも良いかもしれません
// Vitest の globalSetup 内で展開
export const setup = async () => {
+ const envPath = ".env";
+ if (existsSync(envPath)) {
+ config({ path: envPath });
+ }
Devin の SetUp コマンドで実行可能な状態を作成
今回は最初にレポジトリを設定したものを修正するため、設定画面よりSetUp画面に入ります
初めてDevinを利用する場合は最初のレポジトリを選んだ際に同じ画面に来るはずです
- レポジトリの依存を設定
VSCodeのWebエディタのターミナル上でコマンドを実行し、依存の解決ができた状態でDoneを押下
- 設定を確認&修正する
テストのためにMySQL, FirebaseEmulatorが必要なことは先に述べましたが、加えてPrismaを使用し、TypedQueryも使用しているので、PrismaのgenerateのためにMySQLコンテナにDB Schemaが作成されている必要があります
そういった細かいコマンド設定もここで修正などテストを行い実行を確認します
作業実行時に Knowledge にしていく
あとは、実行時に指摘した内容を Knowledge にして取り込んでいきます
最後に
Devinを使用し始めたタイミングは、PR作成後にCIの実行完了を待機しステータスによって修正する動きに驚きを覚えていました
しかし ACU に限りがある中で働いてもらうためには Devin に仕事をしやすい環境を作ることが必要ですね
AIエージェントが仕事しやすい環境を作る = 人の開発体験も上がる なので既存のワークフローにとらわれずに、人とAIどちらにもフレンドリーな開発体験を引き続き追求していきます
Discussion