mcpField
U
using-crabnebula-cloud-with-tauri

using-crabnebula-cloud-with-tauri

github.com/dchukクラウド・DevOps36136 回インストール40 週間前に更新
リポジトリ

using-crabnebula-cloud-with-tauri について

CrabNebula Cloudを使ってTauriアプリを配布するためのスキルです。リリース手順、チャンネル管理、CI/CD、Tauriの自動アップデート設定を扱います。

主な機能

  1. 01リリースの作成、アップロード、公開
  2. 02stable、beta、nightlyチャンネルの管理
  3. 03Tauri自動アップデートの設定
  4. 04GitHub Actionsによるリリース自動化
  5. 05アプリのダウンロード数の追跡

活用シーン

  1. 01Tauriアプリのインストーラーや更新の配布
  2. 02betaとstableの配信チャンネル設定
  3. 03GitHub Actionsを使ったリリース自動化

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/dchuk/claude-code-tauri-skills --skill using-crabnebula-cloud-with-tauri

インストール後、Claude Code で/using-crabnebula-cloud-with-tauriを入力して読み込まれたか確認します。

詳細

Tauri で CrabNebula Cloud を利用する

CrabNebula は Tauri の公式パートナーであり、Tauri アップデーターとシームレスに統合するアプリケーション配布プラットフォームを提供しています。このプラットフォームでは、グローバル CDN による配布、リリース管理、組み込みの自動アップデート機能を利用できます。

概要

CrabNebula Cloud では、以下の機能を利用できます。

  • グローバル CDN:インストーラーとアップデートを世界中に配布
  • リリースチャネル:複数のリリーストラック(安定版、ベータ版、ナイトリー版)をサポート
  • 自動アップデート:Tauri のアップデータープラグインと互換性のある、組み込みのアップデートサーバー
  • ダウンロード指標:アプリケーションのダウンロードを追跡する分析機能
  • CI/CD 統合:リリースを自動化する GitHub Actions のサポート

初期設定

1. CrabNebula Cloud アカウントを作成する
  1. CrabNebula Cloud にアクセスします
  2. GitHub または GitLab の認証を使用してサインインします
  3. 一意のスラッグを持つ組織を作成します
  4. 組織内にアプリケーションを作成します
2. API キーを生成する
  1. CrabNebula Cloud の API Keys セクションに移動します
  2. 読み取り/書き込み権限を持つ新しいキーを生成します
  3. このキーを安全に保存します(表示されるのは一度だけです)
  4. GitHub のリポジトリシークレットとして CN_API_KEY を追加します

重要:環境シークレットではなく、リポジトリシークレットを使用してください。環境シークレットはログに表示される可能性があります。

CLI のインストール

リリースをローカルで管理するために、CrabNebula CLI をインストールします。

# macOS/Linux
curl -L https://cdn.crabnebula.app/install/cn | sh

# Or via cargo
cargo install cn-cli

リリースのワークフロー

リリースプロセスは、ドラフト、アップロード、公開、取得の 4 つのステップで構成されます。

CLI コマンドを手動で実行する
# Create a release draft
cn release draft ORG_SLUG/APP_SLUG VERSION

# Upload assets with Tauri framework detection
cn release upload ORG_SLUG/APP_SLUG RELEASE_ID --framework tauri

# Publish the release
cn release publish ORG_SLUG/APP_SLUG RELEASE_ID

# Fetch latest release info
cn release latest ORG_SLUG/APP_SLUG
アップロードコマンドのオプション
cn release upload ORG_SLUG/APP_SLUG RELEASE_ID \
  --framework tauri \
  --channel stable \
  --update-platform linux-x86_64 \
  --file path/to/binary \
  --signature path/to/signature
フラグ説明
--frameworkバンドルを自動検出します(tauri または packager)
--channelリリースチャネル(ドラフトのチャネルと一致する必要があります)
--update-platformアップデート用のプラットフォーム識別子
--fileバイナリアセットへのパス
--signature署名ファイルへのパス(--update-platform を指定する場合は必須)

GitHub Actions のワークフロー

.github/workflows/release.yml を作成します。

name: Release

on:
  push:
    branches:
      - main
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

env:
  CN_APPLICATION: "your-org/your-app"

jobs:
  draft:
    runs-on: ubuntu-latest
    outputs:
      version: ${{ steps.read-version.outputs.version }}
    steps:
      - uses: actions/checkout@v4

      - name: Read version from tauri.conf.json
        id: read-version
        run: |
          VERSION=$(jq -r '.version' src-tauri/tauri.conf.json)
          echo "version=$VERSION" >> $GITHUB_OUTPUT

      - name: Create draft release
        uses: crabnebula-dev/cloud-release@v0
        with:
          command: release draft ${{ env.CN_APPLICATION }} ${{ steps.read-version.outputs.version }} --framework tauri
          api-key: ${{ secrets.CN_API_KEY }}

  build:
    needs: draft
    strategy:
      fail-fast: false
      matrix:
        include:
          - platform: ubuntu-22.04
            args: ""
          - platform: macos-latest
            args: "--target aarch64-apple-darwin"
          - platform: macos-latest
            args: "--target x86_64-apple-darwin"
          - platform: windows-latest
            args: ""
    runs-on: ${{ matrix.platform }}
    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: lts/*

      - name: Install Rust stable
        uses: dtolnay/rust-action@stable
        with:
          targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}

      - name: Install Linux dependencies
        if: matrix.platform == 'ubuntu-22.04'
        run: |
          sudo apt-get update
          sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf

      - name: Install frontend dependencies
        run: npm ci

      - name: Build Tauri app
        uses: tauri-apps/tauri-action@v0
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
          TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
        with:
          args: ${{ matrix.args }}

      - name: Upload assets to CrabNebula Cloud
        uses: crabnebula-dev/cloud-release@v0
        with:
          command: release upload ${{ env.CN_APPLICATION }} --framework tauri
          api-key: ${{ secrets.CN_API_KEY }}

  publish:
    needs: [draft, build]
    runs-on: ubuntu-latest
    steps:
      - name: Publish release
        uses: crabnebula-dev/cloud-release@v0
        with:
          command: release publish ${{ env.CN_APPLICATION }} ${{ needs.draft.outputs.version }}
          api-key: ${{ secrets.CN_API_KEY }}

自動アップデートの設定

1. 署名キーを生成する
cargo tauri signer generate -w ~/.tauri/myapp.key

以下のファイルが作成されます。

  • ~/.tauri/myapp.key - 秘密鍵(秘密にしてください)
  • ~/.tauri/myapp.key.pub - 公開鍵(設定に追加します)

GitHub リポジトリのシークレットに以下を追加します。

  • TAURI_SIGNING_PRIVATE_KEY:myapp.key の内容
  • TAURI_SIGNING_PRIVATE_KEY_PASSWORD:パスワード
2. tauri.conf.json を設定する
{
  "version": "0.1.0",
  "bundle": {
    "createUpdaterArtifacts": true
  },
  "plugins": {
    "updater": {
      "active": true,
      "endpoints": [
        "https://cdn.crabnebula.app/update/YOUR_ORG/YOUR_APP/{{target}}-{{arch}}/{{current_version}}"
      ],
      "dialog": true,
      "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk..."
    }
  }
}

重要:{{target}}、{{arch}}、{{current_version}} のプレースホルダーは変更しないでください。Tauri は実行時にこれらを動的に置き換えます。

Tauri v1 から移行する場合は、"createUpdaterArtifacts": "v1Compatible" を使用してください。

3. ケイパビリティを設定する

/src-tauri/capabilities/main.json を更新します。

{
  "$schema": "../gen/schemas/desktop-schema.json",
  "identifier": "main-capability",
  "description": "Main capability for the application",
  "windows": ["main"],
  "permissions": [
    "core:default",
    "dialog:default",
    "updater:default",
    "process:default",
    "process:allow-restart"
  ]
}
4. 依存関係をインストールする

src-tauri/Cargo.toml に追加します。

[dependencies]
tauri-plugin-updater = "2"
tauri-plugin-dialog = "2"
tauri-plugin-process = "2"

フロントエンドのパッケージをインストールします。

npm install @tauri-apps/plugin-updater @tauri-apps/plugin-dialog @tauri-apps/plugin-process
5. プラグインを登録する(Rust)

src-tauri/src/lib.rs を更新します。

use tauri::Manager;

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .plugin(tauri_plugin_updater::Builder::new().build())
        .plugin(tauri_plugin_dialog::init())
        .plugin(tauri_plugin_process::init())
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}
6. アップデートチェックを実装する(TypeScript)

src/updater.ts を作成します。

import { check } from "@tauri-apps/plugin-updater";
import { ask } from "@tauri-apps/plugin-dialog";
import { relaunch } from "@tauri-apps/plugin-process";

export async function checkForAppUpdates(): Promise<void> {
  try {
    const update = await check();

    if (!update?.available) {
      console.log("No update available");
      return;
    }

    const proceed = await ask(
      `Version ${update.version} is available!\n\nRelease notes:\n${update.body}`,
      {
        title: "Update Available",
        kind: "info",
        okLabel: "Update Now",
        cancelLabel: "Later"
      }
    );

    if (proceed) {
      console.log("Downloading and installing update...");
      await update.downloadAndInstall();
      await relaunch();
    }
  } catch (error) {
    console.error("Update check failed:", error);
  }
}

アプリケーションのライフサイクルの早い段階で呼び出します。

// React example
import { useEffect } from "react";
import { checkForAppUpdates } from "./updater";

function App() {
  useEffect(() => {
    checkForAppUpdates();
  }, []);

  return <div>Your app content</div>;
}

リリースチャネル

複数の配布チャネル(ベータ版、安定版、ナイトリー版)を使用する場合:

オプション 1:チャネル引数
# Create draft with channel
cn release draft ORG/APP VERSION --channel beta

# Upload must specify same channel
cn release upload ORG/APP RELEASE_ID --framework tauri --channel beta
オプション 2:アプリケーションを分ける

CrabNebula Cloud で別々のアプリケーションを作成します。

  • your-org/your-app(安定版)
  • your-org/your-app-beta(ベータ版)

アプリケーションのビルドごとに、チャネル別のアップデートエンドポイントを設定します。

環境変数の概要

変数場所説明
CN_API_KEYGitHub SecretsCrabNebula Cloud API キー
TAURI_SIGNING_PRIVATE_KEYGitHub Secrets署名用秘密鍵の内容
TAURI_SIGNING_PRIVATE_KEY_PASSWORDGitHub Secrets署名キーのパスワード
CN_APPLICATIONワークフローの環境組織/アプリケーションのスラッグ

トラブルシューティング

アップデートチェックに失敗する
  1. エンドポイント URL が組織とアプリケーションのスラッグに一致していることを確認します
  2. 設定内の公開鍵が生成したキーと一致していることを確認します
  3. createUpdaterArtifacts が true に設定されていることを確認します
  4. ケイパビリティに必要な権限が含まれていることを確認します
アップロード時のビルド失敗
  1. CN_API_KEY が環境シークレットではなく、リポジトリシークレットとして設定されていることを確認します
  2. アップロード前にドラフトが正常に作成されたことを確認します
  3. 署名キーが正しく設定されていることを確認します
署名の不一致
  1. TAURI_SIGNING_PRIVATE_KEY が設定ファイル内の公開鍵と一致していることを確認します
  2. すべてのビルドで同じキーペアが使用されていることを確認します
  3. v1 から移行する場合は、"createUpdaterArtifacts": "v1Compatible" を使用します

リソース

コメント