## Genemicliと実践!GitHub ActionsでHugging Face SpacesへAIアプリを自動デプロイするガイド AIモデルを使ったアプリケーション開発は、時に予期せぬ課題に直面します。しかし、`genemicli`のような強力なCLIアシスタントと連携することで、それらの課題を乗り越え、スムーズにプロジェクトを進めることができます。この記事では、私たちが`genemicli`と共に、GitHub ActionsとHugging Face Spacesを連携させ、AIアプリケーションを自動でデプロイするまでの道のりを、具体的な実装手順と問題解決のプロセスを交えながら解説します。 --- ### 1. Hugging Face Spacesの準備 まず、Hugging Face Spacesで新しいSpaceを作成します。 * Hugging Faceにログインし、「Spaces」タブから「Create new Space」を選択。 * 「Space name」を決め、「Gradio」SDKを選択します。 * 「Create Space」をクリック。 ### 2. GitHubリポジトリの準備 あなたのAIアプリケーションのコードがGitHubリポジトリにあることを確認してください。 ### 3. Hugging Faceアクセストークンの取得 GitHub ActionsからHugging Face Spacesにアクセスするために、アクセストークンが必要です。 * Hugging Faceにログインし、右上のプロフィールアイコン → 「Settings」 → 「Access Tokens」へ。 * 「New token」をクリックし、`write`権限を持つトークンを作成し、コピーします。 ### 4. GitHub Secretsへのトークン登録 コピーしたアクセストークンをGitHubリポジトリのSecretsに登録します。これは、セキュリティのためにコードに直接トークンを書き込まないための重要な手順です。 * GitHubリポジトリの「Settings」→「Secrets and variables」→「Actions」へ。 * 「New repository secret」をクリックし、**Name**を `HF_TOKEN`、**Secret**にコピーしたトークンを貼り付けて登録します。 * **`genemicli`との連携:** `genemicli`は、この`HF_TOKEN`の登録方法を丁寧に案内してくれました。 ### 4.5. アプリケーション用Secretsの登録 (Hugging Face Spaces側) `HF_TOKEN`はGitHub Actionsがデプロイを行うために必要なトークンですが、デプロイされた**アプリケーション自体**が実行時に必要とする機密情報(APIキーやパスワードなど)は、Hugging Face Spaces側で設定する必要があります。 今回のプロジェクトでは、APIを保護するための`GRADIO_PASSWORD`が必要です。 * Hugging Face Spaceの「Settings」ページに移動します。 * 「Variables and Secrets」セクションで、「New secret」をクリックします。 * **Name**を `GRADIO_PASSWORD`、**Value**に設定したいパスワードを入力して登録します。 これにより、アプリケーションは安全にパスワードを読み込んで認証を有効にすることができます。 ### 5. GitHub Actionsワークフローの作成 GitHubリポジトリのルートに `.github/workflows/sync-to-space.yml` というファイルを作成し、以下の内容を記述します。このワークフローは、GitHubの`main`ブランチへのプッシュをトリガーにして、Spaceのコンテンツを自動で更新します。 ```yaml name: Sync to Hugging Face hub on: push: branches: [main] # mainブランチへのプッシュをトリガー workflow_dispatch: # 手動実行も可能にする jobs: sync-to-hub: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: fetch-depth: 0 lfs: true # LFSファイルがある場合 - name: Push to hub env: HF_TOKEN: ${{ secrets.HF_TOKEN }} # GitHub Secretsからトークンを取得 run: | # Spaceのリモートを追加(YOUR_HF_USERNAMEとYOUR_SPACE_NAMEを置き換える) git remote add space https://YOUR_HF_USERNAME:${{ secrets.HF_TOKEN }}@huggingface.co/spaces/YOUR_HF_USERNAME/YOUR_SPACE_NAME # mainブランチをSpaceに強制プッシュ git push --force space main ``` **注意点:** * `YOUR_HF_USERNAME` と `YOUR_SPACE_NAME` は、あなたのHugging Faceのユーザー名とSpace名に置き換えてください。 * `fetch-depth: 0` と `lfs: true` は、大きなモデルファイルなどを扱う場合に重要です。 * **`genemicli`との連携:** `genemicli`は、このワークフローの作成をサポートし、`YOUR_HF_USERNAME`と`YOUR_SPACE_NAME`を実際の値に置き換えるよう指示してくれました。 ### 6. `README.md` の設定 Hugging Face Spacesは、`README.md`の先頭にあるメタデータブロックを読み込んでSpaceの設定を行います。あなたの`README.md`の先頭に以下の内容を追加してください。 ```yaml --- title: あなたのアプリのタイトル emoji: ✨ colorFrom: "#FFD700" # 好みの色に colorTo: "#FFA500" # 好みの色に sdk: gradio sdk_version: "4.x.x" # requirements.txtのGradioバージョンに合わせる app_file: app.py # アプリケーションのエントリーポイントファイル pinned: false --- ``` **注意点:** * `title`、`emoji`、`colorFrom`、`colorTo` は自由に設定してください。 * `sdk_version` は `requirements.txt` に記載されているGradioのバージョンに合わせてください。 * `app_file` は、あなたのGradioアプリケーションのメインファイル(例: `app.py` や `src/main.py` など)のパスを記述します。 * **`genemicli`との連携:** `genemicli`は、Spaceが画面表示されない問題に直面した際、この`README.md`のメタデータ設定が不足していることを特定し、必要な項目(`title`、`sdk`、`app_file`など)の追加を提案・適用してくれました。 ### 7. アプリケーションのエントリーポイントの調整 (`app.py`の作成) Hugging Face Spacesで`ModuleNotFoundError`が発生した場合、アプリケーションのエントリーポイントを調整する必要があります。これは、Pythonのモジュールパスの問題を解決するためです。 GitHubリポジトリのルートに `app.py` というファイルを作成し、以下の内容を記述します。 ```python import sys sys.path.append('./src') # srcディレクトリをPythonのパスに追加 from ai_api.main import iface # src/ai_api/main.pyからifaceオブジェクトをインポート if __name__ == "__main__": iface.launch(server_name="0.0.0.0") # Gradioアプリケーションを起動 ``` * **`genemicli`との連携:** `genemicli`は、Space上で`ModuleNotFoundError: No module named 'ai_api'`というエラーが発生した際、この`app.py`ラッパーファイルの作成を提案・実装してくれました。これにより、`src`ディレクトリ内のモジュールが正しく認識され、アプリケーションが起動できるようになりました。 ### 8. デプロイの確認 これらの設定が完了したら、GitHubリポジリにコードをプッシュしてください。GitHub Actionsが自動的に実行され、Hugging Face Spaceにコードが同期されます。 Hugging Face Spaceのページにアクセスし、アプリケーションが正常に表示されるか確認しましょう。もし問題があれば、Spaceページの「Logs」タブでエラーメッセージを確認してください。