Nunit: Utiliser Azure Pipelines au lieu de Travis (et peut-ĂȘtre d'autres builds) ?

CrĂ©Ă© le 10 sept. 2018  Â·  13Commentaires  Â·  Source: nunit/nunit

Hé, sommes-nous intéressés à l'utiliser pour certaines ou toutes nos versions ? Nous n'avons pas de travaux parallÚles sur Travis et parfois les machines Travis ont des problÚmes de réseau. Cela a l'air assez excitant:

https://azure.microsoft.com/blog/announcing-azure-pipelines-with-unlimited-ci-cd-minutes-for-open-source/

À partir d'aujourd'hui, Azure Pipelines fournit gratuitement des minutes CI/CD illimitĂ©es et 10 tĂąches parallĂšles Ă  chaque projet open source. Tous les projets open source fonctionnent sur la mĂȘme infrastructure que nos clients payants. Cela signifie que vous bĂ©nĂ©ficierez des mĂȘmes performances rapides et de la mĂȘme qualitĂ© de service.

Image du lien :

Le lien montre également une intégration GitHub.

done build

Commentaire le plus utile

@chrisrpatterson J'ai une question, si vous me le rĂ©ponds lĂ -dessus. Je m'excuse, c'est un peu long pour ĂȘtre clair.

ProblĂšme

Nous avons 18 tests que nous aimerions publier, 6 pour chaque systĂšme d'exploitation (voir liste) .
(La raison pour laquelle le nombre ne peut pas ĂȘtre infĂ©rieur Ă  18 est que ces tests ont exactement les mĂȘmes noms. Chaque test s'exĂ©cute 18 fois, couvrant chaque combinaison de systĂšme d'exploitation et de framework cible. Si nous allions avec moins de tĂ©lĂ©chargements de tests, Azure DevOps fusionnerait le tests avec les mĂȘmes noms et nous ne serions pas en mesure de dire pour quel systĂšme d'exploitation et framework cible le test a Ă©chouĂ©.)

La tùche « Publier les résultats des tests » ne prend en charge que la création d'une seule exécution de test. Par conséquent, si nous avons 18 exécutions de test, nous devons répéter ce bloc 18 fois dans notre YAML :

  - task: PublishTestResults<strong i="12">@2</strong>
    displayName: Publish test results
    inputs:
      testResultsFormat: NUnit
      testResultsFiles: test-results\net45\*.xml
      mergeTestResults: true
      testRunTitle: net45/Windows
    condition: succeededOrFailed()

Cela rend le YAML dense et difficile à lire. En outre, les six cadres cibles spécifiques que nous soutenons peuvent changer à l'avenir. Nous oublierons invariablement que nous avons ce couplage avec les chemins test-results\net45\*.xml spécifiques et n'oublierons de corriger le YAML qu'une fois que nous remarquons que les résultats des tests sont manquants. Ce n'est juste pas trÚs satisfaisant.

Tentative d'automatisation

Étant donnĂ© que nous utilisons un script de gĂ©nĂ©ration Cake, il semble ĂȘtre une bonne idĂ©e d'automatiser ces tĂ©lĂ©chargements en utilisant C# pour l'imprimer dĂšs que chaque ensemble de fichiers est prĂȘt, tout comme la tĂąche « Publier les rĂ©sultats du test » :

##vso[results.publish type=NUnit;mergeResults=true;config='Release';runTitle='netcoreapp2.0/Windows';publishRunAttachments=true;resultFiles=D:\a\1\s\test-results\netcoreapp2.0\nunit.framework.tests.xml,D:\a\1\s\test-results\netcoreapp2.0\nunitlite.tests.xml]

Publier à partir de nos propres scripts au lieu de publier à l'aide de la tùche « Publier les résultats du test » présente des avantages considérables :

  • Nous n'avons pas Ă  rĂ©pĂ©ter ce morceau de YAML 18 fois. Le YAML est maintenant facile Ă  lire. De plus, nous n'aurons pas Ă  exclure six frameworks spĂ©cifiques correspondants dans le YAML, nous n'aurons donc pas de rĂ©sultats de test manquants si nous ajoutons un framework cible car nous avons oubliĂ© de mettre Ă  jour le fichier YAML.

  • Nous pouvons regarder les rĂ©sultats des tests arriver au fur et Ă  mesure que chacune des exĂ©cutions de test se termine, plutĂŽt que d'attendre que l'Ă©tape « PowerShell » soit terminĂ©e, puis de faire l'Ă©tape « Publier les rĂ©sultats des tests ». C'est moins essentiel, mais c'est une fonctionnalitĂ© intĂ©ressante qui ne serait jamais possible lors de l'utilisation de la tĂąche « Publier les rĂ©sultats des tests » pour publier les rĂ©sultats des tests.

ProblĂšme de tentative d'automatisation

➡ Cela ne fonctionne que si les tĂąches de build rĂ©cupĂšrent les agents v2 hors de la file d'attente. La plupart du temps, la version Windows rĂ©cupĂšre un agent v1 qui ignore totalement la commande de journalisation ##vso[results.publish...] .

Comment la tĂąche « Publier les rĂ©sultats du test » rĂ©sout-elle normalement ce problĂšme ? Il empĂȘche les agents v1 d'ĂȘtre rĂ©cupĂ©rĂ©s car il a un task.json qui spĂ©cifie "minimumAgentVersion": "2.0.0" .

Il n'y a pas d'Ă©quivalent de minimumAgentVersion pour nos azure-pipelines.yml . Le mieux que les pipelines YAML puissent faire est de demands: agent.version -equals 2.142.2 ou quelle que soit la version exacte de l'agent aujourd'hui, mais cela s'interrompt dĂšs que les agents sont mis Ă  jour vers la version 2.142.3. Donc ce n'est pas bon.

La seule façon d'obtenir un agent avec une version supérieure ou égale à 2.0.0 est d'ajouter une tùche factice « Publier les résultats des tests » qui ne télécharge rien et laisse des avertissements dans nos résumés de build, ou bien d'abandonner l'idée d'automatisation et de revenir à les 18 variantes de ce bloc de YAML dans notre azure-pipelines.yml :

  - task: PublishTestResults<strong i="5">@2</strong>
    displayName: Publish test results
    inputs:
      testResultsFormat: NUnit
      testResultsFiles: test-results\net45\*.xml # Or net 40, or 5 others
      mergeTestResults: true
      testRunTitle: net45/Windows # Or net40/Linux, or 16 others
    condition: succeededOrFailed()

J'ai trouvé cette demande qui est marquée Closed - Not Enough Info : https://developercommunity.visualstudio.com/content/problem/75687/build-demands-agentversion-gtversion-21020.html

C'est donc moi qui m'efforce de fournir plus d'informations. Est-ce que cela a Ă©tĂ© utile? Souhaitez-vous que je dĂ©place ma question vers un meilleur forum? À moins que votre Ă©quipe ne connaisse des solutions de contournement, nous opterons probablement pour la voie des 18 copies de YAML banal.

Merci beaucoup!

Tous les 13 commentaires

Si quelqu'un Ă©tait suffisamment intĂ©ressĂ© pour le mettre en place, j'aimerais que nous l'utilisions d'abord aux cĂŽtĂ©s de Travis pendant un certain temps, avant de prendre une dĂ©cision. Juste pour ĂȘtre sĂ»r que cela n'a pas les mĂȘmes problĂšmes de fiabilitĂ© pour OSX que Travis.

Ça a l'air cool quand mĂȘme ! ??

Bonne idée. J'aimerais que nous utilisions davantage les versions là-bas et éventuellement les versions. Si quelqu'un veut intervenir, je me suis assuré que @ChrisMaddock et @jnm2 sont tous deux administrateurs de projet de https://nunit.visualstudio.com/NUnit/. Si un autre membre de @nunit/framework-and-engine-team souhaite nous aider avec nos builds Azure Pipeline, faites-le moi savoir.

J'ai un peu avancĂ© lĂ -dessus ce soir. J'ai amĂ©liorĂ© la version existante de Windows CI pour la construction, le test et le package. J'ai Ă©galement la version macOS qui fait la mĂȘme chose bien que j'obtienne un Ă©chec de test cohĂ©rent sur macOS. Ce qui est bien, c'est que je publie les rĂ©sultats des tests, vous n'avez donc pas besoin de scanner les journaux pour voir les Ă©checs des tests !

image

Je travaille sur la version Linux. J'ai du mal Ă  installer une version 1.1 et 2.0 de .NET Core sur les agents de build...

Linux fonctionne maintenant. J'avais juste besoin de passer des tùches Utiliser la version .NET Core à une tùche générale qui effectue un apt-get install de la version qui manquait.

Toutes les versions sur toutes les plates-formes effectuent une construction, un test et un package, puis publient en tant qu'artefacts. Ils construisent actuellement sans numĂ©ros de build de dĂ©veloppement comme sur AppVeyor. Nous devrions mettre Ă  jour le script Cake pour faire un IsRunningOnVSTS et utiliser la mĂȘme logique que sur AppVeyor.

Une fois que nous arrivons à cette étape, j'aimerais passer à l'étape suivante consistant à créer les modifications de la branche de publication et à les déployer/publier automatiquement. Nous devrons réfléchir à la façon dont nous maintenons les notes de version et le changes.txt à ce stade. Automatiser toutes les choses ?

automate

@mikkelbu Je vous ai ajouté en tant qu'autre membre de l'équipe du projet DevOps Pipeline (alias VSTS), vous devriez donc pouvoir entrer et apporter des modifications si nécessaire. Faites-moi savoir si vous rencontrez des problÚmes d'autorisations et je corrigerai.

Toutes les builds Azure signalent actuellement un succĂšs alors qu'elles devraient signaler un Ă©chec.

Discussion intéressante ici. Je suis PM dans l'équipe Azure Pipelines. N'hésitez pas à me contacter pour toute question.

@chrisrpatterson J'ai une question, si vous me le rĂ©ponds lĂ -dessus. Je m'excuse, c'est un peu long pour ĂȘtre clair.

ProblĂšme

Nous avons 18 tests que nous aimerions publier, 6 pour chaque systĂšme d'exploitation (voir liste) .
(La raison pour laquelle le nombre ne peut pas ĂȘtre infĂ©rieur Ă  18 est que ces tests ont exactement les mĂȘmes noms. Chaque test s'exĂ©cute 18 fois, couvrant chaque combinaison de systĂšme d'exploitation et de framework cible. Si nous allions avec moins de tĂ©lĂ©chargements de tests, Azure DevOps fusionnerait le tests avec les mĂȘmes noms et nous ne serions pas en mesure de dire pour quel systĂšme d'exploitation et framework cible le test a Ă©chouĂ©.)

La tùche « Publier les résultats des tests » ne prend en charge que la création d'une seule exécution de test. Par conséquent, si nous avons 18 exécutions de test, nous devons répéter ce bloc 18 fois dans notre YAML :

  - task: PublishTestResults<strong i="12">@2</strong>
    displayName: Publish test results
    inputs:
      testResultsFormat: NUnit
      testResultsFiles: test-results\net45\*.xml
      mergeTestResults: true
      testRunTitle: net45/Windows
    condition: succeededOrFailed()

Cela rend le YAML dense et difficile à lire. En outre, les six cadres cibles spécifiques que nous soutenons peuvent changer à l'avenir. Nous oublierons invariablement que nous avons ce couplage avec les chemins test-results\net45\*.xml spécifiques et n'oublierons de corriger le YAML qu'une fois que nous remarquons que les résultats des tests sont manquants. Ce n'est juste pas trÚs satisfaisant.

Tentative d'automatisation

Étant donnĂ© que nous utilisons un script de gĂ©nĂ©ration Cake, il semble ĂȘtre une bonne idĂ©e d'automatiser ces tĂ©lĂ©chargements en utilisant C# pour l'imprimer dĂšs que chaque ensemble de fichiers est prĂȘt, tout comme la tĂąche « Publier les rĂ©sultats du test » :

##vso[results.publish type=NUnit;mergeResults=true;config='Release';runTitle='netcoreapp2.0/Windows';publishRunAttachments=true;resultFiles=D:\a\1\s\test-results\netcoreapp2.0\nunit.framework.tests.xml,D:\a\1\s\test-results\netcoreapp2.0\nunitlite.tests.xml]

Publier à partir de nos propres scripts au lieu de publier à l'aide de la tùche « Publier les résultats du test » présente des avantages considérables :

  • Nous n'avons pas Ă  rĂ©pĂ©ter ce morceau de YAML 18 fois. Le YAML est maintenant facile Ă  lire. De plus, nous n'aurons pas Ă  exclure six frameworks spĂ©cifiques correspondants dans le YAML, nous n'aurons donc pas de rĂ©sultats de test manquants si nous ajoutons un framework cible car nous avons oubliĂ© de mettre Ă  jour le fichier YAML.

  • Nous pouvons regarder les rĂ©sultats des tests arriver au fur et Ă  mesure que chacune des exĂ©cutions de test se termine, plutĂŽt que d'attendre que l'Ă©tape « PowerShell » soit terminĂ©e, puis de faire l'Ă©tape « Publier les rĂ©sultats des tests ». C'est moins essentiel, mais c'est une fonctionnalitĂ© intĂ©ressante qui ne serait jamais possible lors de l'utilisation de la tĂąche « Publier les rĂ©sultats des tests » pour publier les rĂ©sultats des tests.

ProblĂšme de tentative d'automatisation

➡ Cela ne fonctionne que si les tĂąches de build rĂ©cupĂšrent les agents v2 hors de la file d'attente. La plupart du temps, la version Windows rĂ©cupĂšre un agent v1 qui ignore totalement la commande de journalisation ##vso[results.publish...] .

Comment la tĂąche « Publier les rĂ©sultats du test » rĂ©sout-elle normalement ce problĂšme ? Il empĂȘche les agents v1 d'ĂȘtre rĂ©cupĂ©rĂ©s car il a un task.json qui spĂ©cifie "minimumAgentVersion": "2.0.0" .

Il n'y a pas d'Ă©quivalent de minimumAgentVersion pour nos azure-pipelines.yml . Le mieux que les pipelines YAML puissent faire est de demands: agent.version -equals 2.142.2 ou quelle que soit la version exacte de l'agent aujourd'hui, mais cela s'interrompt dĂšs que les agents sont mis Ă  jour vers la version 2.142.3. Donc ce n'est pas bon.

La seule façon d'obtenir un agent avec une version supérieure ou égale à 2.0.0 est d'ajouter une tùche factice « Publier les résultats des tests » qui ne télécharge rien et laisse des avertissements dans nos résumés de build, ou bien d'abandonner l'idée d'automatisation et de revenir à les 18 variantes de ce bloc de YAML dans notre azure-pipelines.yml :

  - task: PublishTestResults<strong i="5">@2</strong>
    displayName: Publish test results
    inputs:
      testResultsFormat: NUnit
      testResultsFiles: test-results\net45\*.xml # Or net 40, or 5 others
      mergeTestResults: true
      testRunTitle: net45/Windows # Or net40/Linux, or 16 others
    condition: succeededOrFailed()

J'ai trouvé cette demande qui est marquée Closed - Not Enough Info : https://developercommunity.visualstudio.com/content/problem/75687/build-demands-agentversion-gtversion-21020.html

C'est donc moi qui m'efforce de fournir plus d'informations. Est-ce que cela a Ă©tĂ© utile? Souhaitez-vous que je dĂ©place ma question vers un meilleur forum? À moins que votre Ă©quipe ne connaisse des solutions de contournement, nous opterons probablement pour la voie des 18 copies de YAML banal.

Merci beaucoup!

@chrisrpatterson, je m'excuse de vous avoir

@jnm2 L'exemple d'automatisation que vous avez semble bien. Je suis curieux de savoir comment vous avez des agents V1 car ils ne sont plus vraiment pris en charge. Il ne doit pas non plus y avoir d'agents v1 dans le pool hébergé.

@chrisrpatterson Les agents v1 faisaient leur apparition fin novembre :

Le téléchargement des résultats des tests n'a lieu que si les tùches se produisent sur les bons agents. Quand cela fonctionne, il indique "Agent : Hosted VS2017 2". En cas d'échec, le message "Agent : Agent hébergé" s'affiche. Similaire pour Linux et macOS.

Je me demande si c'est ce qui se passe :

https://github.com/Microsoft/azure-pipelines-tasks/blob/f8526d84cde186125cc589433fb950d437d1ef77/Tasks/PublishTestResultsV2/task.json#L20

"minimumAgentVersion": "2.0.0"

Maintenant que je n'utilise pas task: PublishTestResults@2 dans le YAML, cela ne nécessite pas d'agents capables.

Je ne savais pas que c'était un problÚme ponctuel, mais c'est logique. Je vais réessayer la voie d'automatisation. Merci pour l'info!

Fermez ceci comme fait.

@chrispat je m'excuse ! Je pense avoir compris ce qui se passait.

Le téléchargement des résultats des tests n'a lieu que si les tùches se produisent sur les bons agents. Quand cela fonctionne, il indique "Agent : Hosted VS2017 2". En cas d'échec, le message "Agent : Agent hébergé" s'affiche. Similaire pour Linux et macOS.

J'utilisais IsRunningOnTFS Cake qui renvoie false si AGENT_NAME commence par "Hosted" ! La raison pour laquelle les rĂ©sultats des tests ne s'affichaient pas n'avait rien Ă  voir avec la version de l'agent, mais plutĂŽt la vĂ©rification de Cake n'Ă©tant pas fiable et notre script pensant qu'il n'Ă©tait pas sur Azure Pipelines et donc n'imprimait mĂȘme pas ##vso[results.publish etc.

Ma faute de ne pas avoir vu ça plus tÎt. Merci beaucoup pour votre aide!

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

dgm90 picture dgm90  Â·  5Commentaires

xplicit picture xplicit  Â·  5Commentaires

ffMathy picture ffMathy  Â·  3Commentaires

UyttenhoveSimon picture UyttenhoveSimon  Â·  3Commentaires

ChrisMaddock picture ChrisMaddock  Â·  3Commentaires