Le pipeline est déclenché par les nouveaux engagements à une succursale master
et publie le paquet
[.____] Actuellement, la version est définie manuellement et je serais heureux de l'avoir défini automatiquement.
[.____] Ce que je pensais au début, ajoutez les tâches suivantes au pipeline:
$Build.SourceBranch
version patch --force
git Push
Cela fonctionne et la version est vraiment incrémentée correctement, la chose est que cela déclenche une autre course du pipeline, qui augmentera à nouveau, ce qui aura une idée, une boucle sans fin.
Y a-t-il une meilleure façon de le faire?
N'utilisez pas les fichiers du repo source pour garder une trace de la version actuelle/suivante. Je ne pense pas que vous puissiez casser la boucle facilement, si vous le faites.
Vous pourrez peut-être vous en sortir avec la course npm --no-git-tag-version version
Pour incrémenter la version package.json à l'intérieur de l'agent de construction sans le commit, de sorte que vous n'avez pas de changement, vous devez repousser à l'origine. Cela devrait simplement changer de paquet.json et le laisser sale.
Attendez qu'après que la construction ait réussi. Utilisez une tâche de script personnalisée pour extraire la version de Package.json, puis git reset --hard
(Il n'y a aucune raison de garder tout ce qui a changé sur le serveur de construction). Bien que cela annulerait le changement de package.json, vous pouvez maintenant créer une balise sur la tête contenant cette version, puis faire un git Push Origin {tag-name}
qui ne devrait pas introduire un nouveau commit sur l'origine qui déclencherait ensuite votre pipeline.
En fait, je n'ai pas pense Un pipeline sera déclenché simplement parce qu'une balise a été ajoutée, mais je ne l'ai pas testé. Je suis à peu près sûr que ce ne sera pas.
Séquence de tâches dans votre pipeline:
[Compte tenu de la source de la source où vous vous êtes assuré de définir les versions majeures et mineures de Package.json pour refléter l'état actuel du code en fonction des règles de la version sémantique et laissez la valeur de correctif toujours définie sur 0 et, si souhaité, en utilisant des valeurs pré-* pour décrire la qualité de la valeur principale/mineure:]
git describe --tags
Pour trouver la balise la plus récente avec A TAGName correspondant au modèle que vous utilisez (voir ci-dessous). (Je préfère cette séquence sur appel npm version from-git
Parce que NPM utilisera simplement la dernière balise, ce qui pourrait ne pas être un numéro de version, en fonction de la quantité de contrôle que vous avez sur la succursale.) Utilisez des opérations de chaîne ou d'expression régulière pour extraire le majeur, le mineur, le patch et tout ce que * Valeur que vous pourriez avoir. Ceci est la version précédente que nous allons utiliser pour comparer avec ce qui est dans le fichier package.json. Notez que vous devrez peut-être suivre ces instructions pour exécuter une commande git. Enregistrez-le à une variable de pipeline .Utilisation d'une tâche de ligne de commande utilitaire et d'un code ou d'un script que vous écrivez, exécutez npm version
Pour obtenir la principale/mineure actuelle/pré-version du fichier package.json et enregistrez-la sur une variable de pipeline différente. J'utilise PowerShell Core, alors ma commande ressemblerait à ceci pour créer une variable de pipeline "courantePackageVersion":
& npm.cmd version | ConvertFrom-Json | Select-Object -ExpandProperty {name-of-your-package} | Set-Variable -Name 'packageVersion' | Write-Output "#vso[task.setvariable variable=currentPackageVersion]$packageVersion"
Utilisation d'une tâche de ligne de commande utilitaire et d'un code ou d'un script que vous écrivez, comparez les valeurs majeures, mineures et pré-* de la version précédente pour déterminer si l'une d'entre elles a changé. Définissez une nouvelle variable de pipeline pour refléter si elle a changé ou non. Je vais utiliser le nom "RedémersionPatchnumberNumber", qui est vrai si les valeurs actuelles majeures, mineures ou pré-* sont différentes des valeurs majeures, mineures ou pré-* de la version précédente.
npm --no-git-tag-version version patch
, qui met à jour le package.json dans l'agent de construction mais ne commet pas le changement, laissant votre zone de travail modifiée (sale) (qui pourrait causer des problèmes sur des versions ultérieures si vous utilisez vos propres agents de construction au lieu d'agents hébergés). Le condition expression de la tâche utilise une condition personnalisée qui évalue à la variable que je viens de définir à l'étape précédente ("RedartVersionPatchNumber"). Notez que si cette tâche ne fonctionne pas, elle devrait simplement utiliser la valeur de la version dans le fichier package.json (la version actuelle qui se trouve maintenant dans la variable de pipeline "courantePackageVersion").npm version
Pour extraire la nouvelle version que la commande Version NPM définie. Enregistrez-le à une nouvelle variable de pipeline; Je l'appellerai "NewversionNumber".git reset --hard
. Vous aurez besoin de le faire même si vous utilisez un agent de construction hébergé, en raison de la prochaine étape.git tag {*tagname*}
. Pour PowerShell, la syntaxe serait & git.exe tag $env:newVersionNumber
git Push Origin {*tagname*}
Vous pourriez (et peut-être devrait) combiner les étapes de ligne de commande. Je suis vraiment partiel à la tâche PowerShell PowerShellcore (PWSH), comme vous l'avez peut-être deviné.
Le package qui a été créé comme artefact du travail aura la version mise à jour, car elle a été créée dans la construction et correspond à la balise qui se trouve maintenant dans votre code source original.
Alternativement, utilisez une source externe (une fonction d'azur, etc.) ou une autre (seconde) repo git ou même une autre branche qui n'est pas liée à votre déclencheur CI dans votre projet que vous utilisez uniquement pour suivre les numéros de construction, puis utilisez le jeton. Tâches de remplacement pour définir la version avant de commencer la construction. Je n'aime pas beaucoup cette idée, mais cela empêcherait de re-déclencher une nouvelle construction.
Aussi, vous espérez-vous construire un seul paquet avec ce repo. La prochaine chose à faire est de publier ce forfait à votre flux d'artefacts Azure, ou NPMJS.org ou partout. Ne comptez pas sur la version cuite au code source d'origine; Tout ce qui dépend de ce forfait devrait le retirer de cet aliment que vous l'avez publié, ne s'appuyant pas sur elle étant construite plus tôt dans les étapes de construction avec un nouveau numéro de version.
Voici ma mise en œuvre à PowerShell, qui est une étape complète basée sur la réponse acceptée. Notez que cela gère également certains des problèmes de git tels que la tête détachée fournie avec ce type d'approche.
steps:
- checkout: self
persistCredentials: true
.
.
.
- task: PowerShell@2
displayName: 'Bump the version'
inputs:
targetType: 'inline'
script: |
$BranchName = "$(Build.SourceBranch)" -replace "refs/heads/"
git checkout $BranchName
git config --global user.email "[email protected]"
git config --global user.name "Your name"
npm version prerelease -m "Auto increment pre-release version to %s [skip ci]" --force
git Push