4
votes

Existe-t-il un moyen de lire un fichier à partir d'Azure DevOps YAML?

Lorsque je fais mon CI sur Azure DevOps avec le format de fichier YAML, j'essaie de lire mes fichiers csproj pour extraire des informations sur la version afin de créer des packages NuGet qui suivront la version csproj.

J'utilise NuGetCommand @ 2 pour l'empaquetage (à cause de versioningScheme: byPrereleaseNumber )

Existe-t-il une tâche intégrée ou un moyen d'extraire ces informations du fichier csproj en tant que regex et de les transmettre à NuGetCommand @ 2 ?


0 commentaires

3 Réponses :


3
votes

Je suis assez sûr qu'il n'y a rien de intégré pour cela, mais vous pouvez utiliser n'importe quel langage de script que vous aimez pour analyser le fichier et "cracher" tout ce dont vous avez besoin comme variable de construction et le consommer plus tard. voici ce que j'ai fait:

- script: echo "##vso[task.setvariable variable=dp]$(cat $(Build.Repository.LocalPath)/deployment/dp)"
- script: az group delete -n $(dp)-k8s -y --no-wait

vous pouvez évidemment faire n'importe quelle chose personnalisée dans l'action de script et consommer le résultat comme vous le souhaitez.

https://github.com/Microsoft/azure-pipelines -tasks / blob / master / docs / authoring / commands.md


2 commentaires

Ok alors j'essaierai de faire ça en js quand j'aurai le temps


Bonne question, et besoin de la même chose - avez-vous obtenu quelque chose avec cela et pouvez-vous publier un exemple pour extraire les informations de version major.minor.patch de csproj?



1
votes

Solution d'agent basé sur Linux

Vous pouvez ajouter ceci dans un premier temps pour extraire la balise d'un csproj:

- script: echo "##vso[task.setvariable variable=version]$(cat 'ProjectDirectory/MyProject.csproj' | grep -oP '(?<=<Version>).*?(?=<\/Version>)')"

Vous pourrez alors l'utiliser en appelant $ (version) n'importe où dans votre yaml.

Explication:

  • echo "## vso [task.setvariable variable = version] signifie" définir une variable que je peux utiliser après "
  • cat 'ProjectDirectory / MyProject.csproj' | grep récupère votre contenu csproj puis le transmet à grep afin que nous puissions exécuter une expression régulière dessus
  • (? ). *? (? = ) ') est une expression régulière qui trouve le xxx sans consommer les balises pour n'imprimer que ce qui se trouve à l'intérieur

3 commentaires

J'ai essayé mais la construction a échoué avec l'erreur suivante: grep: -P prend en charge uniquement les paramètres régionaux unibyte et UTF-8


Êtes-vous dans un agent de build basé sur Linux?


Oui, cette solution est pour un agent basé sur Linux. Je vais l'ajouter à mon message.



1
votes

Les autres réponses ici n'ont pas fonctionné pour moi, mais j'ai concocté une solution alternative dans ma définition de pipeline:

variables:
  projectVersion: '0.0'
  buildNumber: '$(Build.BuildId)'
  versionNumber: '$(projectVersion).$(buildNumber)'

steps:
- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
      $input_path = (Get-ChildItem -Path "YourDirectory\" -Include SampleLibrary.csproj -File -Recurse -ErrorAction SilentlyContinue)
      $regex = '(?<=<Version>).*?(?=<\/Version>)'
      $version = Select-String -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value }
      Write-Output "##vso[task.setvariable variable=projectVersion]$version"

Cela définira le numéro de version sur une valeur intéressante comme " 1.1.8.547 ', bien que vous puissiez évidemment omettre le numéro de build si vous préférez.

L'essentiel du script PowerShell ici est qu'il va d'abord récupérer le fichier .csproj dans le répertoire spécifié. Ensuite, j'ai utilisé le même regex que Francoimora a publié pour extraire la valeur du fichier et l'ai stockée dans la variable $ version. La dernière ligne écrit la valeur de $ version dans la variable projectVersion définie dans YAML.

La suppression du fichier AssemblyInfo.cs des bibliothèques de classes dans .NET Standard semble vraiment avoir posé beaucoup de problèmes et rien n'a gagné ... J'espère que nous aurons à l'avenir de meilleures tâches / variables de pipeline adaptées à ce type de projets.


0 commentaires