2010-11-17 36 views
0

Certains projets Java utilisent Apache Commons Configuration et sont déployés sur plusieurs serveurs dans plusieurs environnements (dev/test/prod). Tout le code est le même, mais certains éléments de configuration changent, comme les URLs JMS (dev devrait pointer vers dev, etc) ainsi que le nom et l'environnement du serveur (j'utilise ces éléments de configuration pour le débogage).Déploiement automatisé de configurations spécifiques au serveur

Exemple:

<config> 
    <!-- environment can be dev|test|prod --> 
    <environment>dev</environment> 

    <serverName>myServer1</serverName> 

    <jmsUrl>http://my-jms-url-dev1,http://my-jms-url-dev2</jmsUrl> 
</config> 

Actuellement, je Deploy, construire, puis modifier les fichiers manuellement pour fournir les configurations spécifiques au serveur. Je veux un moyen d'automatiser cela quand je le déploie sur des serveurs individuels, mais toutes les manières que j'ai considérées exigent une quantité égale de douleur à installer.

  • ANT - Découvrez le projet avec SVN et compilez-le sur chaque serveur avec ANT. ANT lit le nom du serveur et l'environnement à partir de deux fichiers statiques - .servername et .environment - et copie une configuration spécifique au serveur vers la configuration générique. Le problème avec ceci est, je dois encore créer un fichier de configuration pour chaque serveur (j'ai 24 serveurs, et ceci peut augmenter, ainsi l'évolutivité n'est pas bonne). SVN - Branche chacun de mes projets sur une distribution spécifique au serveur.

  • Ici, l'évolutivité est pire et cela devient un cauchemar à maintenir.

Est-ce que quelqu'un a des conseils pour moi?

Répondre

0

J'ai compris cela.

Étape 1.

Obtenez le nom d'hôte:

<target name="getHostname" description="Stores the current machines hostname in a property named 'hostname'"> 
    <property environment="env" /> 
    <condition property="hostname" value="${env.HOSTNAME}"> 
     <os family="unix" /> 
    </condition> 

    <!-- Execute hostname command on Linux systems --> 
    <exec executable="hostname" 
      osfamily="unix" 
      failifexecutionfails="false" 
      outputproperty="env.COMPUTERNAME"/> 

    <!-- On Windows, the hostname is an environment variable --> 
    <condition property="hostname" value="${env.COMPUTERNAME}"> 
     <os family="windows" /> 
    </condition> 

    <echo message="${env.COMPUTERNAME}" /> 

</target> 

Étape deux, créez un fichier de modèle et d'utiliser pour copier le fichier et faire une recherche/remplacement sur elle:

<copy file="${scripts}/.servername.template" 
      tofile="${scripts}/.servername"> 
     <filterchain> 
      <replacetokens> 
       <token key="SERVER_NAME" 
         value="${env.COMPUTERNAME}" /> 
      </replacetokens> 
     </filterchain> 
    </copy> 

Le fichier .servername.template contient cette chaîne:

@[email protected] 

Ensuite, j'utilise un service Web pour obtenir une chaîne JSON pour me dire dans quel environnement je suis. Et j'utilise la tâche pour traiter le JSON et obtenir l'environnement.

Assez robuste pour une tâche aussi simple, mais ça marche!

+0

Oh, et je devrais ajouter. C'est juste pour générer des fichiers .servername et .environment sur chaque serveur. La tâche réelle qui construit les choses qui ont besoin de ces fichiers fera également une recherche/remplacement en utilisant . Nifty! – bdetweiler

+0

vous pouvez simplifier la cible get Hostname avec: fonctionne sur Windows et Linux, voir: http://stackoverflow.com/questions/1196989/ ant-machine-name-propriété/1375866 # 1375866 – Rebse

+0

Intéressant. Merci d'avoir partagé! – bdetweiler