Jenkins: comment utiliser une variable à partir d'un shell pré-construction dans le Maven " objectifs et options"

J'ai un travail Maven à Jenkins. Avant l'étape de construction réelle, j'ai une étape de pré-construction "Execute shell". Dans ce shell, j'ai défini une variable:

REVISION=$(cat .build_revision)

Je voudrais utiliser cette variable dans le travail de construction Maven dans "objectifs et options":

clean install -Drevision=${REVISION}

Mais ça ne marche pas! La valeur " Drevision "est définie sur" ${REVISION} " et non sur la valeur réelle de ${REVISION}. Sortie:

Executing Maven:  -B -f /home/gerrit/.jenkins/jobs/<job_name>/workspace/pom.xml clean install -Drevision=${REVISION}

Cela fonctionne avec les variables D'environnement Jenkins:

clean install -Dbuild=${BUILD_NUMBER}

Il définit" Dbuild " sur le numéro de build réel. Sortie:

Executing Maven:  -B -f /home/gerrit/.jenkins/jobs/<job_name>/workspace/pom.xml clean install -Dbuild=54

Ma question: Comment utiliser une variable shell dans Maven "objectifs et options"??

Modifier:

J'ai essayé d'utiliser Jenkins EnvInject Plugin pour" injecter des variables d'environnement "après le shell de pré-construction, et ma variable est maintenant accessible par exemple par des shells post-build, mais elle n'est toujours pas disponible dans Maven "Goals and options".

Ensuite, il est possible de définir "injecter des variables d'environnement dans le processus de construction" en utilisant le Plugin EnvInject, ce qui rend ces variables disponibles dans Maven "objectifs et options", mais celles-ci sont définies juste après la commande SCM, c'est-à-dire avant les étapes de pré-construction, et ne prennent pas en charge les évaluations d'expression.

29
demandé sur sadrab 2013-05-02 11:33:42

5 réponses

Vous êtes sur la bonne voie ici, mais vous avez manqué une troisième fonctionnalité du plugin EnvInject: l'étape de construction" Inject environment variables " qui peut injecter des variables dans les étapes de construction suivantes en fonction du résultat d'un script ou de propriétés.

Nous utilisons le plugin EnvInject comme ça; un script configure une ressource et communique ses paramètres en utilisant des propriétés qui sont ensuite propagées par le plugin en tant que variables d'environnement.

C'est-à-dire configurer une base de données temporaire pour construire: Créer une base de données pour la construction

32
répondu jjungnickel 2013-07-25 13:52:43

J'ai eu un problème très similaire, essayant de calculer une version de construction et de l'injecter dans la construction. Après avoir rencontré tous les mêmes problèmes (pas d'expansion, etc.), j'ai utilisé l'option "Générer des variables d'environnement à partir du script", qui interprète la sortie comme des paires tag=value dans des variables Jenkins. Le script:

  #generate a version code that is high enough to surpass previously published clients
  val=`expr 150000 + $BUILD_NUMBER`
  echo VERSION_CODE=$val

Après cela, j'ai pu injecter $VERSION_CODE dans maven comme suit:

  -Dbuild.vercode=${VERSION_CODE}

J'espère que cela fonctionne pour vous.

7
répondu user2797386 2015-03-17 16:03:57

Ce problème est causé par un bogue dans le plugin Jenkins Maven Project tel que détaillé dans ce rapport de bogue ouvert le 2012-06-22. Le plugin n'a pas encore été corrigé à partir de la version 2.1.

Un correctif a été proposé pour le Plugin Maven Project, mais n'a pas encore été intégré. Voici le lien vers la demande de tirage: https://github.com/jenkinsci/maven-plugin/pull/14

Si vous construisez le plugin vous-même avec le patch pull request appliqué, les variables sont injecté et mis à la disposition du champ" objectifs et options " comme prévu.

3
répondu Brian Creasy 2014-02-26 16:53:55

Je pense que votre meilleur coup est d'essayer le pluginEnvInject pour cela avec votre étape initiale pré-scm.

  1. vous exécutez le pré-scm comme vous le faites déjà.
  2. vous utilisez l'injection env pour charger le fichier pour les étapes de construction du travail principal

Pensez à charger le contenu de votre fichier (format des propriétés) ou exécutez un script qui chargera le fichier comme vous le souhaitez et rendra une variable disponible pour le reste du travail avec "préparer un environnement pour l'exécution" option.

J'espère que cela aide.

0
répondu Eldad AK 2013-05-02 14:31:19

Je vois qu'il y a une réponse acceptée, mais pour un débutant à Jenkins, j'ai eu du mal à tout saisir. C'est pourquoi j'ajouterais un peu plus de détails dans cette réponse et montrerais comment je l'ai fait.

Comme @ jjungnickel l'a suggéré, vous devez avoirle Plugin EnvInject installé pour Jenkins. Puis dans le Construire section > Ajouter l'étape de génération, vous aurez l'option "Injecter des variables d'environnement".

Fondamentalement, l'idée est:

  1. ajouter des variables auxquelles vous souhaitez accéder ultérieurement à un fichier (peut être ajouté par un script shell ou elle pourrait être un fichier du système de fichiers).
  2. injectez le fichier avec les variables.
  3. utilisez les variables.

Voici un exemple de configuration:

entrez la description de l'image ici

Puisque je veux les utiliser dans Maven goal, je dois cocher la case Inject Build Variables.

, Puis à la fin de la construction, je supprime le fichier juste parce que je veux garder l'environnement tel qu'il était avant la construction.

0
répondu nyxz 2017-11-29 12:41:04