Passer au contenu principal
Étude de cas

Comment Rapido Cloud gère la mise en production de Semantic Release avec Capgo CapacitorUpdater

Voici comment j'ai configuré la mise en production de Semantic Release pour gérer les mises à jour de mes applications qui utilisent Capgo CapacitorUpdater

Rupert Barrow

Rupert Barrow

Responsable de la communication du contenu

Comment Rapido Cloud gère la mise en production de Semantic Release avec Capgo CapacitorUpdater

1. Introduction

Au sein de Rapido Cloud (www.rapido.cloud), je développe une application mobile pour les clients Salesforce qui peuvent facilement déployer leur propre application mobile personnalisée sans passer par les difficultés des boucles de Salesforce Mobile SDK ou de l'éditeur de publication Salesforce Mobile.

J'ai développé cette application mobile sur une plateforme moderne et « standard » avec des composants et des outils largement répandus, notamment Ionic 8, Angular 18, TypeScript, Capacitor et maintenant Capgo CapacitorUpdater. Ces derniers sont plus simples à gérer pour les clients qui ne veulent pas gérer les spécificités de la plateforme Salesforce, comme les composants Lightning Web ; et c'est plus facile et moins coûteux pour moi de recruter des développeurs et des mainteneurs d'applications mobiles Ionic + Angular.

Cet article explique mon design, mes choix et ma mise en œuvre qui font de Capgo et semantic-release un choix très réussi sans aucune surprise pour gérer tous les déploiements automatiquement via Github Actions. Toute cette chose a été conçue, testée et documentée pendant la période de 14 jours de gratuité de Capgo CapacitorUpdater.

2. Pourquoi utiliser Capgo ? Pourquoi utiliser semantic-release ?

Capgo CapacitorUpdater m'a attiré par sa promesse de rendre les déploiements d'applications mobiles beaucoup plus simples, beaucoup plus rapides et flexibles que le processus standard de livraison Apple AppStore/Google PlayStore.

I was rather afraid of the learning curve to make this successful but I got my app onto Apple TestFlight quite easily. I was then in position to use Capgo CapacitorUpdater to deploy my updates much faster.

J'étais plutôt effrayé par la courbe d'apprentissage pour faire cela réussir mais j'ai pu mettre mon application sur Apple TestFlight avec facilité. J'ai ensuite pu utiliser Capacitor CapacitorUpdater pour déployer mes mises à jour beaucoup plus rapidement.

So Capgo CapacitorUpdater m'a aidé à mettre à jour mon application sur mon appareil mobile, en direct, 1 minute après avoir enregistré une nouvelle fonctionnalité ou une correction dans mon code source code : tellement soulageant, et si flexible, et facile à configurer !

3. Mon modèle de branchement et de mise en production, et comment semantic-release s'y insère

Maintenant que j'ai ma livraison vers les Capgo serveurs fonctionnant correctement, j'ai besoin d'automatiser cela et de l'intégrer dans ma chaîne d'intégration/chaîne de livraison.

C'est ainsi que j'organise mon modèle de branchement et de mise en production

Pour chaque application, qu'il s'agisse de mobile, web ou Salesforce :

  • la mise au point a lieu sur feature/... se débranche en main, et elles sont fusionnées dans main qui est la référence pour la plupart des branches de développement, à l'exception de la maintenance et des fonctionnalités spécifiques pour les livraisons personnalisées (en savoir plus ci-dessous)
  • les déploiements sont déclenchés à partir des branches de mise en production ce qui peut être : production, branches de préversion (alpha, beta, nightly, etc.) et aussi des branches spécifiques au client ou au contexte pour des livraisons personnalisées
  • les déploiements sont déclenchés par une demande de tirage étant fusionnés dans une branche de déploiement. Je n'utilise pas les déploiements déclenchés par des tags car semantic release gère les tags et le reste pour moi.

En résumé, c'est le flux Gitlab :

Flux Gitlab

Flux Gitlab - source https://faun.dev/c/stories/manuelherrera/git-branching-strategies-in-2022

Remarque secondaire sur la façon dont semantic-release fonctionne :

Dans une branche de déploiement, lorsque semantic-release est déclenché, il calculera automatiquement le nouveau numéro de version sur cette branche, en fonction du numéro de version du tag précédent sur la branche et des correctifs ou fonctionnalités livrés. Les correctifs créeront une nouvelle version de patch, tandis que les fonctionnalités créeront une nouvelle version mineure. Il inclut également automatiquement le préversion alpha, beta, etc. dans le numéro de version.

La mise en production semantique génère le changelog à partir de vos commits, regroupant les correctifs et les fonctionnalités comme définis dans les commits conventionnels (voir https://www.conventionalcommits.org/en/about) et configurés dans la mise en production semantique.

Elle mettra également à jour toutes vos demandes de tirage de code (Github, dans mon cas) et les problèmes liés avec des commentaires les liant à la balise et à la mise en production. Enfin, dans cette Github mise en production, elle attache les éléments tels que les sources code, les binaires si nécessaire, etc. CHANGELOG.md4. Branches, mises en production/pré-mises en production, canaux dans la mise en production semantique et dans __CAPGO_KEEP_0__

Alors, pour les déploiements Capgo de la mise en production semantique, je veux que cela fasse les choses suivantes.

So what I want semantic release to do for Capgo deployments is the following.

__CAPGO_KEEP_0__ ont développé et documenté leur propre version de la « Conventional Commits »

Capgo have developed and documented their own version of the “Conventional Commits” standard-version https://__CAPGO_KEEP_0__.com/Cap-go/standard-version standard-version (https://github.com/Cap-go/standard-version), and their own capacitor-standard-version (https://github.com/Cap-go/capacitor-standard-versionet aussi capacitor-plugin-standard-version (https://github.com/Cap-go/capacitor-plugin-standard-versionrepos. Ils ont documenté sur leur blog le schéma de version utilisé par Capgo dans leurs déploiements (https://capgo.app/blog/comment-fonctionne-la-versionnage-dans-capgo/)Les fichiers de bundles JavaScript suivent la « standard » semver « Semantic Versioning » (https://semver.org semantic-release ) qui

suivent également (évidemment !) semantic-release C'est super, et c'est un soulagement pour moi car je les utilise

de manière intensive. Je veux aussi que semantic release génère les déploiements d'applications sur différents canaux

As mentionné ci-dessus, j'ai besoin de déployer une version de préversion à partir de branches telles que alpha, beta, nightly etc., mais aussi des versions spécifiques aux clients sur des branches telles que production-customer-jones, production-customer-doe, etc.

Capgo fournit la fonctionnalité des « canaux » qui est exactement ce que semantic release prend également en charge, donc je suis impatient de les faire fonctionner ensemble. Ces derniers s'insèrent également dans les différentes builds de branches gérées par XCode Cloud (voir plus sur cela ci-dessous).

Les numéros de version Semver générés par semantic release sur les préversions ressemblent à 1.0.0-alpha.1. Les builds successives sur cette branche incrémenteront le numéro de build à 1.0.0-alpha.2, etc. Bien que ces numéros de version ne soient pas documentés explicitement, ils sont pris en charge par Capgo, ce qui est une excellente nouvelle pour moi : je vais utiliser les canaux de semantic release et les préversions pour générer des versions de mon application avec Capgo canaux.

5. Comment puis-je utiliser Capgo pour lancer ma application ?

Pour automatiser le déploiement de vos fichiers de l'application vers Capgo, vous devez utiliser la commande Capgo CLI bundle upload. Tapez npx @capgo/cli@latest bundle upload --help pour obtenir les nombreuses options d'upload. Parmi celles-ci, nous utiliserons les suivantes :

npx @capgo/cli bundle upload --channel $CHANNEL --apikey $CAPGO_APIKEY --bundle $VERSION --bundle-url $CAPGO_APPID
  • CHANNEL est le canal Capgo auquel nous voulons déployer (par exemple alpha)
  • VERSION est généré par semantic release (par exemple 1.0.0-alpha.1)
  • CAPGO_APIKEY est fourni par Capgo pour identifier de manière unique votre pipeline de CI/CD de connexion
  • CAPGO_APPID est fourni par Capgo pour identifier de manière unique votre application (par exemple com.mystartup.mysuperapp)

6. Mon semantic release + Capgo CapacitorUpdate configuration

Enfin, comment cela s'insère-t-il tous ensemble ?

Les versions de l'ensemble de l'application construites avec semantic release et Github Actions

Les versions de l'ensemble de l'application construites avec semantic release et Github Actions

Automatisation de la mise à jour avec semantic release et Github Actions

La beauté de semantic release est que l'automatisation de la mise à jour, sous forme d'un workflow Github Actions, est très simple. Cela ressemblera beaucoup aux autres plateformes de CI/CD.

# ./github/workflows/release.yml

name: Release

on:
  workflow_dispatch:
  push:
    branches: [alpha, alpha-nocapgo, dev-rupert]    # <--- adapt this

env:
  CAPGO_APPID: com.mystartup.mysuperapp             # <--- adapt this
  CAPGO_APIKEY: ${{ secrets.CAPGO_APIKEY }}

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-node@v6
        with:
          node-version: 24
          cache: "npm"
      - run: npm install
      - run: npx semantic-release
        env:
          DEBUG: true
          GITHUB_TOKEN: ${{ github.token }}

Cela installe simplement l'environnement NodeJS, puis appelle semantic release.

Pour chaque marge sur une branche listée dans branches, semantic release déclenchera une mise à jour. Définissez CAPGO_APIKEY vos secrets de dépôt. Mettez à jour votre CAPGO_APPID ici.

Le comportement de la mise en production semantique est défini dans son .releaserc.json fichier de configuration. Voici mes paramètres, expliqués ci-dessous :

// .releaserc.json

{
  "branches": [
    {
      "name": "release",
      "channel": "production"
    },
    {
      "name": "alpha",
      "channel": "alpha",
      "prerelease": "alpha"
    },
    {
      "name": "alpha-nocapgo",
      "channel": "alpha",
      "prerelease": "alpha-nocapgo"
    },
    {
      "name": "dev-rupert",
      "channel": "development",
      "prerelease": "development"
    },
    {
      "name": "dev-paul",
      "channel": "development",
      "prerelease": "development"
    }
  ],
  "ci": true,
  "debug": true,
  "dryRun": false,
  "repositoryUrl": "https://github.com/RupertBarrow/mysuperapp",

  "verifyConditions": ["@semantic-release/github"],

  "plugins": [
    [
      "@semantic-release/commit-analyzer",
      {
        "preset": "angular",
        "releaseRules": [
          { "type": "breaking", "release": "major" },
          { "type": "feat", "release": "minor" },
          { "type": "fix", "release": "patch" },
          { "type": "ci", "release": "patch" },
          { "type": "doc", "release": "patch" },
          { "type": "docs", "release": "patch" },
          { "type": "refactor", "scope": "core-*", "release": "minor" },
          { "type": "refactor", "release": "patch" },

          { "scope": "no-release", "release": false }
        ]
      }
    ],

    "@semantic-release/release-notes-generator",

    ["@semantic-release/changelog", { "changelogFile": "CHANGELOG.md" }],

    [
      "@semantic-release/git",
      {
        "assets": ["package.json", "CHANGELOG.md", "ios/App/App.xcodeproj/project.pbxproj"],
        "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
      }
    ],

    ["@semantic-release/github", { "assets": ["CHANGELOG.md"] }],

    [
      "@semantic-release/exec",
      {
        "prepareCmd": "npm run build",
        "publishCmd": "npm add -D @capgo/cli && npx @capgo/cli bundle upload --channel ${branch.channel} --apikey $CAPGO_APIKEY --bundle ${nextRelease.version} --bundle-url $CAPGO_APPID"
      }
    ]
  ]
}
  • branches :
    • branches configure les branches (name), mappées au canal Capgo (channel) et comment le numéro de version préalable sera appelé (prerelease). Par exemple, si branch.prerelease = "development", le numéro de version généré par la mise en production semantique sera x.y.z-development.n
    • les déploiements vers le alphaet les alpha-nocapgo branches déployeront tous deux l'application sur le alphamais avec des noms de version de préversion différents
    • les déploiements vers les branches développeurs dev-rupertou dev-paul se déploieront tous les deux vers le developmentcanal sur Capgo, tous avec le même developmentmot-clé de préversion dans la version du numéro
  • verifyConditions : lors de la première étape de la mise en œuvre de la release semantique, il vérifie qu'il a accès correctement à Github. J'espère ajouter une vérification d'authentification pour le Capgo CLI ici plus tard
  • @semantic-release/commit-analyzer : des choses standard de la mise en œuvre de la release semantique - voir leur documentation (https://github.com/semantic-release/semantic-release?tab=readme-ov-file#commit-message-format)
  • @semantic-release/release-notes-generator : générer le fichier de changelog comme CHANGELOG.md
  • @semantic-release/git : commiter les fichiers suivants qui ont été mis à jour par la construction Ionic de l'application et par le travail de la mise en œuvre de la release semantique (package.json, CHANGELOG.md et ios/App/App.xcodeproj/project.pbxproj - Je ne construis pas pour Android, pourtant)
  • @semantic-release/github : attachez le CHANGELOG.md fichier à la Github version en tant qu'asset
  • @semantic-release/exec: utilisez ces 2 commandes pour préparer la construction de l'application (prepareCmd) et puis pour construire et déployer effectivement l'application bundle sur les serveurs Capgo (publishCmd)

Vous remarquerez qu'il n'y a pas de manipulation pour expliquer comment nous voulons que le numéro de version soit calculé et incrémenté, comment nous devons générer un changelog, un Github tag ou une version, etc. : tout est géré par défaut par semantic release, avec une configuration minimale.

Construction de nouveaux binaires avec XCode Cloud

Intégration de tout cela avec XCode Cloud pour construire de nouvelles versions du fichier binaire de l'application est simple (Je ne déploie pas encore sur Google Play, mais cette construction devrait être similaire) :

  • J'ai configuré un processus XCode Cloud pour construire lorsque il y a une modification sur la branche que je souhaite utiliser pour cela (par exemple production)
  • sur cette branche, j'ai configuré XCode Cloud pour construire uniquement lorsque le CHANGELOG.md fichier est mis à jour. Cela est mis à jour après chaque version générée par semantic release
  • Je peux déclencher des constructions sur différentes branches pour simuler le déploiement pour différents canaux. Dans chaque configuration de construction XCode Cloud sur une branche différente, j'ai défini manuellement une variable d'environnement avec la valeur de branch.channel configuré dans releaserc.json (oui, c'est une duplication manuelle) et puis, si je le voulais, je pourrais déployer une autre application AppStore pour chaque application cliente personnalisée déployée à partir d'une branche de lancement personnalisée, comme mentionné précédemment.

Construction de fichiers d'application sur XCode Cloud avec des canaux Capgo

Construction de fichiers d'application sur XCode Cloud avec des canaux Capgo

7. Conclusion

En conclusion, je suis très heureux d'avoir pu intégrer Capgo CapacitorUpdater dans mon pipeline de lancement sémantique standard, rapidement dans le délai de la période d'essai de 14 jours, et le résultat est le suivant :

  • les numéros de version des bundles sont générés automatiquement par la lancement sémantique et sont compatibles avec les serveurs Capgo
  • la lancement sémantique déploye automatiquement les bundles d'application Capgo, en utilisant également les canaux Capgo
  • cela s'intègre bien avec les constructions de fichiers d'application XCode Cloud

Étapes suivantes

Je suis actuellement en phase de développement de cette application. Je vais la rendre rapidement disponible aux testeurs via TestFlight (pour iOS). Étant donné la puissance de Capgo, je vais certainement déployer une version gratuite de l'application sur l'AppStore pour les tests, qui sera mise à jour régulièrement avec Capgo pendant les tests. Je vais ensuite déployer une autre (payante) version de l'application sur l'AppStore, sous un autre enregistrement, et la mettre à jour régulièrement avec Capgo.

J'espère ajouter une vérification pré-construction améliorée de Capgo bundle upload prérequis dans ma configuration de release semantique.

J'ai maintenant une pipeline de release semantique propre, simple et réplicable pour les futures applications mobiles développées avec Ionic + Angular + Capacitor.

Auteur - Rupert Barrow

J'ai plus de 22 ans d'expérience de Salesforce, en tant que client et utilisateur, en tant que partenaire et intégrateur, architecte, développeur, analyste commercial et consultant. J'ai co-fondé et co-géré Altius Services en tant que COO et CTO pendant 13 ans, un partenaire SI de Salesforce réussi en France, avant de partir à une nouvelle aventure en tant que solopreneur Salesforce avec mon Rapido Cloud offre de produit.

Vous pouvez me trouver sur LinkedIn à https://linkedin.com/in/rbarrow.

Vous pouvez jeter un coup d'œil sur nos offres Salesforce à https://www.rapido-companion.app et https://www.rapido.cloud (en cours de développement).

Continuez à partir de Comment Rapido Cloud gère la mise à jour semestrielle avec Capgo CapacitorUpdater

Si vous utilisez Comment Rapido Cloud gère la mise à jour semestrielle avec Capgo CapacitorUpdater pour planifier la livraison d'actualisations en direct, connectez-le à Capgo Mises à jour en direct for the product workflow in Capgo Live Updates, pour les détails d'implémentation dans Vue d'ensemble Caractéristiques pour les détails d'implémentation dans Caractéristiques Comportement de mise à jour Comportement de mise à jour pour les détails d'implémentation dans Mise à jour du comportement, et Types de mise à jour pour les détails d'implémentation dans Types de mise à jour.

Mises à jour en temps réel pour les applications Capacitor

Lorsqu'un bug de la couche web est en ligne, expédiez la correction par le biais de Capgo au lieu d'attendre des jours pour l'approbation de la boutique d'applications. Les utilisateurs reçoivent la mise à jour en arrière-plan tandis que les changements natifs restent dans la voie de revue normale.

Commencez dès maintenant

Dernières actualités de notre Blog

Capgo vous donne les meilleures informations dont vous avez besoin pour créer une application mobile vraiment professionnelle.