無料でAIとペアプロ!?OpenHands × OpenRouterでAndroidアプリをバイブコーディングしてみた話
2025-08-18 勉強会
システム部開発ユニットの大原です!
最近、生成AIの話題は毎日と言っていいほど出てきますよね。
「でも、実際に開発フローにAIを組み込んでみたらどうなるの?」
と思ったことはありませんか?
今回は、ほぼ無料環境のOpenHands(旧OpenDevin)とOpenRouterの組み合わせで、GitHub Actionsと連携して、Issue対応からPR作成、ビルド、テスト、修正までを自動化してみました!
やってみた感想も含めてレポートします。
最後までお読みいただけますと幸いです!
最近、生成AIの話題は毎日と言っていいほど出てきますよね。
「でも、実際に開発フローにAIを組み込んでみたらどうなるの?」
と思ったことはありませんか?
今回は、ほぼ無料環境のOpenHands(旧OpenDevin)とOpenRouterの組み合わせで、GitHub Actionsと連携して、Issue対応からPR作成、ビルド、テスト、修正までを自動化してみました!
やってみた感想も含めてレポートします。
最後までお読みいただけますと幸いです!
1. OpenHandsって何?
OpenHands(旧 OpenDevin)は、AIが直接リポジトリのコードを読み込み、要件に応じて実装・修正を行ってくれるオープンソースのコーディングエージェントです。
ローカルでもクラウドでも動作し、GitHubリポジトリと連携すれば、Issueを起点にPull Request作成まで自動化できます。
大きく分けて3つの使い方があります。
ローカルでもクラウドでも動作し、GitHubリポジトリと連携すれば、Issueを起点にPull Request作成まで自動化できます。
大きく分けて3つの使い方があります。
1-1. 通常のローカル実行
OpenHandsをローカルなDocker環境で立ち上げる方法です。
※2025年8月14日更新の最新バージョン
docker pull docker.all-hands.dev/all-hands-ai/runtime:0.53-nikolaik
docker run -it --rm --pull=always \
-e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.53-nikolaik \
-e LOG_ALL_EVENTS=true \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands:/.openhands \
-p 3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands-app \
docker.all-hands.dev/all-hands-ai/openhands:0.53
最新の状態は公式ドキュメントをご確認ください。
http://localhost:3000 で確認できます。
1-2. OpenHands CLI
OpenHandsはGUI上だけでなく、CLI(コマンドライン)から直接タスクを依頼することもできます。
CLIを使うと、ローカルのディレクトリを直接参照してコード編集を行わせることも可能です。
CLIを使うと、ローカルのディレクトリを直接参照してコード編集を行わせることも可能です。
最初に初期設定を求められます。
コマンド操作などができるようになります。
1-3. GitHub Actionsでの openhands-resolver
OpenHandsはGitHub Actions用ワークフロー openhands-resolver を公式で提供しています。
これを使えば、特定のアクションをトリガーに自動でコード修正〜PR作成ができます。
たとえば、openhands-resolverではIssueやPRに fix-me ラベルを付けると、自動で修正作業が走ります。
設定例は公式ドキュメントとGitHubリポジトリに掲載されています。
これを使えば、特定のアクションをトリガーに自動でコード修正〜PR作成ができます。
たとえば、openhands-resolverではIssueやPRに fix-me ラベルを付けると、自動で修正作業が走ります。
設定例は公式ドキュメントとGitHubリポジトリに掲載されています。
OpenHands GitHub Action公式ドキュメント
https://docs.all-hands.dev/usage/how-to/github-action#custom-configurations公式GitHub:openhands-resolver.yml
https://github.com/All-Hands-AI/OpenHands/blob/main/.github/workflows/openhands-resolver.yml2. OpenRouterって何?
OpenRouterは1つのAPIキーで複数のLLMモデルを呼び出せる便利なサービス。
OpenAI、Anthropic、Google Gemini、Meta Llamaなど、いろんなモデルを切り替えながら使えます。
OpenAI、Anthropic、Google Gemini、Meta Llamaなど、いろんなモデルを切り替えながら使えます。
無料で使えるモデルも存在しています
https://openrouter.ai/models?q=free「まずは無料で試したい」という場合にありがたい存在です。
この後の実践でも無料の
「deepseek/deepseek-chat-v3-0324:free」
を利用してみます。
この後の実践でも無料の
「deepseek/deepseek-chat-v3-0324:free」
を利用してみます。
※ OpenRouterには無料枠とクレジットの2段階がある
無料モデルには、1日あたり50リクエストという上限が設定されています。 この上限を解除し、より多くのリクエスト(1000リクエスト)を送信したい場合は、最低10ドルのクレジットを一度だけ購入する必要があります。
今回のバイブコーディング実践で料金が発生したのはここだけでした。
今回のバイブコーディング実践で料金が発生したのはここだけでした。
3. 実践!Android日記アプリをAIとバイブコーディング
今回は、自作のAndroid日記アプリを題材にしてみました。
3-0. 事前準備
.github/workflows/
にGitAction用のYAMLを設置(複数可)
今回は以下を設置
・OpenHands用のopenhands-resolver
・自動テスト用のfirebase-testlab(後述)
にGitAction用のYAMLを設置(複数可)
今回は以下を設置
・OpenHands用のopenhands-resolver
・自動テスト用のfirebase-testlab(後述)
3-1. IssueからPR(プルリクエスト)作成まで
以下内容のGitHub Issueを作成します。
タイトル:○○機能の実装
説明:要件を記載
ラベル:fix-me
タイトル:○○機能の実装
説明:要件を記載
ラベル:fix-me
"fix-me"ラベルがついたGitHub Issueを検知するとGitActionが実行されOpenHandsが働いてくれます。
しばらく待つと開発ブランチ(openhands-fix-issue-{issue番号})にコミットしてPRを作成してくれます
3-2. 自動ビルド&テスト
main(default)ブランチ向けのPRが作成されるタイミングでビルドチェックを行い、ビルドエラーの場合はエラーログをPRにコメントして、ビルド成功した場合はFirebase Test Labでテストコード実行してキャプチャを残すGitActionを用意しました。
↓.github/workflows/firebase-testlab.yml
↓.github/workflows/firebase-testlab.yml
name: Run Instrumentation Tests on Firebase Test Lab
on:
pull_request:
branches: [ main ]
push:
branches: [ main ]
jobs:
firebase-test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up JDK
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '17'
- name: Set up Android SDK
uses: android-actions/setup-android@v2
- name: Write service account key from Base64
run: |
echo "${{ secrets.GCLOUD_SERVICE_KEY_B64 }}" | base64 -d > gcloud_key.json
- name: Authenticate to GCP
run: |
gcloud auth activate-service-account --key-file=gcloud_key.json
gcloud config set project your-gcp-project-id
env:
GOOGLE_APPLICATION_CREDENTIALS: gcloud_key.json
- name: Build debug and test APKs
id: build_apk
run: |
./gradlew assembleDebug assembleAndroidTest > build.log 2>&1 || echo "BUILD_FAILED=true" >> $GITHUB_ENV
- name: Comment build error on PR
if: env.BUILD_FAILED == 'true'
run: |
echo " :x: Android Build Failed" > comment.md
echo '```' >> comment.md
tail -n 300 build.log >> comment.md
echo '```' >> comment.md
gh pr comment "$PR_NUMBER" --body-file comment.md
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ github.event.pull_request.number }}
- name: Run tests on Firebase Test Lab
run: |
gcloud firebase test android run \
--type instrumentation \
--app app/build/outputs/apk/debug/app-debug.apk \
--test app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk \
--device model=redfin,version=30,locale=en,orientation=portrait \
--results-bucket=your-test-lab-results
3-3. 自動修正
PRのラベルに"fix-me"をつけるとPRコメントを読んで修正してくれました。
今回はImageButtonのimportが抜けていただけのようでした。
今回はImageButtonのimportが抜けていただけのようでした。
ビルドが成功したので、Firebase Test Lab がテストを実行して、UIテストのキャプチャーをバケットに残してくれています
テスト結果のキャプチャがバケットに保存されていました
今回は試しに、ログイン画面に特定のログイン情報が入力されるかのテストコードだけを書いた状態のため問題なくキャプチャが撮れていそうでした。
3-4. 最終確認
エミュレータで実行して動作確認。
OKならMergeしてしまいます!
OKならMergeしてしまいます!
例ではお気に入り機能をつけてうまく実装されていそうでした。
4. やってみた感想
今回は無料モデルでバイブコーディングを試してみましたが、プロンプト次第では実践前に思っていたより意図を組んで実装してくれた印象でした。
読み込むコードの量が小規模なのと、MVVMアーキテクチャを意識して作ったアプリだったこともプラスに働いてくれたような気もしました。
マークダウン形式での設計書なども読み込む対象に組み込むことができればより期待した結果が返ってくるのかなとも思いました。
設計書やテストをOpenHandsに都度作成してもらうのが理想ですので、そのフローをGitActionで組み込んでもいいかと思います。
読み込むコードの量が小規模なのと、MVVMアーキテクチャを意識して作ったアプリだったこともプラスに働いてくれたような気もしました。
マークダウン形式での設計書なども読み込む対象に組み込むことができればより期待した結果が返ってくるのかなとも思いました。
設計書やテストをOpenHandsに都度作成してもらうのが理想ですので、そのフローをGitActionで組み込んでもいいかと思います。
5. おまけ:AIで情報キャッチアップツールも作ってみた
AIの進化が速すぎて追いつけないので、RSS経由で技術記事を集めて要約・通知する仕組みを作りました。
実装内容
・Qiita, Zenn, Android Developers, Apple DeveloperのRSS取得(モバイルエンジニア用)
・無料で使えるLLM APIキーを利用して記事の要約&スプレッドシートに書き出しと読み込みで記事関心度の分析(個別フィルタリングのカスタマイズ用)
・GASでGoogle Chatに定期的に通知
実装内容
・Qiita, Zenn, Android Developers, Apple DeveloperのRSS取得(モバイルエンジニア用)
・無料で使えるLLM APIキーを利用して記事の要約&スプレッドシートに書き出しと読み込みで記事関心度の分析(個別フィルタリングのカスタマイズ用)
・GASでGoogle Chatに定期的に通知
無料APIキーを活用して、自分専用ニュースアシスタントが完成しました。
まとめ
AIを「開発フローの中」に入れるだけで、
・Issueからコード作成
・自動ビルド&テスト
・エラー修正
のサイクルがかなり短縮できます。
しかも今回の構成、ほぼ無料。
「AIにコーディングを手伝ってもらう」のは、もう実験段階を超えて実用レベルだと感じました。
これからもAIと協力していく仕組みづくりを進めていきたいと思います!
最後まで読んでいただきありがとうございました!
・Issueからコード作成
・自動ビルド&テスト
・エラー修正
のサイクルがかなり短縮できます。
しかも今回の構成、ほぼ無料。
「AIにコーディングを手伝ってもらう」のは、もう実験段階を超えて実用レベルだと感じました。
これからもAIと協力していく仕組みづくりを進めていきたいと思います!
最後まで読んでいただきありがとうございました!