Bundles
Les bundles sont les principaux packages de mise à jour dans Capgo. Chaque bundle contient les ressources Web (HTML, CSS, JS) qui composent le contenu de votre application. Les bundles API vous permettent de gérer ces packages de mise à jour, notamment de les répertorier et de les supprimer.
Comprendre les offres groupées
Section titled “Comprendre les offres groupées”Un ensemble représente un ensemble (version) spécifique du contenu Web de votre application et comprend :
- Bundle (version) : Numéro de version sémantique du bundle
- Checksum : hachage unique pour vérifier l’intégrité du bundle
- Informations de stockage : détails sur l’endroit et la manière dont le lot est stocké
- Exigences natives : exigences minimales en matière de version d’application native
- Métadonnées : heure de création, propriété et autres informations de suivi
Création manuelle d’un bundle (sans CLI)
Section titled “Création manuelle d’un bundle (sans CLI)”Voici comment créer et télécharger des bundles manuellement sans utiliser Capgo CLI :
Étape 1 : Créez votre application
Section titled “Étape 1 : Créez votre application”Tout d’abord, créez les ressources Web de votre application :
npm run buildÉtape 2 : Créer un bundle Zip en utilisant les mêmes packages que Capgo CLI
Section titled “Étape 2 : Créer un bundle Zip en utilisant les mêmes packages que Capgo CLI”Important : utilisez exactement les mêmes packages JavaScript que Capgo CLI utilise en interne pour garantir la compatibilité.
Installer les packages requis
Section titled “Installer les packages requis”npm install adm-zip @tomasklaen/checksumCréez un bundle Zip avec JavaScript (identique à Capgo CLI)
Section titled “Créez un bundle Zip avec JavaScript (identique à Capgo CLI)”Remarque : Dans les exemples ci-dessous, version fait référence au nom du bundle (version) utilisé par API.
const fs = require('node:fs');const path = require('node:path');const os = require('node:os');const AdmZip = require('adm-zip');const { checksum: getChecksum } = require('@tomasklaen/checksum');
// Exact same implementation as Capgo CLIfunction zipFileUnix(filePath) { const zip = new AdmZip(); zip.addLocalFolder(filePath); return zip.toBuffer();}
async function zipFileWindows(filePath) { console.log('Zipping file windows mode'); const zip = new AdmZip();
const addToZip = (folderPath, zipPath) => { const items = fs.readdirSync(folderPath);
for (const item of items) { const itemPath = path.join(folderPath, item); const stats = fs.statSync(itemPath);
if (stats.isFile()) { const fileContent = fs.readFileSync(itemPath); zip.addFile(path.join(zipPath, item).split(path.sep).join('/'), fileContent); } else if (stats.isDirectory()) { addToZip(itemPath, path.join(zipPath, item)); } } };
addToZip(filePath, ''); return zip.toBuffer();}
// Main zipFile function (exact same logic as CLI)async function zipFile(filePath) { if (os.platform() === 'win32') { return zipFileWindows(filePath); } else { return zipFileUnix(filePath); }}
async function createBundle(inputPath, outputPath, version) { // Create zip using exact same method as Capgo CLI const zipped = await zipFile(inputPath);
// Write to file fs.writeFileSync(outputPath, zipped);
// Calculate checksum using exact same package as CLI const checksum = await getChecksum(zipped, 'sha256');
return { filename: path.basename(outputPath), version: version, size: zipped.length, checksum: checksum };}
// Usageasync function main() { try { const result = await createBundle('./dist', './my-app-1.2.3.zip', '1.2.3'); console.log('Bundle info:', JSON.stringify(result, null, 2)); } catch (error) { console.error('Error creating bundle:', error); }}
main();Étape 3 : Calculez la somme de contrôle SHA256 en utilisant le même package que CLI
Section titled “Étape 3 : Calculez la somme de contrôle SHA256 en utilisant le même package que CLI”const fs = require('node:fs');const { checksum: getChecksum } = require('@tomasklaen/checksum');
async function calculateChecksum(filePath) { const fileBuffer = fs.readFileSync(filePath); // Use exact same package and method as Capgo CLI const checksum = await getChecksum(fileBuffer, 'sha256'); return checksum;}
// Usageasync function main() { const checksum = await calculateChecksum('./my-app-1.2.3.zip'); console.log('Checksum:', checksum);}
main();Étape 4 : Télécharger le bundle sur votre stockage
Section titled “Étape 4 : Télécharger le bundle sur votre stockage”Téléchargez votre fichier zip sur n’importe quel stockage accessible sur le Web :
# Example: Upload to your server via scpscp my-app-1.2.3.zip user@your-server.com:/var/www/bundles/
# Example: Upload to S3 using AWS CLIaws s3 cp my-app-1.2.3.zip s3://your-bucket/bundles/
# Example: Upload via curl to a custom endpointcurl -X POST https://your-storage-api.com/upload \ -H "Authorization: Bearer YOUR_TOKEN" \ -F "file=@my-app-1.2.3.zip"Important : Votre offre groupée doit être accessible publiquement via une URL HTTPS (aucune authentification requise). Les serveurs de Capgo doivent télécharger le bundle à partir de cette URL.
Exemples d’URL publiques valides :
https://your-storage.com/bundles/my-app-1.2.3.ziphttps://github.com/username/repo/releases/download/v1.2.3/bundle.ziphttps://cdn.jsdelivr.net/gh/username/repo@v1.2.3/dist.zip
Étape 5 : Enregistrez le bundle avec Capgo API
Section titled “Étape 5 : Enregistrez le bundle avec Capgo API”Enregistrez le bundle externe auprès de Capgo à l’aide d’appels directs API :
async function registerWithCapgo(appId, version, bundleUrl, checksum, apiKey) { const fetch = require('node-fetch');
// Create bundle (version) const response = await fetch('https://api.capgo.app/bundle/', { method: 'POST', headers: { 'Content-Type': 'application/json', 'authorization': apiKey }, body: JSON.stringify({ app_id: appId, version: version, external_url: bundleUrl, checksum: checksum }) });
if (!response.ok) { throw new Error(`Failed to create bundle: ${response.statusText}`); }
const data = await response.json(); console.log('Bundle created:', data);
return data;}API Paramètres
Section titled “API Paramètres”| Paramètre | Descriptif | Obligatoire |
|---|---|---|
app_id | Votre identifiant d’application | Oui |
version | Version sémantique du bundle (version) (par exemple, “1.2.3”) | Oui |
external_url | Accessible publiquement URL HTTPS où l’ensemble peut être téléchargé (aucune authentification requise) | Oui |
checksum | Somme de contrôle SHA256 du fichier zip | Oui |
Exigences relatives à la structure du bundle
Section titled “Exigences relatives à la structure du bundle”Votre package zip doit respecter ces exigences :
- Fichier d’index racine : doit avoir
index.htmlau niveau racine - Capacitor Intégration : vous devez appeler
notifyAppReady()dans le code de votre application - Chemins d’actifs : utilisez des chemins relatifs pour tous les actifs
Structure de bundle valide
Section titled “Structure de bundle valide”bundle.zip├── index.html├── assets/│ ├── app.js│ └── styles.css└── images/Exemple complet de flux de travail manuel
Section titled “Exemple complet de flux de travail manuel”Script Node.js simple à compresser, effectuer la somme de contrôle et télécharger sur Capgo :
const fs = require('node:fs');const os = require('node:os');const AdmZip = require('adm-zip');const { checksum: getChecksum } = require('@tomasklaen/checksum');const fetch = require('node-fetch');
async function deployToCapgo() { const APP_ID = 'com.example.app'; const VERSION = '1.2.3'; const BUNDLE_URL = 'https://your-storage.com/bundles/app-1.2.3.zip'; const API_KEY = process.env.CAPGO_API_KEY;
// 1. Create zip (same as Capgo CLI) const zip = new AdmZip(); zip.addLocalFolder('./dist'); const zipped = zip.toBuffer();
// 2. Calculate checksum (same as Capgo CLI) const checksum = await getChecksum(zipped, 'sha256'); console.log('Checksum:', checksum);
// 3. Upload to your storage (replace with your upload logic) // fs.writeFileSync('./bundle.zip', zipped); // ... upload bundle.zip to your storage ...
// 4. Register with Capgo API const response = await fetch('https://api.capgo.app/bundle/', { method: 'POST', headers: { 'Content-Type': 'application/json', 'authorization': API_KEY }, body: JSON.stringify({ app_id: APP_ID, version: VERSION, external_url: BUNDLE_URL, checksum: checksum }) });
if (!response.ok) { throw new Error(`Failed: ${response.statusText}`); }
console.log('Bundle registered with Capgo!');}
deployToCapgo().catch(console.error);Installer les dépendances :
npm install adm-zip @tomasklaen/checksum node-fetchVérification de la somme de contrôle
Section titled “Vérification de la somme de contrôle”JavaScript Calcul de la somme de contrôle (identique à Capgo CLI)
Section titled “JavaScript Calcul de la somme de contrôle (identique à Capgo CLI)”Utilisez exactement le même package et la même méthode que Capgo CLI utilise en interne :
const fs = require('node:fs');const { checksum: getChecksum } = require('@tomasklaen/checksum');
async function calculateChecksum(filePath) { const fileBuffer = fs.readFileSync(filePath); // Use exact same package and method as Capgo CLI const checksum = await getChecksum(fileBuffer, 'sha256'); return checksum;}
// Verify checksum matchesasync function verifyChecksum(filePath, expectedChecksum) { const actualChecksum = await calculateChecksum(filePath); const isValid = actualChecksum === expectedChecksum;
console.log(`File: ${filePath}`); console.log(`Expected: ${expectedChecksum}`); console.log(`Actual: ${actualChecksum}`); console.log(`Valid: ${isValid}`);
return isValid;}
// Usageasync function main() { const bundleChecksum = await calculateChecksum('./my-app-1.2.3.zip'); console.log('SHA256 Checksum:', bundleChecksum);}
main();```### Importance de la somme de contrôle
- **Bundle Integrity** : garantit que le bundle n'a pas été corrompu pendant le transfert- **API Vérification** : Capgo vérifie les sommes de contrôle avant d'accepter les offres groupées- **Vérification du plugin** : le plugin mobile vérifie les sommes de contrôle avant d'appliquer les mises à jour
## meilleures pratiques
1. **Gestion des bundles (versions)** : utilisez le versioning sémantique de manière cohérente2. **Optimisation du stockage** : supprimez périodiquement les bundles inutilisés3. **Compatibilité du bundle (version)** : définissez les exigences minimales appropriées de la version native4. **Stratégie de sauvegarde** : conserver les sauvegardes des bundles critiques (versions)
## Points de terminaison
### OBTENIR
`https://api.capgo.app/bundle/`
Récupérez les informations sur le bundle. Renvoie 50 lots par page.
#### Paramètres de requête- `app_id` : obligatoire. L'ID de votre application- `page` : Facultatif. Numéro de page pour la pagination
#### Type de réponse
```typescriptinterface Bundle { app_id: string bucket_id: string | null checksum: string | null created_at: string | null deleted: boolean external_url: string | null id: number minUpdateVersion: string | null name: string native_packages: Json[] | null owner_org: string r2_path: string | null session_key: string | null storage_provider: string updated_at: string | null user_id: string | null}Exemple de demande
Section titled “Exemple de demande”# Get all bundlescurl -H "authorization: your-api-key" \ "https://api.capgo.app/bundle/?app_id=app_123"
# Get next pagecurl -H "authorization: your-api-key" \ "https://api.capgo.app/bundle/?app_id=app_123&page=1"Exemple de réponse
Section titled “Exemple de réponse”{ "data": [ { "id": 1, "app_id": "app_123", "name": "1.0.0", "checksum": "abc123...", "minUpdateVersion": "1.0.0", "storage_provider": "r2", "created_at": "2024-01-01T00:00:00Z", "updated_at": "2024-01-01T00:00:00Z", "deleted": false, "owner_org": "org_123", "user_id": "user_123" } ]}SUPPRIMER
Section titled “SUPPRIMER”https://api.capgo.app/bundle/
Supprimez un ou tous les bundles pour une application. À utiliser avec prudence car cette action ne peut pas être annulée.
Paramètres de requête
Section titled “Paramètres de requête”Pour supprimer un bundle spécifique :
interface BundleDelete { app_id: string version: string}Pour supprimer tous les bundles :
interface BundleDeleteAll { app_id: string}Exemples de requêtes
Section titled “Exemples de requêtes”# Delete specific bundlecurl -X DELETE \ -H "authorization: your-api-key" \ -H "Content-Type: application/json" \ -d '{ "app_id": "app_123", "version": "1.0.0" }' \ https://api.capgo.app/bundle/
# Delete all bundlescurl -X DELETE \ -H "authorization: your-api-key" \ -H "Content-Type: application/json" \ -d '{ "app_id": "app_123" }' \ https://api.capgo.app/bundle/Réponse réussie
Section titled “Réponse réussie”{ "status": "ok"}POSTER
Section titled “POSTER”https://api.capgo.app/bundle/
Créez un nouveau bundle avec une URL externe.
Corps de la demande
Section titled “Corps de la demande”interface CreateBundleBody { app_id: string version: string external_url: string // Must be publicly accessible HTTPS URL checksum: string}Exemple de demande
Section titled “Exemple de demande”curl -X POST \ -H "authorization: your-api-key" \ -H "Content-Type: application/json" \ -d '{ "app_id": "com.example.app", "version": "1.2.3", "external_url": "https://your-storage.com/bundles/app-1.2.3.zip", "checksum": "a1b2c3d4e5f6789abcdef123456789abcdef123456789abcdef123456789abcd" }' \ https://api.capgo.app/bundle/Réponse réussie
Section titled “Réponse réussie”{ "status": "ok"}POST (Métadonnées)
Section titled “POST (Métadonnées)”https://api.capgo.app/bundle/metadata
Mettez à jour les métadonnées du bundle telles que les informations sur les liens et les commentaires.
Corps de la demande
Section titled “Corps de la demande”interface UpdateMetadataBody { app_id: string version_id: number // bundle (version) id link?: string comment?: string}Exemple de demande
Section titled “Exemple de demande”curl -X POST \ -H "authorization: your-api-key" \ -H "Content-Type: application/json" \ -d '{ "app_id": "app_123", "version_id": 456, "link": "https://github.com/myorg/myapp/releases/tag/v1.0.0", "comment": "Fixed critical bug in authentication" }' \ https://api.capgo.app/bundle/metadataRéponse réussie
Section titled “Réponse réussie”{ "status": "success"}METTRE
Section titled “METTRE”https://api.capgo.app/bundle/
Définissez un forfait sur une chaîne spécifique. Cela relie un bundle (version) à un canal de distribution.
Corps de la demande
Section titled “Corps de la demande”interface SetChannelBody { app_id: string version_id: number // bundle (version) id channel_id: number}Exemple de demande
Section titled “Exemple de demande”curl -X PUT \ -H "authorization: your-api-key" \ -H "Content-Type: application/json" \ -d '{ "app_id": "app_123", "version_id": 456, "channel_id": 789 }' \ https://api.capgo.app/bundle/Réponse réussie
Section titled “Réponse réussie”{ "status": "success", "message": "Bundle 1.0.0 set to channel production"}Gestion des erreurs
Section titled “Gestion des erreurs”Scénarios d’erreur courants et leurs réponses :
// Bundle not found{ "error": "Bundle not found", "status": "KO"}
// Invalid bundle (version) format{ "error": "Invalid version format", "status": "KO"}
// Storage error{ "error": "Failed to delete bundle from storage", "status": "KO"}
// Permission denied{ "error": "Insufficient permissions to manage bundles", "status": "KO"}Cas d’utilisation courants
Section titled “Cas d’utilisation courants”- Nettoyer les anciens bundles (versions)
// Delete outdated beta bundles (versions){ "app_id": "app_123", "version": "1.0.0-beta.1"}- Réinitialisation de l’application
// Remove all bundles to start fresh{ "app_id": "app_123"}Considérations sur le stockage
Section titled “Considérations sur le stockage”- Politique de rétention : définissez la durée de conservation des anciens bundles
- Gestion de la taille : surveillez la taille des bundles et l’utilisation du stockage
- Stratégie de sauvegarde : envisagez de sauvegarder les bundles (versions) critiques
- Optimisation des coûts : supprimez les offres groupées inutiles pour optimiser les coûts de stockage