2010-12-03 36 views
1

Je veux configurer une construction paramétrée dans Hudson qui ne prend qu'un paramètre - le type de construction à créer (QA, Stage, Production). Cependant, chacune de ces constructions nécessite plusieurs variables d'environnement différentes à définir. Quelque chose comme (pseudo-code):Dans Hudson, comment définir plusieurs variables d'environnement avec un seul paramètre?

if ${CONFIG} == "QA" then 
    ${SVN_PATH} = "branches/dev" 
    ${BUILD_CONFIG} = "Debug" 
    # more environment variables... 
else if ${CONFIG} == "Production" then 
    ${SVN_PATH} = "trunk" 
    ${BUILD_CONFIG} = "Release" 
    # more environment variables... 
else # more build configurations... 
end if 

Il y a des étapes innombrables dans notre construction - tirer de la subversion, puis exécutez une combinaison de commandes MSBuild, fichiers batch DOS, et les scripts Powershell.

Nous planifions généralement nos builds à partir de l'interface Hudson, et je veux que l'entrée des paramètres soit aussi idiot que possible.

Existe-t-il un moyen de le faire?

Répondre

6

Puisque vous faites tellement de choses pour une version, que diriez-vous de scripting toutes les étapes en dehors de Hudson. vous pouvez utiliser ant, fichiers batch, ou n'importe quel langage de script que vous préférez. Mettez ce script dans votre scm pour obtenir le contrôle de révision.

pro:

  • vous obtenez la logique de Hudson, depuis Hudson appelle uniquement le script.
  • Vous n'avez pas besoin de créer des variables d'environnement qui doivent être conservées entre les shells (variables globales).
  • vous pouvez utiliser config/fichiers de propriétés pour chaque environnement, vous devez également mettre en contrôle de version
  • vous pouvez exécuter ces scripts en dehors de Hudson, si vous avez besoin
  • get la façon de config d'emploi Hudson facile
  • vous n'avez pas les effets secondaires de la modification des variables d'environnement globales. Vous devez toujours essayer de créer des tâches qui ne modifient aucun paramètre global, car cela entraîne toujours des problèmes.
+0

Je suis d'accord avec cette approche. C'est dommage cependant - l'une de mes choses préférées à propos d'Hudson est la possibilité de choisir le meilleur outil pour le travail et de l'utiliser. Pourtant, plus je l'utilise, plus je pense qu'ignorer toutes les options mais "exécuter le script shell" est la seule solution vraiment maintenable. – roufamatic

+0

D'accord, c'est ce que je voulais dire au deuxième paragraphe de ma réponse. +1 pour la liste des pros. –

2

Hudson prend en charge les paramètres de construction, qui sont des variables de temps de construction que Hudson rend disponibles comme variables d'environnement pour vos étapes de construction (voir la page wiki Hudson Parameterized Build). Dans votre travail, vous pouvez avoir un paramètre de choix CONFIG que l'utilisateur entre. (Pour configurer le paramètre, sous la configuration de votre travail, sélectionnez Cette construction est paramétrée.)

Ensuite, vous pouvez écrire ce que vous avez codé en pseudo-code au début de votre étape de construction. Ou puisque vous avez plusieurs étapes, placez la configuration de l'environnement dans un fichier référencé à partir de vos scripts de construction existants. (Selon votre shell, il existe plusieurs astuces pour exporter les variables définies dans un script vers l'environnement parent.) Mettre l'installation dans un fichier intégré à vos scripts de construction existants rendra la gestion et le test beaucoup plus faciles (testable à l'extérieur) de Hudson) ainsi que vous donner un moyen facile d'invoquer vos scripts localement.

Vous pouvez également envisager de séparer votre build unifié en tâches distinctes exécutant chacune des configurations que vous avez décrites. Même s'ils peuvent référencer un script de génération central, les types CONFIG que vous avez définis semblent être des actions distinctes et méritent des tâches distinctes.

+0

Je vais vous donner un point mais cela n'aide pas vraiment. Quelles astuces connaissez-vous qui me permet de changer l'environnement du processus appelant (java, exécutant Hudson)? J'ai essayé d'utiliser SETX ainsi que d'appeler la méthode SetEnvironmentVariable de .NET.Les deux semblent fonctionner, mais aucun ne peut affecter l'ensemble de variables d'environnement du processus appelant. Donc, les appels suivants par mes étapes de construction disparates ne voient pas les changements. Ce que je cherche vraiment est quelque chose comme le plugin SetEnv, sauf qu'il doit permettre un peu de programmation structurée autour de lui. – roufamatic

+0

Donc, vous dites, cela ne fonctionne pas en utilisant le 'setx' dans la première étape de construction et obtenir les variables dans la deuxième étape de construction? –

+0

C'est correct. Est-ce inhabituel? – roufamatic