L’intégration continue avec Cruise Control .NET

Est-il nécessaire de présenter la notion d'intégration continue (Continuous Integration) ?

Le principe (en résumé) est le suivant : chaque fois que le développeur contribue au projet en ajoutant une mise à jour ou un fichier au dépôt central (on parle de commits), le projet est automatiquement recompilé, testé, et éventuellement délivré à nouveau.

C'est le travail du serveur d’intégration que d’automatiser ces tâches. En l'occurence, nous utilisons Cruise Control.Net que nous avons configuré pour supporter le principe d'organisation des codes sources mis en place dans le projet CiviKey et présenté précédemment.

Les quatres actions de base sont :

  1. Compilation en mode Debug
  2. Tests unitaires
  3. Compilation en mode Release
  4. Tests FxCop

Ces actions sont lancées après un commit (toute modification) dans :

  • /trunk
  • /releases/{VERSION}/trunk
  • /releases/{VERSION}/tags/{TAG}

Lors d’un commit dans /trunk il y a en plus une vérification du contenu du commentaire. S’il contient [DoRelease] ET que le fichier release.txt a été modifié (ie. il fait partie du commit - ceci est une sécurité) alors une nouvelle version sera créée automatiquement lors du commit (et donc une compilation du trunk de la version sera effectuée).

Le fichier release.txt se présente de la façon suivante :

# This file is used to generate a new Release branch.
# It contains:
# - ReleaseNumber: RELEASE-NUMBER (format X.X.X like 2.4.12 - major.minor.revision expected)
# - RevNumber: OPTIONAL-REVNUMBER-TO-RELEASE
# This is optional: it enables a "release from the past" if needed.
# By default, we take the SVN « RevNumber » of this file:
# since this file necessarily belongs to the commit, it is the current (the 'head' revision) /trunk version.

ReleaseNumber: 2.4.7

# RevNumber: 10 (Optional: to be used only if one want a Release based on a /trunk past version.)

Lors d’un commit dans /releases/{VERSIONS}/trunk il y a en plus une vérification du contenu du commentaire. Si il contient [Tag] ET que le fichier tags.txt a été modifié alors un tag sera créé dans cette version automatiquement lors du commit (et donc une autre compilation, mais de la version taguée sera effectuée).

Le fichier tags.txt se présente de la façon suivante :

# This file is used to generate a new Tag.
# It contains:
# - TagName: OPTIONAL-TAG-SUFFIX
# - RevNumber: OPTIONAL-REVNUMBER-TO-TAG
# This is optional: it enables a "Tag from the past" if needed.
# By default, we take the SVN « RevNumber » of this file:
# since this file necessarily belongs to the commit, it is the current (the 'head' revision) /releases/{VERSIONS}/trunk version.

TagName: Final

#RevNumber: 10

Lors de la création d’un tag /releases/{VERSION}/tags/{TAG} il y a la génération de l’aide correspondant à cette version (CHM + site web) ainsi que la génération du package pour cette version.

Grâce à tout cela, CiviKey est définitivement sous contrôle !