2011-04-28 3 views
2


Nous démarrons un nouveau projet WinForms et avons décidé d'utiliser TeamCity pour créer des builds et lancer des tests unitaires et d'intégration. Le projet traite de la base de données. Nous avons 3 bases de données (developDB (utilisée par les développeurs lors du développement =)), testDB (utilisée par teamcity pour exécuter des tests) et productionDB (utilisée par le client)). TeamCity a 3 buildConfiguration. Le premier est déclenché quand commit se produit. La seconde est déclenchée chaque nuit pour exécuter des tests d'intégration. Et le troisième est déclenché par le développeur lorsque nous voulons faire une version. Je veux donc que TeamCity puisse changer connectionString en fonction du type de construction qui se produit. Aussi je ne veux pas stocker connectionString dans app.config (je ne veux pas que le client connaisse l'utilisateur et le mot de passe). Quelles options sont disponibles pour effectuer la tâche?
Merci d'avance!
Mise à jour
J'utilise NHibernate et FluentNHibernate pour se connecter aux bases de données si cela est important.Winforms ConnectionString et TeamCity

Répondre

0

Dans cette situation, j'utiliserais TeamCity pour exécuter un script nant pour effectuer la construction.NAnt vous permet de modifier les valeurs de fichier de configuration (telles que votre chaîne de connexion) au moment de la construction.

Un exemple d'utilisation TeamCity/NAnt pour déployer à différents environnements de mise en scène se trouve à ce blog: http://thecodedecanter.wordpress.com/2010/03/25/one-click-website-deployment-using-teamcity-nant-git-and-powershell/

Comme @surfen suggère, les valeurs de chaîne de connexion pour chaque environnement doivent être cryptés pour empêcher les informations d'identification de être stocké en texte brut.

+0

Downvoter - S'il vous plaît ajouter un commentaire pour expliquer pourquoi vous avez voté la réponse acceptée? – DaveRead

0

Je n'ai pas utilisé TeamCity, mais j'ai écrit plusieurs applications en changeant dynamiquement ConnectionStrings pendant le processus d'ouverture de session (c'est-à-dire à l'exécution), et c'est assez simple.

Vous n'avez pas dit comment vous connecter à votre base de données. Puisque vous mentionnez app.config, je suppose que c'est ADO.NET DataSets ou la technologie simmilar, qui crée un en lecture seule (getter) ConnectionString dans votre Settings.Designer.cs/app.config.

Ce que je l'ai fait, était de créer une méthode setter dans Settings.cs (non Settings.Designer.cs) pour la propriété ConnectionString comme ceci:

public void setNorthwindConnectionString(String value) { 
    this["NorthwindConnectionString"] = value; 
} 

Mon DataSet généré utilise alors ce NorthwindConnectionString pour accéder aux données .

Vous pouvez utiliser des directives de préprocesseur pour la configuration conditionnelle de votre ConnectionString:

#if DEBUG 
    Console.WriteLine("Mode=Debug"); 
    Settings.Default.setNorthwindConnectionString("(DebugDBConnectionString)"); 
#else 
    Console.WriteLine("Mode=Release"); 
    Settings.Default.setNorthwindConnectionString("(ReleaseDBConnectionString)"); 
#endif 

Vous pouvez également encrypt your connection strings et copier le droit app.config pendant l'événement après de construction.

-2

Je suppose que vous utiliseriez msbuild pour construire vos projets dans Team city. Si tel est le cas, vous pouvez envoyer le symbole de compilation conditionnelle où vous pouvez transmettre tous les symboles dont vous avez besoin.

Une fois que vous avez les symols, vous pouvez faire des choses comme:

#if DEVBUILD 
//.... Your Connection String Code here 
#endif 

#if INTBUILD 
.... Your Connection String Code here 
#endif 

C'est la réponse à votre question FRST.

En regardant la deuxième partie de votre question, où en vous ne souhaitez pas enregistrer le nom d'utilisateur & mot de passe dans le app.config,

Options:

  • essayer sécurité integrated, il sera utilisez votre compte de domaine
  • Si l'option ne peut pas être utilisée, essayez de conserver votre chaîne de connexion en tant que clé de Registre, afin qu'elle ne soit pas une variable d'environnement ou une variable d'environnement évidente.