2
votes

Le package global Azure DevOps Pipeline installe les meilleures pratiques

Pour notre pipeline, nous avons deux agents auto-hébergés Windows installés sur le même ordinateur. Notre principal pipeline frontal .yml est répertorié ci-dessous. Cela fonctionne bien, sauf pour une raison quelconque, l' npm install ne reçoit pas nx ou jest. Pour résoudre ce problème, nous pouvons simplement exécuter npm install -g nx et npm install -g jest une fois dans le pipeline pour chaque agent. Après la première exécution, tout va bien et nous pouvons supprimer les installations supplémentaires pour accélérer l'exécution. Cependant, il ne sera pas mis à jour lorsque de nouvelles versions de nx ou de jest seront publiées et ce n'est certainement pas les meilleures pratiques.

Je suppose que le problème est que ceux-ci doivent être installés globalement pour fonctionner, de sorte que l' npm install standard de npm install ne peut pas y parvenir. J'ai inclus une version légèrement modifiée de notre package.json qui montre que nx (@nrwl) et jest sont inclus dans le package. Quelqu'un connaît-il un meilleur moyen d'installer nx et jest sans les réinstaller à chaque build de pipeline et sans supprimer les instructions d'installation après la première exécution avec un nouvel agent? Merci d'avance pour vos suggestions, merci de me faire savoir si je peux fournir des informations supplémentaires.

{
  "name": "project",
  "version": "1.0.0",
  "scripts": {
    "install:hard": "rimraf \"node_modules/!(rimraf)\" && npm cache clear --force && npm install",
    "install:globals": "npm install -g jest-cli @nrwl/cli",
    "postinstall": "ngcc"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "~9.1.4",
    "@angular/common": "~9.1.4",
    "@angular/compiler": "~9.1.4",
    "@angular/core": "~9.1.4",
    "@angular/forms": "~9.1.4",
    "@angular/localize": "^9.1.6",
    "@angular/platform-browser": "~9.1.4",
    "@angular/platform-browser-dynamic": "~9.1.4",
    "@angular/router": "~9.1.4",
    "@ng-bootstrap/ng-bootstrap": "^6.1.0",
    "@ngneat/until-destroy": "^7.3.0",
    "angular-datatables": "^9.0.1",
    "angulartics2": "^9.1.0",
    "bootstrap": "^4.4.1",
    "core-js": "^3.1.4",
    "jest-junit": "^12.0.0",
  },
  "devDependencies": {
    "@nrwl/angular": "^10.3.0",
    "@nrwl/jest": "^10.3.0",
    "@nrwl/workspace": "^10.3.0",
    "jest": "^26.4.2",
    "jest-canvas-mock": "^2.3.0",
    "jest-cli": "^26.4.2",
    "jest-preset-angular": "^8.3.1",
    "jest-skipped-reporter": "0.0.5",
    "ts-jest": "^26.4.1",
    "typescript": "^3.8.3",
  }
}
trigger:
- none

pool: 'myPool'
variables:
  npm_config_cache: $(Pipeline.Workspace)/.npm

steps:
- checkout: self
  clean: true

- task: NodeTool@0
  inputs:
    versionSpec: '12.x'
  displayName: 'Install Node.js'

# Install stuff
- task: Npm@1
  timeoutInMinutes: 10
  inputs:
    command: 'install'
    workingDir: '$(System.DefaultWorkingDirectory)/ID_CLIENT'
  displayName: 'npm install'

# Test stuff
- script: nx affected:lint --base=origin/master --skip-nx-cache=true --parallel
  timeoutInMinutes: 10
  workingDirectory: '$(System.DefaultWorkingDirectory)/ID_CLIENT'
  displayName: 'run lint'

- script: 'jest --ci --reporters=default --reporters=jest-junit'
  timeoutInMinutes: 10
  workingDirectory: '$(System.DefaultWorkingDirectory)/ID_CLIENT'
  displayName: 'Run Tests'
  continueOnError: 'true'

# Build stuff
- script: nx affected:build --base=origin/master --skip-nx-cache=true --parallel
  timeoutInMinutes: 10
  workingDirectory: '$(System.DefaultWorkingDirectory)/ID_CLIENT'
  displayName: 'prod build'

# Publish test results to Azure Pipelines
- task: PublishTestResults@2
  timeoutInMinutes: 10
  inputs:
    testResultsFormat: 'JUnit'
    testResultsFiles: '**/junit.xml' 
    searchFolder: '$(System.DefaultWorkingDirectory)'
    failTaskOnFailedTests: true

Edit: J'ai essayé d'ajouter "nx": "^10.3.0" et "@nrwl/cli": "^10.3.0" aux dépendances dev, puis après l'installation, j'ai lancé npm run nx test . Cela m'a donné npm ERR! missing script: nx . Est-ce que je ne l'ai tout simplement pas ajouté correctement?


3 commentaires

nx versions nx et jest doivent être verrouillées dans package.json et non installées globalement, c'est certainement plus facile à maintenir. Je ne suis pas sûr à 100% de ce qui suit, mais il semble que vous puissiez également inclure nx dans devDependencies . Ensuite, dans votre appel de script , au lieu de nx affected:lint ... do npm run nx affected:lint . Tiens nous au courant de comment ça se passe.


J'ai essayé cela mais cela n'a pas semblé fonctionner, j'ai décrit ce que j'ai essayé dans mon article mis à jour. Si je ne l'ai pas fait correctement, faites-le moi savoir et je pourrai l'essayer différemment.


Vous pouvez soit ajouter un alias à votre package.json : "scripts": { "nx": "nx" } et utiliser npm run nx affected:lint . Ou essayez npx nx affected:lint si vous avez un npm suffisamment frais.


3 Réponses :


1
votes

Eh bien, si vous souhaitez maintenir vos outils globaux à jour et éviter d'exécuter ces commandes à chaque exécution de votre pipeline, créez un nouveau pipeline planifié pour l'exécuter une fois par jour et mettre à jour vos outils globaux.

Vous trouverez ici des documents sur les déclencheurs planifiés.

Mais cela peut ressembler à ceci:

schedules:
- cron: "0 0 * * *"
  displayName: Daily midnight build
  branches:
    include:
    - master
  always: true

steps:
- task: NodeTool@0
  inputs:
    versionSpec: '12.x'
  displayName: 'Install Node.js'
- script: npm install -g jest-cli @nrwl/cli


0 commentaires

1
votes

L'inconvénient de mettre à jour automatiquement des outils comme celui-ci est que les choses vont casser - sans que vous le sachiez - et revenir en arrière est un défi.

Oui, il est préférable d'avoir les dernières mises à jour, en particulier. pour les corrections de bogues, etc. Mais le succès à moyen terme signifie aussi la stabilité via l'épinglage des versions (majeures / mineures) est la clé lorsque les projets sont en production. C'est un peu plus de frais généraux pour créer vos propres images, mais pas beaucoup plus si vous utilisez déjà des agents auto-hébergés.

NPX

Npx est destiné à être utilisé globalement et puisque vous utilisez des agents auto-hébergés, créez une image d'agent personnalisée, préinstallée avec les versions npx que vous souhaitez. Voici un exemple de documentation Azure sur la création d'une image personnalisée avec Docker . Vous pouvez également utiliser une image de VM.

Ensuite, dans votre pipeline, spécifiez celui que vous voulez dans votre pipeline YAML:

pool: 'npx-10'

D'autres peuvent choisir une version différente

pool: 'npx-9'

Vous pouvez choisir le nom de l'image que vous souhaitez. Cela permet aux développeurs de choisir ce dont ils ont besoin.

plaisanter

Pourquoi avez-vous besoin de l'installer globalement?

Jest doit être spécifique au projet, répertorié comme une dépendance de développement dans le package.json du projet, et appelé via un script npm, par exemple npm run tests .


3 commentaires

Nous installons jest globalement car les npm run tests rapportaient pas correctement les tests. Nous avons donc dû utiliser jest --ci --reporters=default --reporters=jest-junit qui rapporterait les tests dans Azure DevOps comme prévu. Il y a peut-être une meilleure solution, mais je n'ai pas pu la comprendre.


Qu'est-ce qui n'a pas été signalé? Les résultats du test eux-mêmes? Ou faites-vous référence à la couverture du code? Je vérifierais également la configuration et comparerais les versions.


J'ai trouvé un travail qui ne nécessite pas le téléchargement global de plaisanterie. Cependant, je fais référence aux résultats des tests eux-mêmes. Lorsque nous utilisons npm run tests il exécute simplement le script nx affected:test --parallel --maxParallel=4 . Cela ne crée pas réellement de rapport, il affiche simplement les informations. Je reçois ce message d'avertissement dans Azure DevOps sur ma tâche de publication lorsque je n'utilise pas jest: ##[warning]No test result files matching **/junit.xml were found. Est-ce que je ne configure pas correctement quelque chose?



0
votes

J'ai fini par choisir la solution de Max Ivanov. Nous venons d'ajouter nx et l'alias au package.json et avons changé nos scripts de pipeline pour utiliser npm run nx ...

Cela a très bien fonctionné pour nous, mais je voudrais remercier Krzysztof Madej et julie-ng pour leurs réponses. Les deux sont très raisonnables et permettraient d'atteindre ce que nous voulions. J'ai fini par ne pas les utiliser car ils ne correspondent pas non plus à notre cas d'utilisation spécifique. Si quelqu'un regarde à travers ce post, je vous recommande de regarder toutes les réponses et de choisir celle qui vous convient le mieux.


0 commentaires