# APIトークンとCIからのリリース

権限を絞ったAPIトークンを作成し、CIシークレットとして管理して、非対話形式で安全に更新を配信します。

## 最初にローカル リリースを確認してください {#before}

CIを自動化する前に、[最初の更新を配信する手順](/docs/publish)と同じネイティブ基準、バンドルコマンド、配信対象をローカルで確認してください。これにより、ビルドの問題と認証の問題を切り分けられます。

## API トークンを作成する {#what-is-api-key}

コンソールのサイドバーで **API キー** (`/settings/tokens`) を開きます。必要な権限、アプリケーションの範囲、有効期限を選択します。完全な値は 1 回だけ表示されます。 CI シークレットに直接保存します。

トークンは、選択したアクセス許可とアプリケーション スコープによって制限され、制限のないアカウント セッションと同等ではありません。 CLI は `PAKTA_API_TOKEN` を読み取り、`x-api-token` を送信します。対話型ログインではセッション トークンが使用されます。 SDK はパブリック appKey のみを使用します。

## リリース構成の準備 {#configuration}

アプリの `package.json`、ロックファイル、公開識別子のみを含む `update.json`、および `targets.json` をコミットします。 `selectApp` を使用してローカルで update.json を生成します。 CI の選択プロンプトに依存しないでください。

```json title="targets.json · replace with verified production targets"
[
  { "channel": "default", "packageVersion": "1.0.0", "rollout": 10 }
]
```

ローカル ノード、Metro/Hermes、およびプラットフォームの依存関係を一致させます。 iOS、HarmonyOS、またはカスタム Android ビルドと同じコマンドを実行できるランナーを選択します。汎用の Linux イメージだけでは必ずしも十分とは限りません。

## GitHub アクションの例 {#ci}

これは**既存のジョブのステップの一部**であり、完全なワークフローではありません。チェックアウト、ノードおよび必要なツールチェーンが構成されていること、作業ディレクトリがアプリのルートであること、および CLI がローカルで使用されているのと同じバージョンでインストールされていることを前提としています。

```yaml title="Steps in your existing workflow"
- name: Install locked dependencies
  run: |
    npm ci
    npm install -g rn-update-cli@1.1.0

- name: Verify identity and targets
  env:
    PAKTA_API_TOKEN: ${{ secrets.PAKTA_API_TOKEN }}
    NO_INTERACTIVE: 'true'
  run: |
    pakta me
    pakta publish .pakta/output/android.ppk --platform android --name "$GITHUB_RUN_ID" --targets targets.json --dryRun --no-interactive

- name: Bundle and publish
  env:
    PAKTA_API_TOKEN: ${{ secrets.PAKTA_API_TOKEN }}
    NO_INTERACTIVE: 'true'
  run: |
    pakta bundle --platform android --output .pakta/output/android.ppk --no-interactive
    pakta publish .pakta/output/android.ppk --platform android --name "$GITHUB_RUN_ID" --targets targets.json --sourcemap .pakta/intermedia/android/index.bundlejs.map --no-interactive
```

実行ブロックは Bash を使用します。 Expo のバンドルに `--expo` を追加します。カスタム ソースマップ パスの一貫性を維持します。セルフホスティングの場合、`RNU_SERVICE_URL` を両方のステップの環境に追加します。

## 非対話型のリリースとリカバリ {#non-interactive}

- 選択プロンプトの代わりに、`--targets`、ネイティブ `--packageId`、または `--packageVersion` を明示的に提供します。
- `--dryRun` はアップロード、チャンネルの作成、公開を行いません。それは成功したリリースではありません。
- 返された更新パッケージ `packageId` とすべての `deploymentIds` を保持します。障害によって再試行可能なデプロイメント ID が提供された場合は、その正確なターゲットを再開します。

```bash
pakta publish --deploymentIds DEPLOYMENT_ID_1,DEPLOYMENT_ID_2 --platform android --no-interactive
```

プレースホルダー ID を置き換えます。無関係なドラフトを推測しないでください。並列ジョブが互いに置き換えられないように、アプリケーションおよびターゲットごとにデプロイメントをシリアル化します。同じビルドからのパッケージ、マップ、コミット、およびパブリッシュの出力をアーカイブします。

## 完了チェック {#verify}

パイプラインが正常に終了し、コンソールに想定した配信対象が表示され、対応するデバイスで更新が有効になったことを確認してください。アップロード完了だけでは配信成功とはいえません。[分析とテレメトリー](/docs/analytics)も確認してください。

## トークンメンテナンス {#security}

パイプラインごとに個別のトークンを発行します。未使用のトークンを取り消し、有効期限が切れる前にローテーションします。 CI シークレットを介して挿入し、update.json、アプリ、またはログを決して使用しないでください。認証に失敗した場合は、有効期限、失効、スコープ、権限を確認し、`me` で本人確認を行います。

## 関連記事 {#related}

[CLI](/docs/cli) · [チャンネル公開](/docs/channels) · [制作チェックリスト](/docs/bestpractice)。
