JS monorepos en prod 6 : CI/CD, intégration continue et déploiement avec Travis CI

La mise en œuvre de CI d’intégration continue et de déploiement continu (CD) sur un monorepo est assez complexe en raison de la diversité des responsabilités multiples entre les développeurs et de la nécessité de coordonner plusieurs packages. Cet article présente les avantages d’un monorepo intégré à un pipeline CI/CD. Il teste et déploie une telle application à l’aide de Travis CI.

Dans le article précédent discutant des tests unitaires, nous avons utilisé Moka et Devrait.js pour créer des tests unitaires. Ils ont été exécutés sur notre machine locale. L’intégration continue est la pratique consistant à automatiser l’exécution de plusieurs tâches, y compris l’exécution des tests unitaires, chaque fois qu’un commit est poussé vers un référentiel Git distant. Le pipeline CI/CD exécutant les tests fournit des retours, aide à l’intégration des fonctionnalités et automatise le déploiement des nouvelles versions.

Cet article fait partie d’une série relative aux bonnes pratiques JS monorepos :

Exécution de tous les tests en même temps

La lerna run La commande est pratique lorsqu’il s’agit d’exécuter la même commande Yarn ou NPM sur tous les packages qu’elle gère. La lerna run test exécute le test commande de chaque package lors de son enregistrement.

UN test script à la racine package.json fichier enregistre le yarn test commande:


  "scripts": 
    "postinstall": "husky install",
    "test": "lerna run test"  

Activation CI/CD entre GitHub et Travis CI

Le dépôt du projet utilisé pour illustrer la série d’articles est hébergé sur GitHub. Cet article intègre le projet avec une plateforme CI/CD pour automatiser l’exécution des tests et publier les nouvelles versions sur le registre des MNP.

La plateforme CI/CD est Travis CI. Travis était gratuit pour tous les projets open source sans aucune limitation. Cependant, après une acquisition récente et l’objectif d’augmenter les bénéfices (pas de jugement ici), cette offre a été restreinte. Depuis fin 2020, Travis CI propose désormais un plan gratuit pour les dépôts privés et open source, mais il est limité à 10 000 crédits. Pour en savoir plus sur les tarifs de Travis CI, consultez notre leurs projets.

Vous pouvez choisir plusieurs plates-formes CI/CD. Nous avons choisi Travis parce que nous l’utilisons depuis longtemps et pour la qualité et la simplicité de la plateforme. Les étapes présentées ci-dessous sont similaires pour la solution alternative. Dans un article de suivi, nous obtiendrons les mêmes résultats avec les actions GitHub.

Pour utiliser Travis CI, vous n’avez pas besoin de créer de compte, connectez-vous simplement avec votre compte GitHub. Une fois connecté, rendez-vous sur votre page des paramètres où vos référentiels sont synchronisés depuis GitHub. Si vous ne trouvez pas votre référentiel, cliquez sur le bouton « Synchroniser le compte » sous votre nom. Vous allez maintenant pouvoir retrouver votre repository et l’activer.




Activation du référentiel

Pour indiquer comment exécuter les tests sur la plate-forme, Travis CI recherche un .travis.yml fichier à la racine du projet. Notre dossier est simple :

language: node_js
node_js:
  - '14'
cache:
  yarn: true
  directories:
    - "node_modules"
script:
  - yarn test

La yarn test sur Travis CI est déclenché une fois que nous avons poussé le changement à distance sur GitHub :

echo '!.travis.yml' >> .gitignore
git add .gitignore .travis.yml package.json
git commit -m "build: travis activation"
git push

À la fin, l’écran Travis CI informe du succès de l’exécution.




Construction de Travis CI

Communiquer sur le statut du CI

Vous pouvez insérer un badge Travis CI sur votre fichier readme ou à un autre emplacement. Il indique l’état de votre build actuel :

<a href="https://travis-ci.org/#!/adaltas/remark-gatsby-plugins">
  <img src="https://api.travis-ci.org/adaltas/remark-gatsby-plugins.svg" alt="Build Status" />
</a>

Dans Markdown, le badge ressemble à :

[![Build Status](https://api.travis-ci.org/adaltas/remark-gatsby-plugins.svg)](https://travis-ci.org/#!/adaltas/remark-gatsby-plugins)

Exécuter Travis CI localement avec Docker

Vous pouvez obtenir un environnement entièrement reproductible de votre environnement Travis Docker. Il y a quelques semaines, nous partageons des instructions détaillées pour recréer le même conteneur Travis Docker sur votre ordinateur local.

Livraison continue

Les tests sont maintenant exécutés sur chaque build. En supposant qu’une nouvelle version est présente dans le commit actuel, nous pouvons émettre le lerna publish commande depuis la plate-forme CI/CD.

Avec Lerna, nous pouvons utiliser à la fois le lerna publish from-package et lerna publish from-git commandes. Je trouve que le deuxième est meilleur. Il recherche la balise de version dans le commit actuel. S’il est présent, il extrait la version et publie une nouvelle version sur un registre NPM.

Considérons notre package prêt à être diplômé et le cycle d’avant-première existe. Par exemple, nous voulons que notre title-to-frontmatter forfait pour obtenir son diplôme 1.0.0-alpha.3 à 1.0.0.

Travis CI doit d’abord être configuré pour déployer le package. Modifier le travis.yml en ajoutant:

before_deploy:
  - echo "//registry.npmjs.org/:_authToken=\$NPM_TOKEN" >> $HOME/.npmrc 2> /dev/null
deploy:
  provider: script
  script: "yarn run publish"
  on:
    node: "14"
    tags: true

La on La propriété est de conditionner l’exécution du déploiement à la version de Node.js, au cas où nous testerions plusieurs versions, et la présence de balises dans le commit actuel. Le déploiement se produit uniquement lorsque toutes les conditions sont remplies.

La provider et script les propriétés indiquent l’utilisation de la commande personnalisée yarn run publish pour déployer notre package. La package.json le fichier est mis à jour pour refléter la dernière commande :


  "scripts": 
    "postinstall": "husky install",    "publish": "lerna publish from-git --yes",
    "test": "lerna run test"
  

Commitons les modifications :

git commit -a -m 'build: publish script'

Le déploiement d’un package sur le registre NPM nécessite des informations d’identification de l’utilisateur. Bien sûr, nous ne voulons pas partager nos informations d’identification sur un référentiel public. Même sur un référentiel privé, vous ne stockerez jamais d’informations sensibles telles que des mots de passe, des secrets et des certificats. Au lieu de cela, nous utilisons des variables d’environnement configurées dans Travis CI. L’avantage des variables d’environnement lorsqu’elles sont bien déclarées, elles n’ont pas à apparaître dans les fichiers journaux.

La NPM_TOKEN la valeur est obtenue à partir de votre Compte MNP. Allez sur la page “Access Tokens” et cliquez sur “Générer un nouveau jeton”. Dans la liste, sélectionnez le type “Publier”. NPM déclare que le jeton “Automation” est “adapté aux flux de travail CI/CD”, mais cela n’a tout simplement pas fonctionné pour moi. Je pense que c’est parce que 2FA n’est pas encore activé sur mon compte.

Copiez la valeur et collez-la dans la section “Paramètres > Variables d’environnement” du projet dans Travis CI :




Variables d'environnement dans Travis CI

Le projet a un nouveau deploy l’instruction et la NPM_TOKEN la variable à l’intérieur est enregistrée dans Travis CI. Nous sommes maintenant prêts à déployer la nouvelle version. La lerna version commande offre la --conventional-graduate drapeau:

lerna version --conventional-commits --conventional-graduate
info cli using local version of lerna
lerna notice cli v3.22.1
lerna info versioning independent
lerna WARN conventional-graduate all packages
lerna info Graduating all prereleased packages
lerna info Looking for changed packages since [email protected]
lerna info ignoring diff in paths matching [ '**/test/**' ]
lerna info getChangelogConfig Successfully resolved preset "conventional-changelog-angular"

Changes:
 - gatsby-remark-title-to-frontmatter: 1.0.0-alpha.3 => 1.0.0
 - gatsby-caddy-redirects-conf: 0.1.0-alpha.3 => 0.1.0

? Are you sure you want to create these versions? Yes
lerna info execute Skipping releases
lerna info git Pushing tags...
lerna success version finished

Les packages sont maintenant officiellement disponibles pour la communauté.

Aide-mémoire

  • Ajouter un test script à la racine package.json fichier enregistre le yarn test commande:
    
      "scripts": 
        "postinstall": "husky install",
        "test": "lerna run test"
      
    
  • Créer un .travis.yml fichier à la racine du projet pour indiquer comment exécuter les tests sur la plateforme :
    language: node_js
    node_js:
      - '14'
    cache:
      yarn: true
      directories:
        - "node_modules"
    script:
      - yarn test
  • Validez les modifications :
    echo '!.travis.yml' >> .gitignore
    git add .gitignore .travis.yml package.json
    git commit -m "build: travis activation"
    git push
  • Ajoutez le badge au fichier README.md :
    [![Build Status](https://api.travis-ci.org/adaltas/remark-gatsby-plugins.svg)](https://travis-ci.org/#!/adaltas/remark-gatsby-plugins)
  • Pour déployer le package, modifiez le .travis.yml en ajoutant:
    before_deploy:
      - echo "//registry.npmjs.org/:_authToken=\$NPM_TOKEN" >> $HOME/.npmrc 2> /dev/null
    deploy:
      provider: script
      script: "yarn run publish"
      on:
        node: "14"
        tags: true
  • Ajouter un script au package.json:
    
      "scripts": 
        "postinstall": "husky install",
        "publish": "lerna publish from-git --yes",
        "test": "lerna run test"
      
    
  • Validez les modifications :
    git commit -a -m 'build: publish script'
  • La NPM_TOKEN valeur obtenue à partir de la page NPM “Access Tokens”. Sélectionnez le jeton « Publier » ou le jeton « Automatisation » si 2FA est activé. Copiez la valeur et collez-la dans la section “Paramètres > Variables d’environnement” du projet dans Travis CI.

Conclusion

Nous avons expliqué comment implémenter un flux de travail d’intégration continue dans votre monorepo à l’aide de Travis CI, ainsi que comment créer un processus de travail de livraison continue pour déployer votre package sur le registre NPM.

Récemment, Travis CI Soulève des questions de la communauté open source sur l’avenir de son support open source. Cela fait suite à leur récente annonce concernant les modifications des prix de Travis CI. En réponse, ils ont assuré que “des ressources sont disponibles pour tous les développeurs et équipes ainsi que des améliorations des performances globales et de la stabilité de la plateforme”. Mais ce n’est tout simplement pas ce qui se passe. Par exemple, les pipelines CI/CD de nos projets open source ont démarré avec quelques heures de retard. Pour autant que tout le monde puisse le dire, ils offrent des minutes gratuites dans des attributions mensuelles fixes. Il n’y a qu’un certain nombre de minutes au total qu’ils sont prêts à donner. Ces changements ont été initiés en 2019 lorsque Travis CI a été acquis par Idera, une société de capital-investissement. Il reste cependant une excellente plateforme pour les projets non open source.

Dans le prochain article, nous couvrons CI/CD à l’aide de GitHub Actions, un outil qui facilite l’automatisation des workflows logiciels.

Leave a Reply