STORES Product Blog

こだわりを持ったお商売を支える「STORES」のテクノロジー部門のメンバーによるブログです。

決済端末の開発を支えるディストリビューションツールを作った

こんにちは、@tomorrowkeyです。 STORESでは先日STORES 決済端末2をリリースしました。

www.st.inc

私もこのプロジェクトに関わっており、そのなかでSTORES App Distributionというツールを作った話を紹介します。

そもそもSTORES 決済端末2はどういう端末なのか

このSTORES 決済端末2は Miura Systems が開発しているFlexという端末です。

miurapay.com

プロダクトサイトを見ると分かりますが、この端末はAndroid OSです。

私たちは決済のソフトウェアをAndroidアプリとしてこのデバイスの上で走らせています。開発を進めるためのフィードバックループを回すためにモバイルエンジニアだけでなく、QAやPdMなども最新のアプリをインストールできる必要があり、一般的にはそのソリューションとしてディストリビューションツールというものが存在します。

STORES App Distributionとはなんなのか

ひらたくいうとFirebase App DistributionDeployGate のようなディストリビューションツールです。

すでにソリューションがあるのであればなぜそれらのディストリビューションツールを使わなかったのかというと、Flexはセキュリティのために特別な署名が施されたアプリしかインストールできないためでした。

自分たちでホスティングするようなOSSのディストリビューションツールも存在しますが、自分たちにはToo Muchだったので自作することにしました。

コンセプト

要はどこかにストレージがあって、そこからapkファイルをダウンロードできれば、あとはAndroid側でインストールできます。
なので、配信基盤はFirebase Storage(Google Storage)を使うようにして、そこからダウンロードするためのAndroidアプリを開発することにしました。

配信基盤の構築

配信系の仕組みは大きく4つのステップに分けられます。

sequenceDiagram
    participant Local Machine
    participant Bitrise

    Bitrise->>Bitrise: 1. ビルド
    Local Machine->>Bitrise: 
    Bitrise-->>Local Machine: 2. 未署名のapkファイルをダウンロード
    Local Machine->>Local Machine: 3. 署名
    Local Machine->>Firebase Storage: 4. 署名済みのapkファイルのアップロード

1. CIでアプリをビルドする

CIで署名まで実施できないということなので、CIでは未署名のapkファイルを作成するところまでを責務としました。

apkファイルが作成されたら、アーティファクトに保存します。

2. CIからアプリをダウンロードする

未署名のapkファイルをCI(Bitrise)からダウンロードします。

Bitrise API にビルドを取得するAPIやアーティファクトのURLを調べるAPIがあるので、それを活用します。

ダウンロードしたapkファイルからバージョン名やGitリビジョンを抜き出し、それをあらかじめ定めたルールにしたがってファイル名とすることで、二重にファイルをダウンロードしないように工夫しています。

3. ローカルで署名する

前述したとおり、Flexでは特殊な署名を施す必要があります。署名可能なPCで署名するためのスクリプトを動かします。

4. アップロード

署名したファイルをFirebase Storage(Google Storage)にアップロードします。 特別なスクリプトを実行する必要はなくて gsutil コマンド を使ってアップロードしています。

アプリの構築

配信の仕組みができたら、あとはそれをダウンロードする仕組みを作るだけです。 アプリはとてもシンプルです。 Firebase Storageにアクセスできるエクスプローラーのようなアプリを作ればOKです。

sequenceDiagram
  actor QA
  participant App

  QA->>App: 起動
  App->>Firebase Storage: アプリ一覧を取得
  Firebase Storage-->>App: 
  App-->>QA: アプリ一覧を表示
  QA->>App: ダウンロードするアプリを選択
  App->>Firebase Storage: アプリをダウンロード
  Firebase Storage-->>App: 
  App-->>QA: ダウンロード完了
  QA->>App: インストールを指示

どれくらいかかったのか

要件がはっきりしていたことや、社内でしか利用しないツールということもあり、ほぼClaude Codeに頼って実装していました。

「アプリの要件はシンプルだ」と書きましたが、RuntimePermissionの処理や、ページネーションの対応など、あまり本質的ではない実装も必要です。こういったところも含めてClaude Codeがほとんど実装してくれたので、本当に助かりました。

プロダクト開発をしながら2日で基本的な部分の開発は完了しており、非常にAIの力を感じた事例でした。

おわりに

このアプリ自体もこの枠組みのなかで配信をしてアップデートができるようにしており、最初のリリース以降もアップデートを続けています。いまではAndroidアプリの配信だけでなくミドルウェアの配信も担っており、決済アプリの開発には欠かせないツールの一つとなりました。

実は今回紹介したディストリビューションツール以外にも開発を支えるためのツールをいくつか内製しています。そんな開発ツールを作ることが大好きなあなた!ぜひ一緒にカジュアル面談をしてみませんか。お待ちしています。

jobs.st.inc