GitVersion est une application pour Windows codée en C# qui sert à la génération de version automatique à partir d’un dépôt Git. Jenkins est un outil d’intégration continue programmé en Java. Ces deux projets à code source ouvert sont tous deux hébergés sur GitHub. Cet article expliquera comment utiliser GitVersion dans Jenkins et ça, sans l’utilisation de plugin supplémentaires.
L’utilisation de GitVersion sera faite à l’intérieur d’un fichier Jenkinsfile qui est utilisé par des projets de type Pipeline. Dans mon premier exemple, le paramètre showvariable
sera donné à GitVersion pour aller chercher une variable spécifique. Ce n’est pas très efficace si l’on a besoin d’aller chercher plusieurs variables. Par contre, c’est assez simple. Voici un bout code qui sert à changer la description du build:
steps {
script {
def FullSemver = bat returnStdout: true, script: '@"GitVersion.exe" /showvariable FullSemver'
currentBuild.description = "v${FullSemver}"
}
}
Comme mentionné plus tôt, cette technique manque de flexibilité. Dans le prochain exemple, toutes les propriétés de GitVersion serviront à générer des variables d’environnement. Ces variables pourront par la suite être utilisées à n’importe quel endroit dans le fichier. L’inconvénient est que c’est un peu plus long:
steps {
// Génération du fichier gitversion.properties
bat '@"GitVersion.exe" /output buildserver'
// Enregistrement des variables d'environnement du fichier gitversion.properties
script {
readFile('gitversion.properties').split("\r\n").each { line ->
el = line.split("=")
env."${el[0]}" = (el.size() > 1) ? "${el[1]}" : ""
}
}
bat '''
@echo Quelques variables d’environnement:
@echo %GitVersion_SemVer%
@echo %GitVersion_BranchName%
@echo %GitVersion_AssemblySemVer%
@echo %GitVersion_MajorMinorPatch%
@echo %GitVersion_Sha%
'''
}
Voici un exemple de fichier gitversion.properties généré avec la version 4.0.0-beta.14 de GitVersion:
GitVersion_Major=1
GitVersion_Minor=0
GitVersion_Patch=1
GitVersion_PreReleaseTag=
GitVersion_PreReleaseTagWithDash=
GitVersion_PreReleaseLabel=
GitVersion_PreReleaseNumber=
GitVersion_BuildMetaData=1
GitVersion_BuildMetaDataPadded=0001
GitVersion_FullBuildMetaData=1.Branch.master.Sha.3af072d1cd7e121e9723381a95bce0bf3809663b
GitVersion_MajorMinorPatch=1.0.1
GitVersion_SemVer=1.0.1
GitVersion_LegacySemVer=1.0.1
GitVersion_LegacySemVerPadded=1.0.1
GitVersion_AssemblySemVer=1.0.1.0
GitVersion_AssemblySemFileVer=1.0.1.0
GitVersion_FullSemVer=1.0.1+1
GitVersion_InformationalVersion=1.0.1+1.Branch.master.Sha.3af072d1cd7e121e9723381a95bce0bf3809663b
GitVersion_BranchName=master
GitVersion_Sha=3af072d1cd7e121e9723381a95bce0bf3809663b
GitVersion_NuGetVersionV2=1.0.1
GitVersion_NuGetVersion=1.0.1
GitVersion_NuGetPreReleaseTagV2=
GitVersion_NuGetPreReleaseTag=
GitVersion_CommitsSinceVersionSource=1
GitVersion_CommitsSinceVersionSourcePadded=0001
GitVersion_CommitDate=2018-08-29
Avec certain type de projet Jenkins, j’ai dû ajouter un comportement supplémentaire lors de l’opération clone. La version demeurait toujours à 0.1.0 et cela même si des tags existaient. Dans les configurations du projet, dans la section Behaviors il faut ajouter la propriété Advanced clone behaviours. Ensuite, on s’assure que Fetch tags est sélectionné.
Cela va faire en sorte que le paramètre --tags
sera utilisé lors du fetch.
Maintenant que vous avez ces informations de version, vous pouvez les utiliser pour générer la version de votre logiciel automatiquement. Je me sers de l’application envsubst pour faire des substitutions dans un fichier.