テーマ
プレビュー配信 (uzu preview)
uzu preview はビルドしたゲームを 1 本アップロードし、emulator でそのまま触れるリンクを返します。 シナリオのリビジョンは登録しないので、公開中のゲームには一切影響しません。
PR のレビューで「差分を読んでも見た目と操作が分からない」を解消するための機能です。 リンクを PR に貼れば、開いた人が手元にチェックアウトして uzu dev を立てなくても触れます。
使い方
manifest.json のあるディレクトリで実行します。
bash
npx uzu previewPreviewing game: silk-and-chrome (players: 5, orientation: landscape)
Building server logic...
Building...
Creating ZIP...
Uploading to R2...
Uploaded to R2. revisionId: pv-01m31sg6rpxcb00jksfx009ezp
Uploading logic.js to R2...
Done!
Preview: https://emulator.code.uzu-app.com/?endpoint=...&revision_id=pv-...&player_count=5&orientation=landscape&admin=1&server_url=...
このリンクは 14 日ほどで開けなくなります (R2 から実体が削除されるため)リンクは manifest.json の playerCount / orientation / admin を反映した状態で開きます。 characters を宣言していれば人数はその長さです。つまり uzu dev のハーネスと同じ席割りを、 インストール不要で他人に渡せます。
オプション
| オプション | 内容 |
|---|---|
--json | { "id", "url", "expiresAt" } を stdout へ出す。進捗は stderr へ回る |
--label <text> | アップロードの監査ログに残す表示名 (PR 番号など)。200 バイト以内・改行なし |
bash
npx uzu preview --json --label "PR #453"json
{
"id": "pv-01m31sg6rpxcb00jksfx009ezp",
"url": "https://emulator.code.uzu-app.com/?endpoint=...",
"expiresAt": "2026-10-06T12:34:56Z"
}--json のときはビルドツールの出力も stderr へ寄せるので、npx uzu preview --json > preview.json がそのまま使えます。
uzu publish との違い
uzu publish | uzu preview | |
|---|---|---|
| リビジョン登録 | する | しない |
| 公開中のゲームへの影響 | 配信対象になりうる | なし |
| キャラクターアイコン | アップロードする | しない (emulator では使わないため) |
| 実体の寿命 | 無期限 | 14 日ほどで削除される |
| 触る手段 | UZU Studio / アプリ | emulator のリンク |
ビルドからアップロードまでの経路は両者で同じです。uzu preview で動いたものは uzu publish でも同じように動きます。
WARNING
プレビューのリンクを知っていれば誰でも部屋に入れます。推測できない ID を使っているので 総当たりでは辿り着けませんが、リンク自体は公開前のシナリオを開ける鍵です。共有範囲に注意してください。
有効期限
アップロードした実体は 14 日ほどで自動的に削除されます。削除後はリンクを開いても 404 になります。 長く開いている PR で期限が切れたら、uzu preview を実行し直して新しいリンクに差し替えてください。 毎回別の ID になるので、古いリンクが新しいビルドを指すことはありません。
削除は自動なので、後片付けのコマンドはありません。
PR に貼る
uzu preview は CI からも実行できます。認証は uzu publish と同じ publish token を使います (発行方法と対応環境は CI から publish する を参照)。
1 回あたり数百 MB をアップロードするので、全 push ではなくラベルか /preview コメントで起動するのが無難です。 次は /preview コメントで起動し、結果を 1 つのコメントに上書きし続ける例です。
yaml
name: Preview
on:
issue_comment:
types: [created]
permissions:
contents: read
pull-requests: write
jobs:
preview:
if: github.event.issue.pull_request && startsWith(github.event.comment.body, '/preview')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
ref: refs/pull/${{ github.event.issue.number }}/head
- uses: actions/setup-node@v6
with:
node-version: 20
- run: npm ci
- id: preview
working-directory: packages/play
run: npx uzu preview --json --label "PR #${{ github.event.issue.number }}" > preview.json
env:
UZU_PUBLISH_TOKEN: ${{ secrets.UZU_PUBLISH_TOKEN }}
- working-directory: packages/play
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
url=$(jq -r .url preview.json)
printf '**Preview**: %s\n\n14 日ほどで開けなくなります。切れていたら `/preview` を投げ直してください。\n' "$url" \
| gh pr comment ${{ github.event.issue.number }} --body-file - --edit-last --create-if-noneworking-directory は manifest.json のある場所に合わせます (ワークスペース構成のシナリオなら packages/play など)。
WARNING
refs/pull/<n>/head は PR の作者が書いたコードをそのまま実行します。フォークからの PR を 受け付けるリポジトリでは、/preview を投げられる人を絞る条件を足してください (github.event.comment.author_association の確認など)。